在server.xml中:
<GlobalNamingResources>
<Resource name="jdbc/ArchiveDB"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.OracleDriver"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
...etc
在web.xml中:
<resource-ref>
<description>Archive Database</description>
<res-ref-name>jdbc/ArchiveDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
我的代码:
Context ic = new InitialContext();
DataSource ds = (DataSource) ic.lookup( "java:/comp/env/jdbc/ArchiveDB" );
我收到以下异常:
java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.BasicDataSource cannot be cast to org.apache.tomcat.jdbc.pool.DataSource
知道我错了什么吗?似乎资源中的工厂字段没有被使用,但我不知道如何找出原因.我有什么想法可以进步吗?
更新1.深入研究源代码,在ResourceFactory.java中找到以下内容
if (ref.getClassName().equals("javax.sql.DataSource")) {
String javaxSqlDataSourceFactoryClassName =
System.getProperty("javax.sql.DataSource.Factory",
Constants.DBCP_DATASOURCE_FACTORY);
我想我必须设置该系统属性,以便它不会恢复为默认值.
更新2.
现在为启动设置了以下内容:
-Djavax.sql.DataSource.Factory=org.apache.tomcat.jdbc.pool.DataSourceFactory
并得到不同的错误:
09-Jun-2011 14:48:20 org.apache.naming.NamingContext lookup
WARNING: Unexpected exception resolving reference
java.sql.SQLException
at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:243)
Caused by: java.lang.NullPointerException
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:236)
... 57 more
javax.naming.NamingException
at org.apache.naming.NamingContext.lookup(NamingContext.java:843)
我想它无法获取我指定的驱动程序信息.
最佳答案 似乎现在正在工作.我认为这是我在Eclipse下调试的一个问题,所以我没有使用我认为我正在使用的server.xml. Eclipse复制tomcat目录下的那个.解决方案是删除并在Eclipse下重新创建以使server.xml中的更改生效.