在多线程环境中,连接池级别的准备语句缓存是否比在 jdbc 驱动程序级别设置缓存更好?

Is preparedstatement cache at connection pool level better than setting cache at jdbc driver level in a multi threaded env?

正在探索 HikariCP 连接池库,目前在一个应用程序中我们使用 Apache DBCP2 提供连接池,它允许通过指定这些属性在连接池级别设置准备好的语句缓存:

<property name="poolPreparedStatements" value="true"/>
<property name="maxOpenPreparedStatements" value="20"/>

但 HikariCP 在 wiki 中明确提到,库中不支持此类功能,而是依赖于相应的 jdbc 驱动程序来为 preparedstatement 设置缓存。

由于连接池将跨线程共享,我认为准备语句的连接级缓存将是可行的方法,我不确定 jdbc 驱动程序级别的缓存行为,如果它确实锁定某种形式的准备陈述,引起一些争论?

如果应用程序需要将大量查询作为每天执行的例程的一部分来处理,有什么建议吗?

请注意,PreparedStatement 是在连接级别缓存的,当使用连接池(在本例中为 dbcp2)时,由于基于设置的逐出、空闲超时操作,连接可以快速创建和关闭。

因此,为了启用 preparedStatement 的正确缓存,我必须设置:

<property name="poolPreparedStatements" value="true"/>
<property name="maxOpenPreparedStatements" value="20"/>

在设置这些之前,即使我尝试使用 preparedStatement(通过 JDBCTemplate),在 8 个线程的负载下测试时,数据库也会对每个查询进行硬解析,其中 2 个查询超过相同的 table 和 10000 行。

对于 HikariCP,我没有机会检查其行为。