从C3P0迁移到HiKariCP

项目迁移到新服务器后出现了好几次数据库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 能不能解决。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容