Java 如何在jooq中管理DSLContext?(紧密连接)
这就是我如何实现我想要的每个jooq查询的方法Java 如何在jooq中管理DSLContext?(紧密连接),java,jooq,Java,Jooq,这就是我如何实现我想要的每个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 q
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打开一个连接,因为我封装了每个表的方法(或多或少)。DSLContext
通常不是一个资源,所以您可以让它保持“打开”,也就是说,您可以让垃圾收集器为您收集它
然而,JDBC连接是一种资源,与所有资源一样,您应该始终显式地关闭它。在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
}
。请同时注意
什么时候DSLContext
是资源?
上述情况的一个例外是,当您让您的DSLContext
实例管理连接
本身时,例如通过如下方式传递连接URL:
try (DSLContext ctx = DSL.using("jdbc:url:something", "username", "password")) {
}
在这种情况下,您需要close()
如上所示的DSLContext
,谢谢,我理解请使用参考资料尝试。回答得很好。(jOOQ很棒)调用DSL。将与数据源一起使用算作让“DSLContext
实例管理连接本身”?换句话说,DSL.using(DataSource,sqldial)
是否返回需要关闭的DSLContext
。在幕后,使用了DataSourceConnectionProvider
,并且在每次查询执行后自动关闭连接
,从而产生DataSource
附加到Connection.close()
的任何语义,感谢您的快速回答!因此,如果我使用由数据源创建的DSLContext
,DSLContext.transaction
是否对其主体中的所有查询使用单个JDBC连接
,并在事务结束时关闭它?是的。关于这一点,您几乎可以问一个新的堆栈溢出问题,在这里我可以详细说明一下:)