spring mvc jdbc配置c3p0详细配置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring mvc jdbc配置c3p0详细配置相关的知识,希望对你有一定的参考价值。

求Spring mvc配置c3p0详细配置和所需要的jar包

<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>

本文将对sdkservice生产环境上c3p0正在使用的各项配置进行详细解释,旨在为c3p0的配置提供参考标准。
sdkservice生成环境的配置如下:
#当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3
c3p0.acquireIncrement=20
#初始化时获取连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3

c3p0.initialPoolSize=20
#连接池中保留的最小连接数,默认为:3
c3p0.minPoolSize=20
#连接池中保留的最大连接数。默认值: 15
c3p0.maxPoolSize=100
#最大空闲时间,多少秒内未使用则连接被丢弃。若为0则永不丢弃。默认值: 0
c3p0.maxIdleTime=60
#c3p0全局的PreparedStatements缓存的大小。如果maxStatements与maxStatementsPerConnection均为0,则缓存不生效,只要有一个不为0,则语句的缓存就能生效。如果默认值: 0
c3p0.maxStatements=0
#c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能通过多线程实现多个操作同时被执行。Default: 3
c3p0.numHelperThreads=10
#定义在从数据库获取新连接失败后重复尝试的次数。默认值: 30 ;小于等于0表示无限次

c3p0.acquireRetryAttempts=5
#重新尝试的时间间隔,默认为:1000毫秒
c3p0.acquireRetryDelay=300
#获取一个connection需要的时间,单位毫秒
c3p0.checkoutTimeout=3000
#每隔多少秒检查所有连接池中的空闲连接。Default: 0

c3p0. idleConnectionTestPeriod=60
#c3p0将建一张名为改配置项的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么属性preferredTestQuery将#被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试使用。默认值: null。由于运营平台的数据库用户没有创建表的权限,故需要发sql创建表。
c3p0.automaticTestTable=sys_connectiontest
#如果设为true那么在取得连接的同时将校验连接的有效性。Default: false
c3p0.testConnectionOnCheckin=true
#一个checkout连接的超时设置,一旦一个checkout连接超时,他将物理的关闭,而不是返回池中,主要是防止连接被长期使用不释放,这个设置也是比较危险的
c3p0.unreturnedConnectionTimeout=15

下面分块解释各配置项值的由来。
基础连接池配置:
maxPoolSize最大连接数在满足应用需要的情况下,参考默认值15,越小越好。由于sdkservice多次出现连接数不够的情况,该值也越改越大。现已改为100。
minPoolSize最小连接数需要小于等于最大连接数,参考默认值3,越小越好。同maxPoolSize的原因, 现已改为20。
initialPoolSize初始化连接数需要在最大和最小连接数之间,否则会被最小连接数的值替换,参考默认值3。 同maxPoolSize的原因, 现已改为20。
acquireIncrement连接耗尽时一次获取的连接数,参考默认值3,由于sdkservice用到的mysql proxy在连接不够进行扩容时,会出现获取连接失败的异常,所以将acquireIncrement的值设置较大,以减少mysql proxy的扩容异常。
maxIdleTime最大空闲时间,该时间内未使用,则丢弃。设置为60秒。

Statement连接池配置:
maxStatements每个连接缓存PreparedStatement的数量。在使用Statement缓存时,可能出现下列异常:

APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
c3p0在同时关闭statement和connection的时候,或者关闭他们之间的时间很短的时候,有时候connection并没有被关闭,因为有些preparedstatement还在被cached住。参考c3p0的作者所言:
http://forum.hibernate.org/viewtopic.php?t=947246&highlight=apparent+deadlock+c3p0
推荐配置maxStaments值为0,同时不要设置maxStatementsPerConnection,否则会缓存无限个 Statement。在性能优先的应用中可以设置maxStaments。

连接池重试配置:
acquireRetryAttempts重试获取连接的次数,设置为5次。
acquireRetryDelay两次获取连接时间间隔,设置为300毫秒。

连接池连接测试配置:
idleConnectionTestPeriod 检查空闲连接时间间隔。设置为60秒。

automaticTestTable测试连接的表名,会执行该表的查询语句。不要在此表上进行任何操作。设置为sys_connectiontest。建表语句为:

DROP TABLE IF EXISTS `sys_connectiontest`;
CREATE TABLE `sys_connectiontest` (
`a` char(1) NOT NULL,
PRIMARY KEY (`a`)
)

testConnectionOnCheckin连接使用完后,检查其有效性。设置为true。

调试参数:
unreturnedConnectionTimeout获取连接后,多少秒未执行完或是忘记关闭,则销毁连接。虽然该参数是调试参数,但sdkservice的服务最长为15秒,超时则失败,故在15秒后,直接销毁连接也不会影响服务。设置为服务的最长超时时间15秒。
其他连接池配置:
numHelperThreads数据源的处理线程数,参考默认值3,当有挂起的任务,负载太高导致性能下降时,可以加大该值。现为10。

checkoutTimeout获取一个连接的超时时间,设置为3000毫秒
备注:
1、sdkservice服务最大的超时时间是15秒。如果checkoutTimeout获取连接3秒超时,则等acquireRetryDelay的0.3秒,重新
获取,循环此过程5次,整个世间16.5秒,如果仍获取连接失败,也不影响服务的调用,因为此时服务已经失败。
2、连接是否可用测试,不要用testConnectionOnCheckout,严重影响性能。通过testConnectionOnCheckin和idleConnectionTestPeriod,配合automaticTestTable来检查,它们是异步的,不会影响性能。
测试:
SDK的修改项:
acquireIncrement:3->20

initialPoolSize:3->20

minPoolSize:2->20

maxPoolSize:200->100

SDK的新增项:
3p0.acquireRetryAttempts=5
c3p0.acquireRetryDelay=300
c3p0.testConnectionOnCheckin=true
c3p0.automaticTestTable=sys_connectiontest
c3p0.checkoutTimeout=3000
c3p0.unreturnedConnectionTimeout=15
针对修改项,在确认平台进行压力测试,性能相差不大,平台稳定。
添加unreturnedConnectionTimeout项,在确认平台,访问有执行时间超过15s的sql的jsp,在执行到15秒时,返回空的结果。数据库连接断开,后台有异常信息抛出。
添加的其他项,压测过程中,封连接数据库的端口,5s后打开。不会有失败的事务。
参考技术A 您好,我这里有。你可以加下我的QQ发给你。1179579918 前提是你要采纳

以上是关于spring mvc jdbc配置c3p0详细配置的主要内容,如果未能解决你的问题,请参考以下文章

C3P0连接池配置

Maven 工程下 Spring MVC 站点配置 C3P0连接池与@Autowired的应用

Spring-JDBC配置

spring boot整合mybatis深坑之c3p0的详细配置

C3P0的详细配置说明(com.mchange.v2.c3p0.ComboPooledDataSource)

如何配置 JavaMelody 以监控 C3p0 数据源中的 Jdbc 连接