数据库连接池配置说明


    <!-- 阿里巴巴连接池工具 Druid   推荐使用 -->
    <!-- 资料来源:https://www.cnblogs.com/wuyun-blog/p/5679073.html -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"  init-method="init" destroy-method="close"> 
        <property name="driverClassName" value="${jdbc.driverClassName}" /> 
        <property name="url" value="${jdbc.url}" /> 
        <property name="username" value="${jdbc.username}" /> 
        <property name="password" value="${jdbc.password}" /> 
        <!-- 配置初始化大小、最小、最大 --> 
        <property name="initialSize" value="1" /> 
        <property name="minIdle" value="1" /> 
        <property name="maxActive" value="10" />
        <!-- 配置获取连接等待超时的时间,毫秒 --> 
        <property name="maxWait" value="30000" />
        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> 
        <property name="minEvictableIdleTimeMillis" value="300000" />
        <!-- 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。默认为true --> 
        <property name="testOnBorrow" value="true" /> 
        <!-- 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 --> 
        <property name="testOnReturn" value="false" />
        <!-- 验证连接有效与否的SQL,不同的数据配置不同 --> 
        <property name="validationQuery" value="select 1 " />         
        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> 
        <property name="timeBetweenEvictionRunsMillis" value="60000" />
        <property name="testWhileIdle" value="true" />
        <!-- 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。--> 
        <property name="poolPreparedStatements" value="true" /> 
        <!-- 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100 -->
        <property name="maxOpenPreparedStatements"  value="20" />
        <!-- 这里配置提交方式,默认就是TRUE,可以不用配置 -->
        <property name="defaultAutoCommit" value="true" />
        <property name="filters" value="stat" /> 
        <property name="proxyFilters"> 
        <list> 
            <ref bean="logFilter" /> 
        </list> 
        </property> 
    </bean>
    <bean id="logFilter" class="com.alibaba.druid.filter.logging.Slf4jLogFilter"> 
        <property name="statementExecutableSqlLogEnable" value="false" /> 
    </bean>

