【发布时间】:2010-06-12 21:07:00
【问题描述】:
我试图弄清楚在创建数据库连接时缓存所有语句是否对我有效,或者我是否应该只创建最常用的语句并在需要时创建其他语句。 .
在 all 的客户端线程中创建 all 语句似乎很愚蠢。任何反馈将不胜感激。
【问题讨论】:
标签: java mysql jdbc prepared-statement
我试图弄清楚在创建数据库连接时缓存所有语句是否对我有效,或者我是否应该只创建最常用的语句并在需要时创建其他语句。 .
在 all 的客户端线程中创建 all 语句似乎很愚蠢。任何反馈将不胜感激。
【问题讨论】:
标签: java mysql jdbc prepared-statement
有点像样的数据库已经缓存了它们。在您实际需要执行查询的那一刻,只需触发Connection#prepareStatement()。您实际上也别无选择,因为连接、语句和结果集应该在 尽可能短的范围内被获取和关闭,即在与执行查询相同的方法中的 try-finally 块中。
依次打开和关闭每个查询的连接可能确实很昂贵。一个常见的解决方案是使用connection pool,例如c3p0。
【讨论】:
我觉得你太担心了,准备好的语句已经从多级缓存中受益:
PreparedStatement 对象(并在后续调用连接上的preparedStatement 时返回缓存的PreparedStatement)。所以实际上,我什至会说你可能看错了方向。如果您想设计一个可扩展的解决方案,最佳实践是使用连接池,并且保持连接的时间不要超过所需时间,并在完成后释放它(以释放数据库资源)。
【讨论】:
在我看来,这听起来像是一种过早的优化,除非我有一些信息告诉我它很重要,否则我不会担心。如果您的数据库访问效率低下,我会在考虑缓存准备好的语句之前怀疑您的架构或值访问。
【讨论】: