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



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

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

但是HikariCP在wiki中明确提到,库中不支持这种功能,而是依赖于相应的jdbc驱动程序来设置准备语句的缓存。

由于连接池将在线程之间共享,我认为准备好的语句的连接级缓存将是可行的,我不确定jdbcdriver级别的缓存的行为,如果它对准备好的状态进行某种锁定,导致一些争用?

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

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

因此,为了能够正确缓存preparedStatement,我必须设置:

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

在设置这些之前,即使我尝试使用preparedStatement(通过JDBCTemplate(,当在8个线程的负载下测试时,数据库也会硬解析每个查询,在10000行的同一表上有2个查询。

对于HikariCP来说,我没有机会去检查他们的行为。

最新更新