我希望我不会因为找不到答案而提出重复的问题。 我收到此错误:
javax.naming.NamingException:在 SerialContext 中查找“jdbc/osclassDB”失败
这就是我所做的:我设置了一个 JDBC 连接池 和一个指向该池的 JDBC 资源(均在 Glassfish 中)。
然后我告诉我的web.xml有一个 JDBC 资源:
<resource-ref>
<res-ref-name>jdbc/osclassDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
然后我尝试在 Servlet 中使用该资源:
Connection connection = null;
try {
InitialContext initialContext = new InitialContext();
//Context dbContext = (Context) initialContext.lookup("java:comp/env");
DataSource dataSource = (DataSource) initialContext.lookup("jdbc/osclassDB");
connection = dataSource.getConnection();
if (connection == null) {
throw new SQLException("Error establishing connection!");
}
// some queries here
}
// catch and finally close connection
但是当我打电话给
Servlet
时,它会抛出 NamingException
并告诉我 Lookup failed for 'jdbc/osclassDB' in SerialContext
我在这里做错了什么?是web.xml吗?我错过了什么吗? 感谢您的帮助!
问题解决了:
第一个,添加一个sun-web.xml,将资源引用从web.xml链接到实际的jndi-name(我在Glassfish上设置的那个)。通常情况下,这应该是没有必要的(Oracle 说),但我还是这么做了 [编辑: 事实证明,这确实没有必要! ]
2nd我遗漏了“jdbc”。在 servlet、web.xml 和 sun-web.xml 中,它现在被称为“osclassDB”(我的资源名称),而不是“jdbc/osclassDB”
现在看起来像这样:
web.xml
<resource-ref>
<res-ref-name>osclassDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
sun-web.xml
<resource-ref>
<res-ref-name>osclassDB</res-ref-name>
<jndi-name>osclassDB</jndi-name>
</resource-ref>
在 servlet 中
Context dbContext = (Context) initialContext.lookup("java:comp/env");
DataSource dataSource = (DataSource) dbContext.lookup("osclassDB");
connection = dataSource.getConnection();
[编辑:] sun-web.xml 确实没有必要
如果您手动编辑您的domain.xml(就像我一样)
<resources>
<jdbc-resource ..
<jdbc-resource pool-name="DataSource" jndi-name="jdbc/myDataSource"></jdbc-resource>
..
确保您还添加了此条目
<servers>
<server config-ref="server-config" name="server">
...
<resource-ref ref="jdbc/myDataSource"></resource-ref>