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

时间:2012-08-27 11:24:41

标签: java mysql hibernate jdbc c3p0

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

  

从sometable中选择* somecolumn =?

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

感谢。

2 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:8)

John Watts的回答非常好。

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

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