【问题标题】:How to manage DSLContext in jooq? (close connection)如何在 jooq 中管理 DSLContext? (紧密连接)
【发布时间】:2015-03-02 15:31:08
【问题描述】:

这就是我实现每个我想要的 jooq 查询的方式。

UtilClass{

 //one per table more or less
 static void methodA(){

  //my method
  Connection con = MySQLConnection.getConexion(); //open
  DSLContext create = DSL.using(con, SQLDialect.MYSQL); //open

  /* my logic and jooq querys */ //The code !!!!!!!

  try {

    if ( con != null )
       con.close(); //close
  } catch (SQLException e) {

  } //close

  con=null; //close
  create=null; //close
 }
}

我在这里工作过度了吗? / 保持上下文和连接打开是否安全?

如果可以安全地将其保持打开状态,我宁愿使用每个 UtilClass 的 1 个静态字段 DSLContext (并且只有注释部分会在我的方法上)。我将为每个 UtilClass 打开一个连接,因为我封装了每个表的方法(或多或少)。

【问题讨论】:

    标签: java jooq


    【解决方案1】:

    DSLContext 通常不是资源,所以你可以让它“打开”,即你可以让垃圾收集器为你收集它。

    然而,JDBC Connection 是一种资源,并且作为所有资源,您应该始终明确地关闭它。在 Java 7+ 中关闭资源的正确方法是使用 try-with-resources 语句:

    static void methodA() {
        try (Connection con = MySQLConnection.getConexion()) {
            DSLContext ctx = DSL.using(con, SQLDialect.MYSQL); //open
    
            /* my logic and jooq queries */
    
            // "ctx" goes out of scope here, and can be garbage-collected
        }   // "con" will be closed here by the try-with-resources statement
     }
    

    More information about the try-with-resources statement can be seen here。另请注意jOOQ tutorial uses the try-with-resources statement when using standalone JDBC connections.

    DSLContext 何时成为资源?

    上述情况的一个例外是当您让DSLContext 实例管理Connection 本身时,例如通过如下方式传递连接 URL:

    try (DSLContext ctx = DSL.using("jdbc:url:something", "username", "password")) {
    }
    

    在这种情况下,您需要close() DSLContext 如上所示

    【讨论】:

    • 谢谢,我了解try 有资源。优秀的答案。 (jOOQ 太棒了)
    • DataSource 调用DSL.using 算作“DSLContext 实例管理Connection 本身”吗?换句话说,DSL.using(DataSource, SQLDialect) 是否返回需要关闭的DSLContext
    • @LaurenceGonsalves:不,它没有。在幕后使用DataSourceConnectionProvider,并且在每次查询执行后自动关闭Connection,从而产生DataSource附加到Connection.close()的任何语义
    • 感谢您的快速回答!因此,如果我使用由DataSource 创建的DSLContextDSLContext.transaction 是否对其正文中的所有查询使用单个 JDBC Connection 并在事务结束时关闭它?
    • 是的。您几乎可以就这个问题提出一个新的 Stack Overflow 问题,我可以在其中详细说明:)
    猜你喜欢
    • 2021-07-22
    • 2020-10-02
    • 2018-04-13
    • 2021-10-19
    • 2016-02-09
    • 2016-02-15
    • 2022-10-06
    • 1970-01-01
    • 2023-02-23
    相关资源
    最近更新 更多