<!-- Druid 扩展管理功能,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> 
<filter> 
    <filter-name>druidWebStatFilter</filter-name> 
    <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class> 
    <init-param> 
        <param-name>exclusions</param-name> 
        <param-value>/public/*,*.js,*.css,/druid*,*.jsp,*.swf</param-value> 
    </init-param> 
    <init-param> 
        <param-name>principalSessionName</param-name> 
        <param-value>sessionInfo</param-value> 
    </init-param> 
    <init-param> 
        <param-name>profileEnable</param-name> 
        <param-value>true</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>druidWebStatFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping>
 

    <!-- c3p0 连接池工具 -->
    <bean id="labtablesDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        
        <property name="driverClass" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&amp;characterEncoding=UTF-8&amp;sessionVariables=storage_engine=InnoDB" />
        <property name="user" value="test" />
        <property name="password" value="test" />    
        <!--连接池中保留的最大连接数。Default: 20 -->
        <property name="maxPoolSize" value="20" />
        <!--连接池中保留的最小连接数。Default: 20 -->
        <property name="minPoolSize" value="3" />
        <!--初始化时获取连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
        <property name="initialPoolSize" value="3" />        
        <!--当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒。Default: 0 -->
        <property name="checkoutTimeout" value="10000" />                <!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->
        <property name="maxStatements" value="100" />
        <!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 -->
        <property name="maxStatementsPerConnection" value="20" />        
        <!--定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意:测试的表必须在初始数据源的时候就存在。Default: null-->
        <property name="preferredTestQuery" value="select 1"></property>
        <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
        <property name="maxIdleTime" value="3600" />
        <!--每18000秒检查所有连接池中的空闲连接。Default: 0 -->
        <property name="idleConnectionTestPeriod" value="18000" />
        <!--如果设为true那么在取得连接的同时将校验连接的有效性。Default: false -->
        <property name="testConnectionOnCheckin" value="false" />        <!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable等方法来提升连接测试的性能。Default: false -->
        <property name="testConnectionOnCheckout" value="false" />
    </bean>

 

    <!-- dbcp 连接池工具 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&amp;characterEncoding=UTF-8"/>
        <property name="username" value="mysqldev"/>
        <property name="password" value="mysqldev"/>        
        <!-- 连接池启动时创建的初始化连接数量(默认值为0) -->
        <property name="initialSize" value="5" />
        <!-- 连接池中可同时连接的最大的连接数(默认值为8,调整为20,高峰单机器在20并发左右,自己根据应用场景定) -->
        <property name="maxActive" value="20" />
        <!-- 连接池中最大的空闲的连接数,超过的空闲连接将被释放,如果设置为负数表示不限制(默认为8个,maxIdle不能设置太小,因为假如在高负载的情况下,连接的打开时间比关闭的时间快,会引起连接池中idle的个数 上升超过maxIdle,而造成频繁的连接销毁和创建,类似于jvm参数中的Xmx设置) -->
        <property name="maxIdle" value="20" />
        <!-- 连接池中最小的空闲的连接数,低于这个数量会被创建新的连接(默认为0,调整为5,该参数越接近maxIdle,性能越好,因为连接的创建和销毁,都是需要消耗资源的;但是不能太大,因为在机器很空闲的时候,也会创建低于minidle个数的连接,类似于jvm参数中的Xmn设置) -->
        <property name="minIdle" value="5" />
        <!-- 最大等待时间,当没有可用连接时,连接池等待连接释放的最大时间,超过该时间限制会抛出异常,如果设置-1表示无限等待(默认为无限,调整为60000ms,避免因线程池不够用,而导致请求被无限制挂起)-->
        <property name="maxWait" value="60000" />        

        <!-- 开启池的prepared(默认是false,未调整,经过测试,开启后的性能没有关闭的好。) 
        <property name="poolPreparedStatements" value="false"></property> -->
        <!-- 超过removeAbandonedTimeout时间后,是否进 行没用连接(废弃)的回收(默认为false,调整为true) -->
        <property name="removeAbandoned" value="true" />
        <!-- 超过时间限制,回收没有用(废弃)的连接(默认为 300秒,调整为180) -->
        <property name="removeAbandonedTimeout" value="180" />
        <!-- 连接池中连接,在时间段内一直空闲, 被逐出连接池的时间(默认为30分钟,可以适当做调整,需要和后端服务端的策略配置相关)-->
        <property name="minEvictableIdleTimeMillis" value="1800000" /> 
        <!-- 就是在进行borrowObject进行处理时,对拿到的connection进行validateObject校验 -->
        <property name="testOnBorrow" value="true" />
        <!-- 就是在进行returnObject对返回的connection进行validateObject校验 -->
        <property name="testOnReturn" value="true" />
        <!-- 关注的重点,GenericObjectPool中针对pool管理,起了一个Evict的TimerTask定时线程进行控制(可通过设置参数timeBetweenEvictionRunsMillis>0),定时对线程池中的链接进行validateObject校验,对无效的链接进行关闭后,会调用ensureMinIdle,适当建立链接保证最小的minIdle连接数。 -->
        <property name="testWhileIdle" value="true" />
        <!-- 检查的sql -->
        <property name="validationQuery" value="select 1" />
        <!-- 在执行检查时,通过statement设置,statement.setQueryTimeout(validationQueryTimeout)
        <property name="validationQueryTimeout" value="1" /> -->
        <!-- 设置的Evict线程的时间,单位ms,大于0才会开启evict检查线程 -->
        <property name="timeBetweenEvictionRunsMillis" value="3600000" />
        <!-- 每次检查链接的数量,建议设置和maxActive一样大,这样每次可以有效检查所有的链接 -->
        <property name="numTestsPerEvictionRun" value="20" />
    </bean>