c3p0 是一個開源的JDBC連接池,它實現了數據源和JNDI綁定,支持JDBC3規范和JDBC2的標準擴展。目前使用它的開源項目有Hibernate,Spring等。
在Spring 中引入c3p0
下載c3p0
c3p0 主頁:http://www.mchange.com/projects/c3p0/
c3p0下載地址:https://sourceforge.net/projects/c3p0/files/latest/download?source=typ_redirect
引入jar
先導入基礎jar
包名 |
---|
commons-logging-1.1.3.jar |
log4j-1.2.17.jar |
spring-beans-4.2.4.RELEASE.jar |
spring-context-4.2.4.RELEASE.jar |
spring-core-4.2.4.RELEASE.jar |
spring-expression-4.2.4.RELEASE.jar |
spring-aop-4.2.4.RELEASE.jar |
spring-expression-4.2.4.RELEASE.jar |
aopalliance-1.0.jar |
aspectjweaver-1.8.9.jar |
spring-aspects-4.2.4.RELEASE |
spring-jdbc-4.2.4.RELEASE.jar |
spring-tx-4.2.4.RELEASE.jar |
導入c3p0jar
包名 |
---|
c3p0-0.9.5.2.jar |
mchange-commons-java-0.2.11.jar |
代碼連接數據庫
ComboPooledDataSource dataSource = new ComboPooledDataSource();
try {
//加載驅動
dataSource.setDriverClass("com.mysql.jdbc.Driver");
//設置數據庫的鏈接地址
dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/spring_db");
//用戶名
dataSource.setUser("root");
//密碼
dataSource.setPassword("root");
} catch (PropertyVetoException e) {
e.printStackTrace();
}
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String sql = "INSERT INTO user_info VALUES(?,?)";
int row = jdbcTemplate.update(sql, "zhangwu", 200);
System.out.println(row);
上面代碼是用c3p0 鏈接數據庫插入一條數據。
spring 配置文件中配置c3p0
在Spring 中XML 中配置c3p0 原理就是依賴注入(IOC)。
下面的代碼是一個例子,在UserDao 中調用JdbcTemplate 向數據庫中插入一條數據,然后又在UserService 中控制UserDao 中的插入動作,下面我們看看具體代碼如何實現。
- UserDao
public class UserDao {
public JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void addUser() {
String sql = "INSERT INTO user_info VALUES(?,?)";
int row = jdbcTemplate.update(sql, "xiaoxin", 20171006);
System.out.println(row);
}
}
- UserService
public class UserService {
public UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void add() {
userDao.addUser();
}
}
- spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
//配置c3p0
<bean id="cPDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/spring_db" />
<property name="user" value="root" />
<property name="password" value="root" />
</bean>
// 將c3p0 注入JdbcTemplate
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="cPDataSource" />
</bean>
//將UserDao 注入UserService
<bean id="userService" class="com.cfox.spring.UserService">
<property name="userDao" ref="userDao" />
</bean>
//將JdbcTemplate 注入UserDao
<bean id="userDao" class="com.cfox.spring.UserDao">
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
</beans>
c3p0 的一些配置
<bean id="cPDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/spring_db" />
<property name="user" value="root" />
<property name="password" value="root" />
<!--連接池中保留的最小連接數。 -->
<property name="minPoolSize" value="10" />
<!--連接池中保留的最大連接數。Default: 15 -->
<property name="maxPoolSize" value="100" />
<!--最大空閑時間,1800秒內未使用則連接被丟棄。若為0則永不丟棄。Default: 0 -->
<property name="maxIdleTime" value="1800" />
<!--當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數。Default: 3 -->
<property name="acquireIncrement" value="3" />
<property name="maxStatements" value="1000" />
<property name="initialPoolSize" value="10" />
<!--每60秒檢查所有連接池中的空閑連接。Default: 0 -->
<property name="idleConnectionTestPeriod" value="60" />
<!--定義在從數據庫獲取新連接失敗后重復嘗試的次數。Default: 30 -->
<property name="acquireRetryAttempts" value="30" />
<property name="breakAfterAcquireFailure" value="true" />
<property name="testConnectionOnCheckout" value="false" />
</bean>