** 数据层spring-dao.xml配置文件中C3P0连接池配置详解**

先放上两种配置文件bean的相关代码,文章下面会有详细的配置属性的讲解, 大家可以自己添加配置和修改配置


普通单一数据库连接池配置

spring-dao.xml部分内容(C3P0连接池部分):

<!-- 或者用其他方法导入jdbc.properties -->
<context:property-placeholder location="classpath:jdbc.properties"/>

 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
       		<!-- 配置连接池属性 -->
       		<property name="driverClass" value="${jdbc.driver}"/>
       		<property name="jdbcUrl" value="${jdbc.url}"/>
       		<property name="user" value="${jdbc.username}"/>
       		<property name="password" value="${jdbc.password}"/>
       		
       		<!-- c3p0连接池的私有属性 -->
       		<property name="maxPoolSize" value="30"/>
       		<property name="minPoolSize" value="10"/>
       		
       		
       		<!-- 关闭连接后不自动commit -->
       		<property name="autoCommitOnClose" value="false"/>
       		
       		<!-- 获取连接超时时间 -->
       		<property name="checkoutTimeout" value="10000"/>
       		
       		<!-- 当获取连接失败重试次数 -->
       		<property name="acquireRetryAttempts" value="2"/>
	</bean>
	```
### `	jdbc.properties配置:`
	
	jdbc.driver=com.mysql.jdbc.Driver
	jdbc.url=jdbc:mysql://自己服务器的ip地址:3306/o2o?useUnicode=true&characterEncoding=utf8
	jdbc.username=root
	jdbc.password=123123123



-----


## C3P0  Mysql主从配置
需要结合   https://blog.51cto.com/12133802/2418323  一起使用
需要结合   https://blog.51cto.com/12133802/2418323  一起使用
需要结合   https://blog.51cto.com/12133802/2418323  一起使用
重要的话说三遍!!!


### spring-dao.xml部分内容(C3P0连接池部分):
   <bean id="dataSource" abstract="true" 
   			class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">

   		
   		<!-- c3p0连接池的私有属性 -->
   		<property name="maxPoolSize" value="30"/>
   		<property name="minPoolSize" value="10"/>
   		
   		
   		<!-- 关闭连接后不自动commit -->
   		<property name="autoCommitOnClose" value="false"/>
   		
   		<!-- 获取连接超时时间 -->
   		<property name="checkoutTimeout" value="10000"/>
   		
   		<!-- 当获取连接失败重试次数 -->
   		<property name="acquireRetryAttempts" value="2"/>
   		
   	</bean>
   	<bean id="master" parent="abstractDataSource">
   		<!-- 配置连接池属性 -->
   		<property name="driverClass" value="${jdbc.driver}"/>
       	<property name="jdbcUrl" value="${jdbc.master.url}"/>
       	<property name="user" value="${jdbc.username}"/>
       	<property name="password" value="${jdbc.password}"/>
   	</bean>
   	<bean id="slave" parent="abstractDataSource">
   		<!-- 配置连接池属性 -->
   		<property name="driverClass" value="${jdbc.driver}"/>
       	<property name="jdbcUrl" value="${jdbc.slave.url}"/>
       	<property name="user" value="${jdbc.username}"/>
       	<property name="password" value="${jdbc.password}"/>
   	</bean>
   	
   	<!-- 配置动态数据源,targetDataSources就是路由数据源所对应的名称 -->
   	<bean id="dynamicDataSource" class="自己编写的类的路径.DynamicDataSource">
   		<property name="targetDataSources">
   			<map>
   				<!-- value-ref中的master是上面bean配置的id,
   						key是DynamicDataSourceHolder和DynamicDataSourceInterceptor中的那个lookupKey -->
   				<entry value-ref="master" key="master"></entry>
   				<entry value-ref="slave" key="slave"></entry>
   			</map>
   		</property>
   	</bean>
   	
   	<!-- 由于我们需要使用sql语句的时候才会决定数据源,所以使用懒加载 -->
   	<bean id="dataSource"
   		class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
   		<property name="targetDataSource">
   			<ref bean="dynamicDataSource"/>
   		</property>
   	</bean>





### mybatis-conf.xml配置:


<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" >

<configuration> <!-- 配置全局属性 --> <settings> <!-- 使用jdbc的getGeneratedKeys获取数据库自增主键值 --> <setting name="useGeneratedKeys" value="true"/>

	<!-- 使用列别名替换列名 默认true -->
	<setting name="useColumnLabel" value="true"/>
	
	<!-- 开启驼峰命名转换:Table{create_time} ->Entity{creatTime} -->
	<setting name="mapUnderscoreToCamelCase" value="true"/>
	
</settings>
<!-- 配置上拦截器,和普通的配置相比多了这个部分 -->
<plugins>
	<plugin interceptor="自己配置的拦截器类的路径.DynamicDataSourceInterceptor"></plugin>
</plugins>

</configuration>

		

		
### jdbc.properties配置:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.master.url=jdbc:mysql://主服务器IP地址:3306/o2o?useUnicode=true&characterEncoding=utf8
jdbc.slave.url=jdbc:mysql://主服务器IP地址:3306/o2o?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=123123123

-----



### 接下来就是C3P0配置的详解了

####  基本配置  :

driverclass: 数据库驱动类

	mysql驱动则为:         com.mysql.jdbc.Driver
	oraclel驱动则为:        oracle.jdbc.driver.OracleDriver
	sqlserver驱动则为:      com.microsoft.sqlserver.jdbc.SQLServerDriver


jdbcUrl: 数据库连接

	mysql连接:jdbc:mysql://IP:端口/数据库名称,
	例子:
	jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&characterEncoding=utf-8
	
	

	oracle连接:jdbc.url=jdbc:oracle:thin:@IP:端口:实例名(sid) 
	例子:
	jdbc:oracle:thin:@127.0.0.1:1521:orcl
	
	
	
	sqlserver连接:jdbc:sqlserver://IP:端口;instanceName=sqlserver2005(版本);DatabaseName=easysite_2005(数据库名称)
	例子:
	jdbc:sqlserver://127.0.0.1:1433;instanceName=sqlserver2005;DatabaseName=easysite_2005


user:登录数据库的账号
password:登录数据库的密码

<property name="user" value="username"/>
<property name="password" value="password"/>

### 私有配置:

c3p0.acquireIncrement=20 默认值为: 3 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数

c3p0.minPoolSize=20 默认值为: 3 连接池中保留的最小连接数

c3p0.maxPoolSize=100 默认值为: 15 接池中保留的最大连接数

c3p0.initialPoolSize=20 默认值为: 3 初始化时获取连接数,取值应在minPoolSize与maxPoolSize之间

c3p0.maxIdleTime=60 默认值为: 0 最大空闲时间,多少秒内未使用则连接被丢弃。若为0则永不丢弃

c3p0.maxStatements=0 默认值为: 0 c3p0全局的PreparedStatements缓存的大小。 如果maxStatements与maxStatementsPerConnection均为0, 则缓存不生效,只要有一个不为0,则语句的缓存就能生效

c3p0.numHelperThreads=10 默认值为: 3 c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。 扩展这些操作可以有效的提升性能通过多线程实现多个操作同时被执行

c3p0.acquireRetryAttempts=5 默认值为: 30 定义在从数据库获取新连接失败后重复尝试的次数。小于等于0表示无限次

c3p0.acquireRetryDelay=300 默认值为: 1000毫秒(ms) 重新尝试的时间间隔

c3p0.checkoutTimeout=3000 获取一个connection超时时间

c3p0.idleConnectionTestPeriod=60 默认值为: 0 每隔多少秒检查所有连接池中的空闲连接

c3p0.automaticTestTable=sys_connectiontest 默认值为: null c3p0将建一张名为改配置项的空表,并使用其自带的查询语句进行测试。 如果定义了这个参数那么属性preferredTestQuery将被忽略。 你不能在这张Test表上进行任何操作,它将只供c3p0测试使用 由于运营平台的数据库用户没有创建表的权限,故需要发sql创建表

c3p0.testConnectionOnCheckin=true 默认值为: false 如果设为true那么在取得连接的同时将校验连接的有效性

c3p0.unreturnedConnectionTimeout=15 一个checkout连接的超时设置,一旦一个checkout连接超时, 他将物理的关闭,而不是返回池中, 主要是防止连接被长期使用不释放,这个设置也是比较危险的