Java 使用数据源设置JDBC属性

Java 使用数据源设置JDBC属性,java,mysql,jdbc,datasource,Java,Mysql,Jdbc,Datasource,我正在使用DataSource对象连接到mysql数据库 DataSource mysql = (DataSource) context.lookup("jdbc/MySQLDataSource"); Connection conn = mysql.getConnection(); 我想设置属性 rewriteBatchedStatements=true 当我进行批量上传时。我已经看到了一些示例,在人们使用驱动程序管理器时如何做到这一点,如下所示: String myConnectionSt

我正在使用DataSource对象连接到mysql数据库

DataSource mysql = (DataSource) context.lookup("jdbc/MySQLDataSource");
Connection conn = mysql.getConnection();
我想设置属性

rewriteBatchedStatements=true
当我进行批量上传时。我已经看到了一些示例,在人们使用驱动程序管理器时如何做到这一点,如下所示:

String myConnectionString =
    "jdbc:mysql://localhost:3307/mydb?" +
    "useUnicode=true&characterEncoding=UTF-8" +
    "&rewriteBatchedStatements=true";
try (Connection con = DriverManager.getConnection(myConnectionString, "root", "whatever"))

如何使用数据源设置此属性?

如果将数据源强制转换为正在使用的特定实现,则可以使用特定于正在使用的jdbc驱动程序的所有get/set方法

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
//...
MysqlDataSource mysql = (MysqlDataSource) context.lookup("jdbc/MySQLDataSource");
mysql.setRewriteBatchedStatements(true);
Connection conn = mysql.getConnection();

请参阅此链接以获取参考:

添加到@aguibert answer,您也可以在全局级别配置相同的内容,方法是编辑
资源的
url
,如下所示:

<Resource name="jdbc/MySQLDataSource" auth="Container" 
               type="javax.sql.DataSource" 
               driverClassName="com.mysql.jdbc.Driver" 
               url="jdbc:mysql://localhost:3307/mydb?rewriteBatchedStatements=true&amp;useUnicode=true&amp;characterEncoding=UTF-8" 
               username="root" 
               password="root" 
               maxActive="100" 
               maxIdle="20" 
               maxWait="10000"/> 

我通过执行以下步骤解决了此问题:

DataSource datasource = (DataSource) context.lookup("jdbc/MySQLDataSource");
MysqlDataSource mysql_datasource = datasource.unwrap(MysqlDataSource.class);
mysql_datasource.setRewriteBatchedStatements(true);
Connection conn = mysql.getConnection();

当时一切都很顺利。需要这个额外的unwrap()调用,因为我正在glassfish上尝试此操作。查看下面aguibert的答案以了解更多信息。

看起来他已经知道如何在OP中的URL中设置道具。我想他只是想知道是否有办法通过java类实现这一点。另外,您的答案似乎是XML格式。。。可能是今年春天吗?嘿,阿奎伯特,那很好。但是,当我尝试运行该示例时,它最终抛出了以下运行时错误:严重:java.lang.ClassCastException:com.sun.gjc.spi.jdbc40.DataSource40无法强制转换为com.mysql.jdbc.jdbc2.optional.MysqlDataSource有什么想法吗?在这上面什么都找不到@TomO'Brien这里没什么不对的——发生的事情是,看起来您正在使用Glassfish appserver,它将使用自己的“托管连接包装器”包装真正的mysql连接——因此,当您调用unwrap()方法时,它会给您底层的实现对象。由于我的回答确实回答了您最初提出的问题,如果您能将我的回答标记为已接受的答案(或至少进行投票),我将不胜感激。谢谢