当我连接到我的 mysql 数据库时,我的 Web 应用程序试图获取 MysqlDataDatasource。我的应用程序托管在 Apache Tomcat 8.5 网络服务器上。
但是,当我尝试从我的 context.lookup 进行转换时,它会抛出这个 ClassCastException:
java.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);
最佳答案
有一些关于 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;
}
关于mysql - 尝试从 Tomcat BasicDataSource 获取 MysqlDatasource 时出现 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45193612/