我正在使用Spring和JDBC模板来管理数据库访问,但是使用JOOQ构建实际的SQL查询。例如,一个DAO可能如下所示:
public List<DrupalTaxonomyLocationTerm> getLocations(String value, String language) throws DataAccessException {
DSLContext ctx = DSL.using(getJdbcTemplate().getDataSource(), SQLDialect.MYSQL);
SelectQuery q = ctx.selectQuery();
q.addSelect(field("entity_id").as("id"),);
q.addFrom(table("entity").as("e"));
[...]
}
从上面可以看出,我正在使用JOOQ构建和执行查询。 Spring是否仍然负责关闭我从JOOQ返回的ResultSet,或者在我直接访问数据源并将数据源传递给JOOQ时以某种方式“绕过”Spring?
答案 0 :(得分:2)
Spring不会对您DataSource
生成的对象执行任何操作,即Connection
,PreparedStatement
,ResultSet
。从Spring(或通常从DataSource
角度来看),你必须自己做。
然而,jOOQ将始终:
Connection
获取的DataSource
个对象。这在jOOQ的DataSourceConnectionProvider
PreparedStatement
个对象 - 除非您明确告诉jOOQ通过Query.keepStatement()
保持开放引用ResultQuery.fetchXXX()
方法使用对象后立即关闭ResultSet
个对象 - 除非您明确希望与Cursor
ResultQuery.fetchLazy()
按照设计,jOOQ反转了JDBC的默认行为,即保持所有资源的开放,让用户明确地将它们单调地关闭。 jOOQ急切地关闭所有资源(人们95%的时间都这样做),并且允许您明确地保持资源开放,这对性能原因有用。
See this page of the jOOQ manual for differences between jOOQ and JDBC