c3p0数据库连接池
Bean:
package per.ws.bean;
/**
* @Title: User
* @Description: 用户实体类
* @author: wangsai
* @date 2019/8/31 11:12
*/
public class User {
//学生编号
private int id;
//学生姓名
private String name;
public int getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
Test:
package per.ws.connpool;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.Test;
import per.ws.bean.User;
import per.ws.utills.JDBCUtil;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* @Title: C3p0Connpool
* @Description: 数据库连接池的使用
* @author: wangsai
* @date 2019/8/31 10:59
*/
public class C3p0Connpool {
/**
* 使用API配置c3p0数据库连接池,主要是借助于set方法
*/
@Test
public void TestC3p0WithAPI() throws PropertyVetoException, SQLException {
//创建连接池核心工具类,获得c3p0连接池对象
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//设置URL
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/connpooldb?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC");
//设置驱动
dataSource.setDriverClass("com.mysql.jdbc.Driver");
//设置Mysql用户
dataSource.setUser("root");
//设置密码
dataSource.setPassword("617621");
//设置初始连接数
dataSource.setInitialPoolSize(6);
//设置最大连接数
dataSource.setMaxPoolSize(20);
//设置最小的连接数
dataSource.setMinPoolSize(3);
//设置最大空闲时间
dataSource.setMaxIdleTime(60);
//还有很多设置略可以参考:https://blog.csdn.net/fysuccess/article/details/52370906
//从连接池中获取数据库连接
Connection connection = dataSource.getConnection();
//创建sql语句
String sql = "select * from user_tb";
//执行sql预处理
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//返回结果集
ResultSet rs = preparedStatement.executeQuery();
//处理结果集对象
List<User> userList = new ArrayList<User>();
while (rs.next()){
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
userList.add(user);
}
System.out.println(userList);
}
/**
* 使用xml文件配置c3p0数据库连接池
*/
@Test
public void TestC3p0WithXML(){
try {
//能正常使用但是报错未修改
Connection conn = JDBCUtil.getConnection();
System.out.println(conn+"测试输出");
String sql = "insert into user_tb (id,name) values (9,'王欣怡')";
PreparedStatement ps = conn.prepareStatement(sql);
int rs = ps.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
JDBCUtil:
package per.ws.utills;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
/**
* @Title: JDBCUtil
* @Description: c3p0数据库连接池测试(使用XML配置)
* https://www.cnblogs.com/nuccch/p/8120349.html
* https://blog.csdn.net/dzy21/article/details/51952138
* https://blog.csdn.net/chunxiaqiudong5/article/details/52905961
* @author: wangsai
* @date 2019/8/31 15:44
*/
public class JDBCUtil {
private static DataSource dataSource = null;
static {
dataSource = new ComboPooledDataSource("mysql");
}
/**
* 获取数据库连接
*/
public static Connection getConnection() throws SQLException {
Connection conn = null;
conn = dataSource.getConnection();
return conn;
}
/**
* 关闭数据库连接
*/
public static void closeConn(Connection conn) throws SQLException {
if(conn !=null && conn.isClosed() && conn.equals("")){
conn.close();
}
}
}
c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!--配置文件的命名必须为c3p0-config-->
<!--可以使用默认的数据源-->
<!-- This is default config! -->
<!--<default-config>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</default-config>
-->
<!--使用带名字的数据源-->
<!-- This is my config for mysql-->
<named-config name="mysql">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/connpooldb?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC </property>
<property name="user">root</property>
<property name="password">617621</property>
<!-- 初始化连接池中的连接数,取值应在minPoolSize与maxPoolSize之间,默认为3-->
<property name="initialPoolSize">10</property>
<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。默认值: 0 -->
<property name="maxIdleTime">30</property>
<!--连接池中保留的最大连接数。默认值: 15 -->
<property name="maxPoolSize">100</property>
<!-- 连接池中保留的最小连接数,默认为:3-->
<property name="minPoolSize">10</property>
<!--c3p0全局的PreparedStatements缓存的大小。如果maxStatements与maxStatementsPerConnection均为0,则缓存不生效,只要有一个不为0,则语句的缓存就能生效。如果默认值: 0-->
<property name="maxStatements">200</property>
<!-- 当连接池连接耗尽时,客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒。默认: 0 -->
<!--<property name="checkoutTimeout" value="3000"/>-->
<property name="checkoutTimeout">3000</property>
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。默认值: 3 -->
<property name="acquireIncrement">2</property>
<!--定义在从数据库获取新连接失败后重复尝试的次数。默认值: 30 ;小于等于0表示无限次-->
<property name="acquireRetryAttempts">0</property>
<!--重新尝试的时间间隔,默认为:1000毫秒-->
<property name="acquireRetryDelay">1000</property>
<!--关闭连接时,是否提交未提交的事务,默认为false,即关闭连接,回滚未提交的事务 -->
<property name="autoCommitOnClose">false</property>
<!--c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试使用。默认值: null -->
<property name="automaticTestTable">Test</property>
<!--如果为false,则获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常,但是数据源仍有效保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。默认: false-->
<property name="breakAfterAcquireFailure">false</property>
<!--每60秒检查所有连接池中的空闲连接。默认值: 0,不检查 -->
<property name="idleConnectionTestPeriod">60</property>
<!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。默认值: 0 -->
<property name="maxStatementsPerConnection">0</property>
</named-config>
<!-- This is my config for oracle -->
<!-- <named-config name="oracle">
<property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
<property name="jdbcUrl">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="user">scott</property>
<property name="password">liang</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</named-config>-->
</c3p0-config>