连接池级别的prepare语句缓存比在多线程环境中的jdbc驱动程序级别设置缓存更好吗?

问题描述 投票:1回答:1

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

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

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

由于连接池将跨线程共享,我认为准备语句的连接级缓存将是要走的路,我不确定缓存在jdbcdriver级别的行为,如果它为预备语句锁定某种类型,导致一些争用?

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

spring multithreading connection-pooling hikaricp
1个回答
0
投票

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

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

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

在设置这些之前,即使我尝试使用preparedStatement(通过JDBCTemplate),数据库也会在8个线程的加载下测试时对每个查询进行硬编码,其中2个查询在10000个行的同一个表上进行。

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

© www.soinside.com 2019 - 2024. All rights reserved.