项目迁移到新服务器后出现了好几次数据库dblock,导致执行线程全满,没法处理数据的问题,以前没这个情况。除了从数据库配置着手来看一方面,另一方面c3p0迁移到这个据说性能最好的HiKariCP上来,看看有没有改善。
HikariCP项目主页:
https://github.com/brettwooldridge/HikariCP
文档上列的比较清楚,几个需要注意的地方:
oracle 使用的是odbc驱动自带的pool。不是我们以前常用的oracle.jdbc.driver.OracleDriver,而是oracle.jdbc.pool.OracleDataSource。并且需要使用connectionTestQuery 配置来测试连接是否可用。
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"
destroy-method="shutdown">
<property name="dataSourceClassName" value="oracle.jdbc.pool.OracleDataSource"></property>
<!-- 连接只读数据库时配置为true, 保证安全 -->
<property name="readOnly" value="false" />
<!-- 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒 -->
<property name="connectionTimeout" value="10000" />
<!-- 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟 -->
<property name="idleTimeout" value="120000" />
<!-- 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒,参考MySQL
wait_timeout参数(show variables like '%timeout%';) -->
<property name="maxLifetime" value="240000" />
<!-- 连接池中允许的最大连接数。缺省值:10;推荐的公式:((core_count * 2) + effective_spindle_count) -->
<property name="maximumPoolSize" value="25" />
<property name="connectionTestQuery"
value="/* MyService Health Check */ SELECT 1 from dual" />
<property name="dataSourceProperties">
<props>
<prop key="url">@jdbc_oracle.url@</prop>
<prop key="user">@jdbc_oracle.user@</prop>
<prop key="password">@jdbc_oracle.password@</prop>
</props>
</property>
</bean>
mysql配置就很简单了,注意不需要配置driveClass,和connectionTestQuery
<bean id="mysqlDataSource" class="com.zaxxer.hikari.HikariDataSource"
destroy-method="shutdown">
<!-- <property name="driverClass" value="com.mysql.jdbc.Driver" /> -->
<property name="jdbcUrl" value="@jdbc_mysql.url@">
</property>
<property name="username" value="@jdbc_mysql.user@" />
<property name="password" value="@jdbc_mysql.password@" />
<property name="readOnly" value="false" />
<!-- 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒 -->
<property name="connectionTimeout" value="10000" />
<!-- 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟 -->
<property name="idleTimeout" value="120000" />
<!-- 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒,参考MySQL
wait_timeout参数(show variables like '%timeout%';) -->
<property name="maxLifetime" value="240000" />
<!-- 连接池中允许的最大连接数。缺省值:10;推荐的公式:((core_count * 2) + effective_spindle_count) -->
<property name="maximumPoolSize" value="100" />
<!--<property name="connectionTestQuery" value="/* ping */ SELECT 1" /> -->
<property name="dataSourceProperties">
<props>
<prop key="cachePrepStmts">true</prop>
<prop key="prepStmtCacheSize"> 250</prop>
<prop key="prepStmtCacheSqlLimit">2048</prop>
</props>
</property>
</bean>
目前还在压力测试中,不知道为啥,感觉性能和c3p0比没有很大飞跃,关键是 db lock 能不能解决。