在探索HikariCP连接池库时,当前在一个应用程序中,我们使用Apache DBCP2提供连接池,它允许通过指定以下属性在连接池级别设置preparestatement缓存:
<property name="poolPreparedStatements" value="true"/>
<property name="maxOpenPreparedStatements" value="20"/>
但是HikariCP在Wiki中清楚地提到,库中不支持该功能,而是依靠相应的jdbc驱动程序来为preparedstatement设置缓存。
由于连接池将在线程之间共享,因此我认为准备状态的连接级别缓存将是解决之道。我不确定jdbcdriver级别的缓存的行为,如果它为preparedstatement进行了某种形式的锁定,引起一些争执?
如果应用程序需要处理大量查询作为日常执行的例程的一部分,那么有什么建议可以解决?
答案 0 :(得分:0)
请注意,PreparedStatement是在连接级别缓存的,使用连接池(在这种情况下为dbcp2)时,由于驱逐,基于设置的空闲超时操作,可以快速创建和关闭连接。
因此,为了正确缓存prepareStatement,我必须设置:
<property name="poolPreparedStatements" value="true"/>
<property name="maxOpenPreparedStatements" value="20"/>
在设置这些值之前,即使我尝试使用PreparedStatement(通过JDBCTemplate),在8个线程的负载下,在具有10000行的同一张表上进行2个查询时,数据库也会对每个查询进行硬解析。
对于HikariCP,我没有机会检查一下行为。