wou*_*non 7 java spring hibernate database-caching hikaricp
我将Hikari与SQL Server 2016和tomcat lib文件夹中的sqljdbc4-2.0.jar一起使用。
我对数据库资源的配置如下:
<Resource name="jdbc/SQLServerDS" auth="Container" type="javax.sql.DataSource"
username="uname"
password="pwd"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://server:port;DatabaseName=dbName"
maxActive="20"
maxIdle="10"
validationQuery="select 1" />
Run Code Online (Sandbox Code Playgroud)
我的数据源配置如下:
@Bean(name = "dataSource")
public DataSource getDataSource() throws NamingException {
HikariConfig config = new HikariConfig();
config.setMaximumPoolSize(20);
config.setDataSourceJNDI("java:comp/env/jdbc/SQLServerDS");
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
config.addDataSourceProperty("useServerPrepStmts", "true");
config.addDataSourceProperty("cacheResultSetMetadata", "true");
config.addDataSourceProperty("useLocalSessionState", "true");
config.addDataSourceProperty("cacheServerConfiguration", "true");
config.addDataSourceProperty("elideSetAutoCommits", "true");
config.addDataSourceProperty("maintainTimeStats", "false");
return new TransactionAwareDataSourceProxy(
new LazyConnectionDataSourceProxy(new HikariDataSource(config)));
}
Run Code Online (Sandbox Code Playgroud)
我如何知道preparestatement缓存是否适用于不同的连接?
我正在将Spring容器管理的事务与hibernate v4.3.10.Final一起使用。
另外,为了使缓存起作用,是否需要启用二级缓存?
HikariCP 实际上不支持PreparedStatement 缓存
其他人提供 PreparedStatement 缓存。HikariCP 没有。为什么?
它被认为是错误的实现
在池化层使用语句缓存是一种反模式,与驱动程序提供的缓存相比,它会对您的应用程序性能产生负面影响。
解释:
在连接池层 PreparedStatements 只能缓存每个连接。如果您的应用程序有 250 个经常执行的查询和一个包含 20 个连接的池,您就会要求您的数据库保留 5000 个查询执行计划——同样,池必须缓存这么多 PreparedStatement 及其相关的对象图。
大多数主要的数据库 JDBC 驱动程序已经有一个可以配置的 Statement 缓存,包括 PostgreSQL、Oracle、Derby、MySQL、DB2 等。JDBC 驱动程序处于利用数据库特定功能的独特位置,并且几乎所有缓存实现都能够跨连接共享执行计划。这意味着与内存中的 5000 条语句和相关的执行计划不同,您的 250 个经常执行的查询会在数据库中产生 250 个执行计划。聪明的实现甚至不会在驱动程序级别的内存中保留 PreparedStatement 对象,而只是将新实例附加到现有计划 ID。
如果你接受它,你不应该尝试\期望缓存 PreparedStatement
如果拒绝,则可以使用C3P0作为连接池
关于hibernate 中的二级缓存,它大多不在连接池中定义,而是使用相关的连接提供程序:
HikariCP 现在有一个用于 Hibernate 4.x 的 ConnectionProvider,称为 HikariConnectionProvider
为了在 Hibernate 4.x 中使用 HikariConnectionProvider,将以下属性添加到您的 hibernate.properties 配置文件中:
Run Code Online (Sandbox Code Playgroud)hibernate.connection.provider_class=com.zaxxer.hikari.hibernate.HikariConnectionProvider
从 Hibernate 4.3.6 开始,有一个来自 Hibernate 的官方 ConnectionProvider 类,应该使用它来代替 HikariCP 实现。该类被称为
org.hibernate.hikaricp.internal.HikariCPConnectionProvider