正在探索HikariCP连接池库,当前在我们使用Apache DBCP2提供连接池的应用程序中,它允许通过指定这些属性在连接池级别设置准备好的语句缓存:
<property name="poolPreparedStatements" value="true"/>
<property name="maxOpenPreparedStatements" value="20"/>
但是HikariCP在wiki中明确提到,库中不支持这样的功能,而是依赖相应的jdbc驱动程序来为preparestatement设置缓存。
由于连接池将跨线程共享,我认为准备语句的连接级缓存将是要走的路,我不确定缓存在jdbcdriver级别的行为,如果它为预备语句锁定某种类型,导致一些争用?
如果应用程序需要处理大量查询作为每天执行的例程的一部分,那么将提出哪些建议?
请注意,PreparedStatement在连接级别缓存,当使用连接池(在本例中为dbcp2)时,由于驱逐,基于设置的空闲超时操作,可以快速创建和关闭连接。
因此,为了能够正确缓存preparedStatement,我必须设置:
<property name="poolPreparedStatements" value="true"/>
<property name="maxOpenPreparedStatements" value="20"/>
在设置这些之前,即使我尝试使用preparedStatement(通过JDBCTemplate),数据库也会在8个线程的加载下测试时对每个查询进行硬编码,其中2个查询在10000个行的同一个表上进行。
对于HikariCP,我没有机会检查这种行为。