尝试从Tomcat BasicDataSource

时间:2017-07-19 14:28:16

标签: mysql tomcat jdbc

当我连接到我的mysql数据库时,我的Web应用程序正在尝试获取MysqlDataDatasource。我的应用程序托管在Apache Tomcat 8.5 Web服务器上。

但是当我尝试从我的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);

1 个答案:

答案 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;
}