您的位置:首页 > 编程语言 > Java开发

Spring中数据库连接池的配置_me

2015-07-16 16:57 447 查看

BoneCP

一、BoneCP配置文件格式(bonecp-config.xml):

<?xml version="1.0" encoding="UTF-8"?>
<bonecp-config>
  <default-config>
   <!--  -->
 <property name=""></property>
  </default-config> 
</bonecp-config>


二、BoneCP主要配置参数

1.jdbcUrl

设置数据库URL

2.username

设置数据库用户名

3.password

设置数据库密码

4.partitionCount

设置分区个数。这个参数默认为1,建议3-4(根据特定应用程序而定)。

为了减少锁竞争和改善性能,从当前线程分区(thread-affinity)中获取一个connection,

也 就是这个样子:partitions[Thread.currentThread().getId() % partitionCount]。当拥有充足的短期(short-lived)的线程时候,这个参数设置越大,性能越好。当超过一定的阀值时,连接池的维 护工作就可能对性能造成一定的负面影响(仅当分区上的connection使用耗尽时)。

5.maxConnectionsPerPartition

设置每个分区含有connection最大个数。这个参数默认为2。如果小于2,BoneCP将设置为50。

比如:partitionCount设置为3,maxConnectionPerPartition设置为5,你就会拥有总共15个connection。

注意:BoneCP不会将这些connection一起创建出来,而是说在需要更多connection的时候从minConnectionsPerPartition参数开始逐步地增长connection数量。

6.minConnectionsPerPartition

设置每个分区含有connection最大小个数。这个参数默认为0。

7.acquireIncrement

设置分区中的connection增长数量。这个参数默认为1。

当每个分区中的connection大约快用完时,BoneCP动态批量创建connection,

这个属性控制一起创建多少个connection(不会大于maxConnectionsPerPartition)。

注意:这个配置属于每个分区的设置。

8.poolAvailabilityThreshold

设置连接池阀值。这个参数默认为20。如果小于0或是大于100,BoneCP将设置为20。

连接池观察线程(PoolWatchThread)试图为每个分区维护一定数量的可用connection。

这 个数量趋于maxConnectionPerPartition和minConnectionPerPartition之间。这个参数是以百分比的形式来 计算的。例如:设置为20,下面的条件如果成立:Free Connections / MaxConnections < poolAvailabilityThreshold;就会创建出新的connection。

换句话来说连接池为每个分区至少维持20%数量的可用connection。

设置为0时,每当需要connection的时候,连接池就要重新创建新connection,这个时候可能导致应用程序可能会为了获得新connection而小等一会。

9.connectionTimeout

设置获取connection超时的时间。这个参数默认为Long.MAX_VALUE;单位:毫秒。

在调用getConnection获取connection时,获取时间超过了这个参数,就视为超时并报异常。

三、BoneCP线程配置参数

1.releaseHelperThreads

设置connection助手线程个数。这个参数默认为3。如果小于0,BoneCP将设置为3。

设置为0时,应用程序线程被阻塞,直到连接池执行必要地清除和回收connection,并使connection在其它线程可用。

设置大于0时,连接池在每个分区中创建助手线程处理回收关闭后的connection(应用程序会通过助手线程异步地将这个connection放置到一个临时队列中进行处理)。

对于应用程序在每个connection上处理大量工作时非常有用。可能会降低运行速度,不过在高并发的应用中会提高性能。

2.statementReleaseHelperThreads

设置statement助手线程个数。这个参数默认为3。如果小于0,BoneCP将设置为3。

设置为0时,应用程序线程被阻塞,直到连接池或JDBC驱动程序关闭statement。

设置大于0时,连接池会在每个分区中创建助理线程,异步地帮助应用程序关闭statement当应用程序打开了大量的statement是非常有用的。可能会降低运行速度,不过在高并发的应用中会提高性能。

3.maxConnectionAge

设置connection的存活时间。这个参数默认为0,单位:毫秒。设置为0该功能失效。

通 过ConnectionMaxAgeThread观察每个分区中的connection,不管connection是否空闲,如果这个 connection距离创建的时间大于这个参数就会被清除。当前正在使用的connection不受影响,直到返回到连接池再做处理。

4.idleMaxAge

设置connection的空闲存活时间。这个参数默认为60,单位:分钟。设置为0该功能失效。

通过ConnectionTesterThread观察每个分区中的connection,如果这个connection距离最后使用的时间大于这个参数就会被清除。

注意:这个参数仅和idleConnectionTestPeriod搭配使用,而且不要在这里设置任何挑衅的参数!

5.idleConnectionTestPeriod

设置测试connection的间隔时间。这个参数默认为240,单位:分钟。设置为0该功能失效。

