mysql - 尝试从 Tomcat BasicDataSource 获取 MysqlDatasource 时出现 ClassCastException

标签 mysql tomcat jdbc

当我连接到我的 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/

相关文章:

php - 帮助限制连接的 mysql 数据库查询

tomcat - 在 Tomcat 中部署应用程序时出现问题

java - 在tomcat中记录所有请求和响应数据

Eclipse 在运行 tomcat 时需要很长时间才能显示断点

java - Statement.executeQuery() 在 MySQL 中执行 SELECT 命令时抛出 java.sql.SQLSyntaxErrorException

java - 如何通过JDBC获取VIEW引用(基表)?

hadoop - 通过SQLDeveloper使用Hive JDBC更改Yarn中的提交用户

mysql - 如何在 mysql 中插入正确的 std 代码

MySql 5.7 json_extract按键

php - 从表中获取发音相似的名字