坚持PreparedStatements是否昂贵? (Java& JDBC)

时间:2010-06-12 21:07:01

标签: java mysql jdbc prepared-statement

我正在试图弄清楚在创建数据库连接时是否有效缓存我的所有语句,或者我是否应该创建最常用的语句,并在需要时创建其他语句。

所有客户端线程中创建所有语句似乎很愚蠢。任何反馈将不胜感激。

3 个答案:

答案 0 :(得分:10)

有点像样的数据库已经缓存了它们。在实际需要执行查询时,只需触发Connection#prepareStatement()。您实际上也没有其他选择,因为应该在最短范围内获取和关闭连接,语句和结果集,即在try-finally块中以与执行时相同的方法查询。

依次打开和关闭每个查询的连接可能确实很昂贵。一个常见的解决方案是使用connection pool,例如c3p0

答案 1 :(得分:4)

我认为你太担心了,准备好的声明已经从几个级别的缓存中受益:

  • 在数据库级别:一个体面的数据库将重用给定预准备语句的访问计划。
  • 在连接池级别:一个不错的连接池将为池中的每个数据库连接缓存PreparedStatement个对象(并在连接上对PreparedStatement的后续调用返回缓存的preparedStatement )。

实际上,我甚至会说你可能会朝错误的方向看。如果要设计可扩展的解决方案,最佳做法是使用连接池,并且不需要比所需更长的连接,并在完成后释放它(以释放数据库资源)。

答案 2 :(得分:2)

这听起来像是一种我不会担心的过早优化,直到我得到一些告诉我重要的信息。如果您的数据库访问效率低下,在考虑缓存预准备语句之前,我会怀疑您的模式或值的访问。