做connection.createStatement().executeQuery(String query);
安全吗,还是应该每个java.sql.Statement
对象在每次使用时都被“手动”创建和关闭,即使连接在finally块中关闭?使用connection.createStatement()。executeQuery(String query);安全吗?
如果通过一个连接在一个方法中执行多个查询,那么如果实例化和关闭每个语句并非严格必要,它将使用更少的代码。
做connection.createStatement().executeQuery(String query);
安全吗,还是应该每个java.sql.Statement
对象在每次使用时都被“手动”创建和关闭,即使连接在finally块中关闭?使用connection.createStatement()。executeQuery(String query);安全吗?
如果通过一个连接在一个方法中执行多个查询,那么如果实例化和关闭每个语句并非严格必要,它将使用更少的代码。
确实,在几乎所有JDBC驱动程序实现中关闭Connection
也隐含地关闭了Statement
。但是,当您使用连接池(并且您想要使用连接池,因为这大大提高了连接性能)时,将不会关闭Connection
,但会将其释放回池中,因此,当您使用连接池时,会出现一个大的但打开Statement
。而当你经常这样做时,迟早你会耗尽资源,这可能会导致你的应用程序被终止。
始终掌握并关闭所有三个资源Connection
,Statement
并在最短的范围ResultSet
,没有任何借口。
将所有样板代码移动到辅助方法/类。
通过这种方式,您可以按照与JDBC(或任何其他有限资源包)文档一致的方式获取/释放资源,并且您的业务逻辑不会被JDBC混乱所污染。
虽然现在看起来对您来说可能很浪费,但将单一查询专用于业务逻辑类中的单个方法没有任何问题。
您能否详细说明最后一点? “将单个查询专用于业务逻辑类中的单个方法没有任何问题。” 我想你是在谈论某种查询包装,但我很好奇你将如何实现一些没有大量参数的类。 – javanix 2010-05-10 22:03:31
@javanix。从你原来的问题来看,你希望用一种方法运行一些SQL命令,并且关心必要的SQL混乱。最后一段提示您可以使用单一方法来运行设置的单个查询并关闭JDBC工件。由于我对您的原始发布的要求一无所知,因此您的情况可能不太实际。另外请记住,巨大的设置或参数可以隐藏在简单界面的具体实现背后。这就是承载国家信息的类别。 – 2010-05-10 22:38:13
是的,没有任何东西会教你使用try/finally,而不是在一天的生产中耗尽资源。 – 2010-05-10 21:47:42
由于懒惰的开发人员不理解,你周六工作的人不能重复使用与池连接相同的语句引用(因此不需要使用游标运行数据库),所以我希望鼓励你注意BalusC的话! – Affe 2010-05-10 21:51:35
啊哈!尽管目前我没有使用连接池(我目前没有真正需要的),但如果我现在关闭并正确使用所有内容并决定在未来。谢谢! – javanix 2010-05-10 21:57:05