我试图让Tomcat使用BoneCP作为连接池,因为DBCP在这里不能正常工作。
我试图将其添加到定义我的Web应用程序的context.xml中,如下所示:
<Context path="/reports" privileged="true" crossContext="true"> <Resource name="jdbc/IKOffice" type="com.jolbox.bonecp.BoneCPDataSource" auth="Container" username="ik" password="******" jdbcUrl="jdbc:postgresql://localhost:5434/IKOffice_Core" lazyInit="true" partitionCount="1" ... more properties ... logStatementsEnabled="false" /> </Context>
但是,当我尝试访问资源时,它总是说:
javax.naming.NamingException: Cannot create resource instance
日志文件中没有错误,并且所有必需的jar都可用于webapp。这里发生了什么?
当我使用如下资源时,一切正常:
<Resource name="jdbc/IKOffice" auth="Container" type="javax.sql.DataSource" username="ik" password="******" driverClassName="org.postgresql.Driver" url="jdbc:postgresql://localhost:5434/IKOffice_Core" maxActive="8" maxIdle="4" />
解:
您必须指定一个BeanFactory,如下所示(第3行):
<Resource name="jdbc/IKOffice" type="jcom.jolbox.bonecp.BoneCPDataSource" factory="org.apache.naming.factory.BeanFactory" auth="Container" ...
Tomcat使用工厂创建JNDI资源。对于有限数量的资源类型(包括javax.sql.DataSource),Tomcat知道可以使用内置工厂。对于未知资源类型(例如jcom.jolbox.bonecp.BoneCPDataSource),您需要指定用于创建资源的工厂。