tomcat忽略了Resource上的'factory'属性

时间:2017-11-11 06:50:13

标签: java tomcat

在我的server.xml中,我正在定义一个资源:

<Resource name="global" auth="Container" type="javax.sql.DataSource"
          maxTotal="100" maxIdle="30" maxWaitMillis="10000"
          username="user" password="betterThanThis"
          factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
          driverClassName="org.apache.derby.jdbc.EmbeddedDriver"
          url="jdbc:derby:memory:test;create=true"/>

在我的webapp context.xml中,我正在链接它:

<ResourceLink name="local"
              auth="Container"
              global="global"
              type="javax.sql.DataSource" />

在我的web.xml中我引用它

<resource-ref>
    <res-ref-name>local</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

在我的代码中,我正在使用它

DataSource ds = InitialContext.doLookup("java:/comp/env/local");
ds.getConnection();

最后一行抛出异常:

java.sql.SQLException: Cannot create JDBC driver of class '' for connect URL 'null'
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2167) ~[tomcat8-dbcp-8.5.14.jar:8.5.14]
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2037) ~[tomcat8-dbcp-8.5.14.jar:8.5.14]
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1543) ~[tomcat8-dbcp-8.5.14.jar:8.5.14]

问题:当我在资源上指定org.apache.tomcat.dbcp.dbcp2时,为什么factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"包中的类会抛出错误?

这不是一个缺少jar的问题,因为我可以在tomcat的日志中看到Derby init。我不认为这是一个命名问题,因为当我更改InitialContext.doLookup("java:/comp/env/local")中的名称时,我收到命名错误。

编辑:请求的完整堆栈跟踪:

java.sql.SQLException: No suitable driver
    at java.sql.DriverManager.getDriver(DriverManager.java:315) ~[na:1.8.0_151]
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2151) ~[tomcat8-dbcp-8.5.14.jar:8.5.14]
    ... 8 common frames omitted
Wrapped by: java.sql.SQLException: Cannot create JDBC driver of class '' for connect URL 'null'
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2167) ~[tomcat8-dbcp-8.5.14.jar:8.5.14]
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2037) ~[tomcat8-dbcp-8.5.14.jar:8.5.14]
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1543) ~[tomcat8-dbcp-8.5.14.jar:8.5.14]
    at com.moosemorals.webmail.Database.getConnection(Database.java:46) ~[classes/:na]
    at com.moosemorals.webmail.Database.getAccountForAlias(Database.java:55) ~[classes/:na]
    at com.moosemorals.webmail.authserver.PostfixLookupServer.lookup(PostfixLookupServer.java:61) ~[classes/:na]
    at com.moosemorals.webmail.authserver.PostfixLookupServer.execute(PostfixLookupServer.java:40) ~[classes/:na]
    at com.moosemorals.webmail.authserver.GenericServer$Client.run(GenericServer.java:151) [classes/:na]

1 个答案:

答案 0 :(得分:0)

它显示“没有合适的驱动程序”,因此您可能缺少一些derby jdbc jar。可能需要将其放入Tomcat lib。