通 过ConnectionTesterThread观察每个分区中的connection, 如果这个connection距离最后使用的时间大于这个参数并且距离上一次测试的时间大于这个参数就会向数据库发送一条测试语句,如果执行失败则将这个 connection清除。

注意:这个值仅和idleMaxAge搭配使用,而且不要在这里设置任何挑衅的参数!

四、BoneCP可选配置参数

1.acquireRetryAttempts

设置重新获取连接的次数。这个参数默认为5。

获取某个connection失败之后会多次尝试重新连接,如果在这几次还是失败则放弃。

2.acquireRetryDelay

设置重新获取连接的次数间隔时间。这个参数默认为7000,单位:毫秒。如果小于等于0,BoneCP将设置为1000。

获取connection失败之后再次尝试获取connection的间隔时间。

3.lazyInit

设置连接池初始化功能。这个参数默认为false。

设置为true,连接池将会初始化为空,直到获取第一个connection。

4.statementsCacheSize

设置statement缓存个数。这个参数默认为0。

5.disableJMX

设置是否关闭JMX功能。这个参数默认为false。

6.poolName

设置连接池名字。用于当作JMX和助手线程名字的后缀。

五、BoneCP调试配置参数

1.closeConnectionWatch

设置是开启connection关闭情况监视器功能。这个参数默认为false。

每当调用getConnection()时,都会创建CloseThreadMonitor,监视connection有没有关闭或是关闭了两次。警告:这个参数对连接池性能有很大的负面影响,慎用!仅在调试阶段使用!

2.closeConnectionWatchTimeout

设置关闭connection监视器(CloseThreadMonitor)持续多长时间。这个参数默认为0;单位:毫秒。仅当closeConnectionWatch参数设置为可用时,设置这个参数才会起作用。

设置为0时,永远不关闭。

3.logStatementsEnabled

设置是否开启记录SQL语句功能。这个参数默认是false。

将执行的SQL记录到日志里面(包括参数值)。

4.queryExecuteTimeLimit

设置执行SQL的超时时间。这个参数默认为0;单位:毫秒。

当查询语句执行的时间超过这个参数,执行的情况就会被记录到日志中。

设置为0时,该功能失效。

5.disableConnectionTracking

设置是否关闭connection跟踪功能。这个参数默认为false。

设置为true,连接池则不会监控connection是否严格的关闭;设置为false,则启用跟踪功能(仅追踪通过Spring或一些事务管理等机制确保正确释放connection并放回到连接池中)。

6.transactionRecoveryEnabled

设置事务回放功能。这个参数默认为false。

设置为true时,MemorizeTransactionProxy可以记录所有在connection上操作的情况,当connetion操作失败的时候会自动回放先前的操作,如果在回放期间还是失败,则抛出异常。注意:这个功能会使连接池微弱地降低运行速度。

sping中测试配置用例

<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource"
        destroy-method="close">
        <property name="driverClass" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/sql" />
        <property name="username" value="root" />
        <property name="password" value="" />

        <!-- 设置每个分区含有connection最大个数 -->
        <property name="maxConnectionsPerPartition" value="50" />
        <!-- 设置每个分区含有connection最小个数 -->
        <property name="minConnectionsPerPartition" value="10" />
        <!-- 分区数 ,默认值2,最小1,推荐3-4,视应用而定 -->
        <property name="partitionCount" value="2" />
        <!-- 每次去拿数据库连接的时候一次性要拿几个,默认值:2 -->
        <property name="acquireIncrement" value="5" />
        <!-- 设置连接池阀值 -->
        <property name="poolAvailabilityThreshold" value="30"></property>
        <!-- 缓存prepared statements的大小,默认值:0 -->
        <property name="statementsCacheSize" value="100" />
        <!--BoneCP线程配置参数, 每个分区释放链接助理进程的数量,默认值:3,除非你的一个数据库连接的时间内做了很多工作,不然过多的助理进程会影响你的性能 -->
        <property name="releaseHelperThreads" value="3" />
        <property name="statementReleaseHelperThreads" value="3" />
        <!-- 连接时间 -->
        <property name="connectionTimeout" value="3000"></property>

        <!-- idleConnectionTestPeriod和idleMaxAge两个参数设置失效连接检查的时间,可以解决数据库重启的问题-->
        <!-- 连接池中未使用的链接最大存活时间,单位是分,默认值:60,如果要永远存活设置为0 -->
        <property name="idleMaxAge" value="1" />
        <!-- 检查数据库连接池中空闲连接的间隔时间,单位是分,默认值:240,如果要取消则设置为0 -->
        <property name="idleConnectionTestPeriod" value="1" />
    </bean>


