15

例如,我使用 c3p0 和一些定义的“maxStatements”来进行preparedStatement 缓存。这种缓存到底有什么作用?它缓存什么样的数据。在什么级别(数据库,应用程序,..)?从例子中理解它会很好。例如我有一个查询

select * from sometable where somecolumn=?

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

谢谢。

4

2 回答 2

16

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

于 2012-08-27T11:42:22.930 回答
11

John Watts 的回答非常好。

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

语句缓存带来的任何性能优势都取决于数据库/JDBC 驱动程序。要查看语句缓存是否有帮助,请先尝试在关闭语句缓存的情况下分析您的应用程序,然后将 maxStatementsPerConnection 设置为您的应用程序重复使用的准备语句查询的数量。对于某些应用程序/数据库/驱动程序,您会看到显着的好处。对于其他人,您将看不到任何物质利益。

于 2012-08-27T12:06:44.017 回答