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

2022-09-03 12:46:06

例如,我使用c3p0和一些定义的“maxStatements”进行readyStatement缓存。此缓存的真正用途是什么?它缓存了哪种类型的数据。在哪个级别(数据库、应用程序,..)?从示例中理解它会很好。例如,我有一个查询

从某个位置选择 * 其中 somecolumn=?

现在我将其发送到未缓存的预准备语句中。现在我正在发送它,它被缓存了。有什么区别。在第一个案例和第二个案例中发生了什么。在第一种情况下和第二种情况下,向数据库服务器发送了什么?

谢谢。


答案 1

如果不进行缓存,则每次从连接请求准备语句时,都会获得一个新的准备语句。使用缓存,如果提供相同的 SQL 字符串,则通常会获得完全相同的 ReadyStatement 类型的 Java 对象。如果向 PreparedStatement 提供相同的 SQL,即使使用不同的参数,数据库通常也可以重用执行计划等信息,但前提是您继续使用相同的 PreparedStatement。缓存通过不需要你的应用保留该预准备语句引用本身,使这更容易。


答案 2

约翰·沃茨的回答非常好。

请注意,由于语句缓存是透明的,因此无法提供示例代码:使用它的代码看起来与不透明的代码完全相同。只需在 c3p0 中通过将 maxStatements 和/或 maxStatementsPerConnection 设置为正值来打开语句缓存即可。

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


推荐