在 Tomcat 中使用 oracle 设置 JNDI 数据源

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/8952793/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-10 03:52:50  来源:igfitidea点击:

Setting up JNDI Datasource with oracle in Tomcat

oracletomcatjndi

提问by John

I can't make it work to get connection from DataSource obtained from JNDI in tomcat 7.0, resulting in error like this:

我无法在 tomcat 7.0 中从 JNDI 获得的数据源获取连接,导致错误如下:

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of cla
ss '' for connect URL 'null'

I have done in many ways following the doc and other people suggestions, but still not able to fix it. Here are my settings:

我已经按照文档和其他人的建议在很多方面做了,但仍然无法修复它。这是我的设置:

In web.xml:

在 web.xml 中:

<resource-ref>
    <description>MyDataSource</description>
    <res-ref-name>jdbc/MyDataSource</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref> 

In context.xml:

在 context.xml 中:

<Context>
  <Resource name="jdbc/MyDataSource" auth="Container" type="javax.sql.DataSource"
               maxActive="100" maxIdle="30" maxWait="10000"
               username="abc" password="abc" driverClassName="oracle.jdbc.OracleDriver"
               url="jdbc:oracle:thin:@123.123.123.123:1521:xe"/>
               <!-- // tried both driver class names but all not work driverClassName="oracle.jdbc.driver.OracleDriver" -->
</Context>

Also, I tried to put that in server.xml, also not work

另外,我试图把它放在 server.xml 中,也不起作用

<Resource name="jdbc/MyDataSource" auth="Container" type="javax.sql.DataSource"
    driverClassName="oracle.jdbc.driver.OracleDriver"
    url="jdbc:oracle:thin:@123.123.123.123:1521:xe"
    servicename="MyDataSource"  username="abc" password="abc"
    maxActive="20" maxIdle="10" maxWait="20000"/>

<ResourceParams name="jdbc/MyDataSource">
    <parameter>
        <name>user</name>
        <value>abc</value>
    </parameter>
    <parameter>
        <name>password</name>
        <value>abc</value>
    </parameter>
    <parameter>
        <name>driverClassName</name>
        <value>oracle.jdbc.driver.OracleDriver</value>
    </parameter>
</ResourceParams>

Put classes12.jar as well as ojdbc14.jar in Tomcat 7.0\lib

将 classes12.jar 和 ojdbc14.jar 放在 Tomcat 7.0\lib 中

Can anyone point me the right way?

任何人都可以指出我正确的方法吗?

I wasted so much time on that configuration but still cannot make it work. Thanks in advance!

我在那个配置上浪费了很多时间,但仍然无法让它工作。提前致谢!

John

约翰



Stack Trace as below:

堆栈跟踪如下:

DS: org.apache.tomcat.dbcp.dbcp.BasicDataSource@497062
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
    at DBTest.doGet(DBTest.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
    at sun.jdbc.odbc.JdbcOdbcDriver.getProtocol(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcDriver.knownURL(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcDriver.acceptsURL(Unknown Source)
    at java.sql.DriverManager.getDriver(Unknown Source)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1437)
    ... 21 more

And here is the code, exception at ds.getConnection. (It is not typical way to get DS, bcoz need to match WebSphere way...)

这是代码,ds.getConnection 处的异常。(这不是获得 DS 的典型方式,bcoz 需要匹配 WebSphere 方式...)

Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory");
initCtx = new InitialContext(env);
DataSource ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/MyDataSource");
System.err.println("DS: " + ds.toString());
Connection conn = ds.getConnection();

回答by Cody Cusic

I realized that I defined the resource twice, once in my TOMCAT_HOME/conf/context.xml and in my applicationPath/META-INF/context.xml. Once I removed the resource from TOMCAT_HOME/conf/context.xml everything worked great.

我意识到我定义了资源两次,一次在我的 TOMCAT_HOME/conf/context.xml 和我的 applicationPath/META-INF/context.xml。一旦我从 TOMCAT_HOME/conf/context.xml 中删除了资源,一切都很好。