DBCP

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="username" value="root"></property>
        <property name="password" value=""></property>
        <property name="url" value="jdbc:mysql://localhost:3306/sql"></property>
        <!-- 数据库连接池配置 -->
        <!-- maxActive :连接池中可同时连接的最大的连接数(默认值为8,调整为20,高峰单机器在20并发左右,自己根据应用场景定) -->
        <property name="maxActive">
            <value>20</value>
        </property>
        <!-- initialSize :连接池启动时创建的初始化连接数量(默认值为0) -->
        <property name="initialSize" value="1" />
        <!-- 
            maxWait :最大等待时间,当没有可用连接时,连接池等待连接释放的最大时间,超过该时间限制会抛出异常,
             如果设置-1表示无限等待(默认为无限,调整为60000ms,避免因线程池不够用,而导致请求被无限制挂起) 
         -->
        <property name="maxWait" value="60000" />
        <!-- maxIdle:连接池中最大的空闲的连接数,超过的空闲连接将被释放, 连接的打开时间比关闭的时间快,会引起连接池中idle的个数上升超过maxIdle, 
            而造成频繁的连接销毁和创建,类似于jvm参数中的Xmx设置) -->
        <property name="maxIdle" value="20" />
        <!--
             minIdle:连接池中最小的空闲的连接数,低于这个数量会被创建新的连接 
            (默认为0,调整为5,该参数越接近maxIdle,性能越好,因为连接的创建和销毁,
            都是需要消耗资源的; 但是不能太大,因为在机器很空闲的时候,
            也会创建低于minidle个数的连接,类似于jvm参数中的Xmn设置)
         -->
        <property name="minIdle" value="3" />
        <!-- removeAbandoned :超过removeAbandonedTimeout时间后,是否进 行没用连接(废弃)的回收(默认为false,调整为true) -->
        <property name="removeAbandoned" value="true" />
        <!-- removeAbandonedTimeout :超过时间限制,回收没有用(废弃)的连接(默认为 300秒,调整为180) -->
        <property name="removeAbandonedTimeout" value="180" />
        <!-- 
            避免产生Connection Reset的错误,主要解决数据库重启造成的bug 
            在使用DBCP的时候,如果使用默认值,则数据库连接因为某种原因断掉后,
            再从连接池中取得连接又不进行验证,这时取得的连接实际上就会是无效的数据库连接。
            因此为了防止获得的数据库连接失效,在使用的时候最好保证
        -->
        <!-- 取得对象时是否进行验证,检查对象是否有效,默认为false  -->
        <property name="testOnBorrow" value="true" />
        <!-- 验证连接是否成功, SQL SELECT 指令至少要返回一行 -->
        <property name="validationQuery" value="select 1 from dual" />
    </bean>


c3p0

<bean id="targetDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass">
            <value>${datasource.driverClassName}</value>
        </property>
        <property name="jdbcUrl">
            <value>${datasource.url}</value>
        </property>
        <property name="user">
            <value>${datasource.username}</value>
        </property>
        <property name="password">
            <value>${datasource.password}</value>
        </property>
        <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
        <property name="acquireIncrement">
            <value>${c3p0.acquireIncrement}</value>
        </property>
        <!--两次连接中间隔时间,单位毫秒。Default: 1000 -->
        <property name="acquireRetryDelay">
            <value>${c3p0.acquireRetryDelay}</value>
        </property>
        <!--连接关闭时默认将所有未提交的操作回滚。Default: false -->
        <property name="autoCommitOnClose" value="false" />

        <!-- 获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试 
            获取连接失败后该数据源将申明已断开并永久关闭。Default: false -->
        <property name="breakAfterAcquireFailure">
            <value>${c3p0.breakAfterAcquireFailure}</value>
        </property>
        <!-- 当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出 SQLException,如设为0则无限期等待。单位毫秒。Default: 
            0 .这个属性最好保持默认,不然会报错 -->
        <property name="checkoutTimeout" value="0" />
        <!-- 通过实现ConnectionTester或QueryConnectionTester的类来测试连接。类名需制定全路径。 Default: 
            com.mchange.v2.c3p0.impl.DefaultConnectionTester -->
        <property name="connectionTesterClassName">
            <value>com.mchange.v2.c3p0.impl.DefaultConnectionTester</value>
        </property>
        <!-- 指定c3p0 libraries的路径,如果(通常都是这样)在本地即可获得那么无需设置,默认null即可 Default: null -->
        <property name="factoryClassLocation" value="null" />
        <!-- Strongly disrecommended. Setting this to true may lead to subtle and 
            bizarre bugs. (文档原文)作者强烈建议不使用的一个属性 -->
        <property name="forceIgnoreUnresolvedTransactions" value="false" />

        <!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
        <property name="initialPoolSize">
            <value>${c3p0.initialPoolSize}</value>
        </property>
        <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
        <property name="maxIdleTime">
            <value>${c3p0.maxIdleTime}</value>
        </property>
        <!--连接池中保留的最大连接数。Default: 15 -->
        <property name="maxPoolSize">
            <value>${c3p0.maxPoolSize}</value>
        </property>
        <property name="minPoolSize">
            <value>${c3p0.minPoolSize}</value>
        </property>
        <!-- JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements 属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。 
            如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0 -->
        <property name="maxStatements">
            <value>${c3p0.maxStatements}</value>
        </property>
        <!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 -->
        <property name="maxStatementsPerConnection" value="0" />
        <!-- c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能 通过多线程实现多个操作同时被执行。Default: 
            3 -->
        <property name="numHelperThreads">
            <value>${c3p0.numHelperThreads}</value>
        </property>
        <!-- 当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0 的数据源时。Default: 
            null -->
        <property name="overrideDefaultUser" value="root" />
        <!--与overrideDefaultUser参数对应使用的一个参数。Default: null -->
        <property name="overrideDefaultPassword" value="" />

        <!--用户修改系统配置参数执行前最多等待300秒。Default: 300 -->
        <property name="propertyCycle" value="300" />

