【问题标题】:Setting JDBC Properties Using DataSource使用 DataSource 设置 JDBC 属性
【发布时间】:2015-10-01 18:42:35
【问题描述】:

我正在使用 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 设置此属性?

【问题讨论】:

    标签: java mysql jdbc datasource


    【解决方案1】:

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

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

    参考此链接:http://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html

    【讨论】:

    • 嘿 Aguibert,编译得很好。但是,当我尝试运行该示例时,它最终引发了以下运行时错误:严重:java.lang.ClassCastException:com.sun.gjc.spi.jdbc40.DataSource40 无法转换为 com.mysql.jdbc.jdbc2.optional .MysqlDataSource 有什么想法吗?似乎在任何地方都找不到任何东西!
    • @TomO'Brien 这里没什么问题——看起来你正在使用 Glassfish 应用服务器,它将用它自己的“托管连接包装器”包装真正的 mysql 连接——因此,为什么当您调用 unwrap() 方法时,它会为您提供底层实现对象。由于我的回答确实回答了您最初提出的问题,因此如果您能将我的回答标记为已接受的答案(或至少给它一个赞成票),我将不胜感激。谢谢!
    【解决方案2】:

    添加到@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"/> 
    

    【讨论】:

    • 看来他已经弄清楚了如何在 OP 中的 URL 中设置 props。我想他只是想知道是否有办法通过 java 类来做到这一点。另外,这看起来你的答案是 XML 格式......也许是这个春天?
    【解决方案3】:

    我已经通过以下步骤解决了这个问题:

    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 的答案以获取更多信息。

    【讨论】:

      猜你喜欢
      • 2017-01-11
      • 2018-10-03
      • 2020-12-24
      • 1970-01-01
      • 2014-12-15
      • 2011-08-29
      • 1970-01-01
      • 2016-06-29
      • 2018-09-26
      相关资源
      最近更新 更多