【问题标题】:Is it expensive to hold on to PreparedStatements? (Java & JDBC)坚持 PreparedStatements 成本高吗? (Java & JDBC)
【发布时间】:2010-06-12 21:07:00
【问题描述】:

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

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

【问题讨论】:

    标签: java mysql jdbc prepared-statement


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我觉得你太担心了,准备好的语句已经从多级缓存中受益:

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

      所以实际上,我什至会说你可能看错了方向。如果您想设计一个可扩展的解决方案,最佳实践是使用连接池,并且保持连接的时间不要超过所需时间,并在完成后释放它(以释放数据库资源)。

      【讨论】:

        【解决方案3】:

        在我看来,这听起来像是一种过早的优化,除非我有一些信息告诉我它很重要,否则我不会担心。如果您的数据库访问效率低下,我会在考虑缓存准备好的语句之前怀疑您的架构或值访问。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-20
          相关资源
          最近更新 更多