<!-- 以下选其一即可,可以解决数据库重启的bug -->
        <!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的 时候都将校验其有效性。 建议使用idleConnectionTestPeriod或automaticTestTable 
            等方法来提升连接测试的性能。Default: false -->
        <!-- <property name="testConnectionOnCheckout" value="true" /> -->
        <!-- c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。 如果定义了这个参数那么 属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试 
            使用。Default: null -->
        <!-- <property name="automaticTestTable" value="Test" /> -->
        <!-- 定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。 注意: 测试的表必须在初始数据源的时候就存在。Default: 
            null -->
        <!-- <property name="preferredTestQuery"> <value>select 1 from test</value> 
            </property> -->

        <!--每60秒检查所有连接池中的空闲连接。Default: 0 -->
        <property name="idleConnectionTestPeriod">
            <value>1</value>
        </property>

        <!--如果设为true那么在取得连接的同时将校验连接的有效性。Default: false -->
        <property name="testConnectionOnCheckin" value="true" />

        <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
        <property name="acquireRetryAttempts">
            <value>${c3p0.acquireRetryAttempts}</value>
        </property>

    </bean>

    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
        <property name="targetDataSource">
            <ref local="targetDataSource" />
        </property>
    </bean>


Druid

1.spring中的配置

<bean id="targetDataSource" class="com.alibaba.druid.pool.DruidDataSource"
        init-method="init" destroy-method="close">
        <!-- 基本属性 url、user、password -->
        <property name="url" value="${datasource.url}" />
        <property name="username" value="${datasource.username}" />
        <property name="password" value="${datasource.password}" />
        <!-- 配置初始化大小、最小、最大 -->
        <property name="initialSize" value="${datasource.initialSize}" />
        <property name="minIdle" value="${datasource.minIdle}" />
        <property name="maxActive" value="${datasource.maxActive}" />
        <!-- 配置获取连接等待超时的时间 -->
        <property name="maxWait" value="${datasource.maxWait}" />
        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="${datasource.timeBetweenEvictionRunsMillis}" />
        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="${datasource.minEvictableIdleTimeMillis}" />
        <!-- 测试有效用的SQL Query -->
        <property name="validationQuery" value="${datasource.validationQuery}" />
        <!-- 连接空闲时测试是否有效 -->
        <property name="testWhileIdle" value="true" />
        <!-- 获取连接时测试是否有效 -->
        <property name="testOnBorrow" value="false" />
        <!-- 归还连接时是否测试有效 -->
        <property name="testOnReturn" value="false" />

        <!-- mysql 不支持 poolPreparedStatements -->
        <!-- 是否打开PSCache,并且指定每个连接上PSCache的大小 -->
        <!-- <property name="poolPreparedStatements" value="false" /> <property 
            name="maxPoolPreparedStatementPerConnectionSize" value="20" /> -->
        <!-- 配置监控统计拦截的filters -->
        <property name="filters" value="mergeStat" />
    </bean>

    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
        <property name="targetDataSource">
            <ref local="targetDataSource" />
        </property>
    </bean>


2.内置监控界面使用配置

修改web.xml,加入如下内容:

<servlet>  
    <servlet-name>DruidStatView</servlet-name>  
    <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>  
</servlet>  
<servlet-mapping>  
    <servlet-name>DruidStatView</servlet-name>  
    <url-pattern>/druid/*</url-pattern>  
</servlet-mapping>


然后访问druid/index.html页面

3.通过访问druid/index.html 可以查看项目的运行情况,也可以分析SQL语句的执行情况,便于调优

待续。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: