我使用 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?
最佳答案
Spring 不会对从 DataSource
生成的对象执行任何操作,即 Connection
、PreparedStatement
、ResultSet
>。从 Spring(或者通常从 DataSource
角度)来看,您必须自己执行此操作。
但是,jOOQ 始终会:
- 关闭从
DataSource
获取的Connection
对象。这记录在 jOOQ 的DataSourceConnectionProvider
中 - 在执行
PreparedStatement
对象后立即关闭它们 - 除非您通过Query.keepStatement()
明确告诉jOOQ保持开放引用 - 通过任何
ResultQuery.fetchXXX()
使用ResultSet
对象后立即关闭它们方法 - 除非您明确想要保持开放Cursor
与ResultQuery.fetchLazy()
按照设计,jOOQ 与 JDBC 的默认行为相反,即保持所有资源打开并让用户显式地单调地关闭它们。 jOOQ 急切地关闭所有资源(这是人们 95% 的时间所做的),并允许您在出于性能原因有用的情况下显式保持资源打开。
See this page of the jOOQ manual for differences between jOOQ and JDBC .
关于java - Spring & JDBCTemplate : are resources automatically closed when using the underlying datasource?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24888042/