当我连接到我的mysql数据库时,我的Web应用程序正在尝试获取MysqlDataDatasource。我的应用程序托管在Apache Tomcat 8.5 Web服务器上。
但是当我尝试从我的context.lookup:
进行强制转换时,它会抛出此ClassCastExceptionjava.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp2.BasicDataSource
cannot be cast to com.mysql.jdbc.jdbc2.optional.MysqlDataSource
以下是演员表失败的行:
MysqlDatasource mysql_datasource =
(MysqlDataSource) context.lookup("java:/comp/env/jdbc/MySQLDataSource");
这是我的context.xml配置:
<Resource name="jdbc/MySQLDataSource" auth="Container" type="javax.sql.DataSource"
username="root" password="password" maxTotal="100" maxIdle="30" maxWaitMillis="10000"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/pododdle"/>
这是我的web.xml配置:
<resource-ref>
<description>Pododdle DB Connection</description>
<res-ref-name>jdbc/MySQLDataSource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
任何人都知道这里的问题是什么,我怎样才能掌握所有重要且最难以捉摸的com.mysql.jdbc.jdbc2.optional.MysqlDataSource?所有人都非常感谢!
PS:以前我在glassfish 4服务器上托管我的应用程序,并使用以下代码获取MysqlDatasource:
Datasource datasource = (DataSource) context.lookup("jdbc/MySQLDataSource");
MysqlDataSource mysql_datasource = datasource.unwrap(MysqlDataSource.class);
答案 0 :(得分:2)
有一些关于tomcat8上下文的文档。 tomcat默认使用Apache Commons DBCP池。
因此,当您在tomcat中调用context.lookup("jdbc/MySQLDataSource")
时,默认情况下它将返回BasicDataSource
,无法直接将其转换为MysqlDataSource。
如果你想获得一个MysqlDataSource
,这将是有效的。(添加一个方法来复制名称/密码/ url ...到你的目标DataSource和newInstance它)
void yourmethod(){
//...
BasicDataSource ds = (BasicDataSource)context.lookup("jdbc/MySQLDataSource");
MysqlDataSource mysqlDs = unwrap(ds);
//...
}
protected MysqlDataSource unwrap(BasicDataSource ds){
MysqlDataSource mysqlDs = new MysqlDataSource();
mysqlDs.setUser(ds.getUsername());
mysqlDs.setPassword(ds.getPassword());
mysqlDs.setURL(ds.getUrl());
// copy more properties
return mysqlDs;
}