Hikari CP 支持PreparedStatements 缓存吗?

hen*_*-jo 2 mysql spring jdbc prepared-statement hikaricp

我在这个stackoverflow答案(/sf/answers/3943551321/)上看到hikari不支持PreparedStatement缓存。

我也在 Hikari CP 文档中看到了它。

许多连接池,包括 Apache DBCP、Vibur、c3p0 等都提供PreparedStatement 缓存。HikariCP 没有。为什么?

但是,Hikari cp文档的示例代码中设置了准备好的语句缓存。(https://github.com/brettwooldridge/HikariCP#rocket-initialization

HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/simpsons");
config.setUsername("bart");
config.setPassword("51mp50n");
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");

HikariDataSource ds = new HikariDataSource(config);
Run Code Online (Sandbox Code Playgroud)

Hikari说不支持缓存,但是为什么我可以配置缓存呢?上面是什么cachePrepStmts意思?

M. *_*num 6

许多连接池,包括 Apache DBCP、Vibur、c3p0 等都提供PreparedStatement 缓存。HikariCP 没有。为什么?

Hikari本身不支持/提供缓存,它将缓存委托给正在使用的底层数据源,在本例中为 MySQL 数据源。这些属性直接在底层 MySQL 数据源上设置以进行缓存。例如,这些设置不适用于 Postgres(它们在那里有不同的名称)。Hikari“只是”一个连接池,仅此而已,它委托给底层使用的数据源/jdbc 驱动程序的其他所有内容。

如果您阅读文档,其中也有解释。

在连接池层,PreparedStatement 只能针对每个连接进行缓存。如果您的应用程序有 250 个常用执行的查询和一个包含 20 个连接的池,那么您会要求数据库保存 5000 个查询执行计划——同样,池必须缓存这么多的PreparedStatements 及其相关的对象图。

大多数主要数据库 JDBC 驱动程序都已经具有可配置的语句缓存,包括 PostgreSQL、Oracle、Derby、MySQL、DB2 等。JDBC 驱动程序在利用数据库特定功能方面处于独特的地位,并且几乎所有缓存实现都能够跨连接共享执行计划。这意味着,您的 250 个常用查询会在数据库中生成 250 个执行计划,而不是内存中的 5000 个语句和关联的执行计划。聪明的实现甚至不会在驱动程序级别的内存中保留PreparedStatement对象,而只是将新实例附加到现有的计划ID。

这是文档中的部分,突出显示的部分准确解释了为什么 Hikari 本身不提供缓存而是将其委托给正在使用的驱动程序。