PreparedStatement缓存 - 它是什么意思(它是如何工作的)

ads*_*bum 12 java mysql hibernate jdbc c3p0

我正在使用例如c3p0,其中一些已定义的"maxStatements"用于prepareStatement缓存.这个缓存真正做了什么?它缓存了什么样的数据.在什么级别(db,application,..)?从例子中理解它会很好.例如,我有一个查询

select some from sometable where somecolumn =?

现在我将它发送到未缓存的预准备语句中.现在我发送它并且它被缓存了.有什么区别.第一种情况和第二种情况发生了什么.在第一种情况下和第二种情况下发送到DB服务器的是什么?

谢谢.

Joh*_*tts 11

如果没有缓存,每次从Connection请求时都会得到一个新的PreparedStatement.通过缓存,如果提供相同的SQL字符串,您将经常获得与PreparedStatement类型完全相同的Java对象.如果为PreparedStatement提供相同的SQL,即使使用不同的参数,数据库通常也可以重用执行计划等信息,但前提是您继续使用相同的PreparedStatement.通过不要求您的应用程序保留PreparedStatement引用本身,缓存使这变得更容易.


Ste*_*man 8

John Watts的回答非常好.

请注意,没有可以提供的示例代码,因为语句缓存是透明的:使用它的代码看起来就像没有代码的代码.您只需在c3p0中打开语句缓存,方法是将maxStatements和/或maxStatementsPerConnection设置为正值.

语句缓存的任何性能优势都依赖于数据库/ JDBC驱动程序.要查看语句缓存是否有帮助,请尝试首先使用语句缓存关闭应用程序,然后将maxStatementsPerConnection设置为应用程序重复使用的预准备语句查询数.对于某些应用程序/数据库/驱动程序,您将看到一个重要的好处.对于其他人,您不会看到任何实质性的好处.

  • 最简单的做法是使用 `maxStatementsPerConnection` 并将其设置为应用程序_经常使用_的 PreparedStatements 数量。(即忽略在应用程序初始化时使用的语句,或者不常用于管理目的等的语句)如果您的应用程序总是按顺序执行 100 个不同的 PreparedStatements 那么,当然,尝试将 `maxStatementsPerConnection` 设置为 100,但存在风险这样做的内存和资源占用将超过任何好处,没有它你会过得更好。你得看看。 (2认同)
  • @j23有一条经验法则:永远不要在不稳定的数据库对象(表、视图、函数等)上使用语句缓存(即更改表、删除列等),因为语句缓存将开始出现诸如此类的问题如列类型不匹配、绑定值不匹配等。 (2认同)