使用 DataSource 设置 JDBC 属性

Setting JDBC Properties Using DataSource

我正在使用 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"))

如何使用 DataSource 设置此 属性?

如果您将数据源转换为您正在使用的特定实现,您将能够使用所有特定于您正在使用的 jdbc 驱动程序的 get/set 方法。

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

参考这个link:http://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html

添加到@aguibert 的回答中,您也可以在全局级别配置相同的内容,方法是编辑您的 Resource 名称的 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 的回答以获取更多信息。