【发布时间】:2010-07-26 10:53:11
【问题描述】:
通常的建议是在不再需要 JDBC 资源时关闭它们。这可以在 catch 和 finally 中完成。但是,如果 DAO 方法只操作一个域对象,而一个操作需要一次性检索/创建其中的几个呢?获得一份声明然后反复关闭它会成为性能方面的问题吗?如果是这样,是否应该使用单独的方法一次性处理多个对象,还是应该以某种方式延迟关闭?
【问题讨论】:
通常的建议是在不再需要 JDBC 资源时关闭它们。这可以在 catch 和 finally 中完成。但是,如果 DAO 方法只操作一个域对象,而一个操作需要一次性检索/创建其中的几个呢?获得一份声明然后反复关闭它会成为性能方面的问题吗?如果是这样,是否应该使用单独的方法一次性处理多个对象,还是应该以某种方式延迟关闭?
【问题讨论】:
您可以在 DAO 层之上添加一个额外的事务层,并在事务/会话开始时在 Connection 上调用 setAutoCommit(false),让 DAO 方法使用相同的 Connection 实例,然后使用 @987654324 @Connection 当事务/会话完成/关闭时。但是,您需要更改 DAO 方法以将 Connection 作为额外参数,或将其存储为 ThreadLocal(但需要非常小心地完成,因为线程可能会被池化)。
只要您一直使用PreparedStatement,创建语句不应该那么昂贵,通常在数据库端编译和缓存。
【讨论】:
我认为应用程序是否基于 Dao 没有区别。这些资源应该关闭。如果您在没有任何框架(spring、hibernate 等)的情况下工作
如果有池,java.sql.Connection 应该放回池中。 ResultSet 和 Statement 对象应在执行查询后关闭。
根据您的架构,这些资源管理代码可以放在 Dao 类或其他类中。例如,有些课程专注于构建和执行 sql 查询。资源管理代码可能在这些类中。
如果你使用一些框架,框架通常会为你做资源管理。
【讨论】: