什么是数据库连接池?
在进行数据库操作时,使用单个的数据库连接非常的耗费资源和时间,使用数据库连接池可以提高性能。
数据库连接池其实就是一个存放了一定数量的Connection对象的链表,当客户端进行数据库连接时,从链表的第一个位置移除一个连接对象,当用户用完的时候将连接对象重新加入链表的末尾。这样连接池中的连接对象就可以重复使用。
数据源配置步骤:
常用的数据源有两种:
DBCP(Database Connection Pool):
> 添加jar包 commons-dbcp-.x.jar commons-pool-x.jar和mysql-connector-java-xxx-bin.jar
> 添加属性资源文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/day13
#数据库的用户名和密码
username=root
password=wency
#连接池中最开始的连接对象数量
initialSize=10
#最大的连接数
maxActive=50
#最小的连接数
maxIdle=20
minIdle=5
#连接的等待时间
maxWait=60000
> 编写数据源工具类
package com.wency.utils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import com.mysql.jdbc.ResultSet;
import com.mysql.jdbc.Statement;
public class DBCPUtils {
private static DataSource ds=null;
static{
Properties pro=new Properties();
try {
pro.load(DBCPUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"));
ds=BasicDataSourceFactory.createDataSource(pro);
} catch (Exception e) {
// TODO Auto-generated catch block
throw new ExceptionInInitializerError("配置文件错误");
}
}
public static Connection getConnection(){
try {
return ds.getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
throw new ExceptionInInitializerError("服务器繁忙,请稍后访问");
}
}
public static void release(Connection conn,PreparedStatement sta,ResultSet rs){
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
conn=null;
}
if(sta!=null){
try {
sta.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sta=null;
}
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
rs=null;
}
}
}
客户端代码:
Connection conn=null;
PreparedStatement ps=null;
conn=DBCPUtils.getConnection();
try {
ps=conn.prepareStatement("insert into student(name,age) values('wency','22'");
ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DBCPUtils.release(conn, ps, null);
}
第二种数据源:c3p0
使用步骤:
1、添加jar包
c3p0-xxx.jar 和mysql-connector-java-xxx-bin.jar
2、编写配置文件
c3p0-config.xml,放在src目录下
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day13</property>
<property name="user">root</property>
<property name="password">wency</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
</default-config>
</c3p0-config>
3.编写c3p0工具类
package com.wency.dbutils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.mysql.jdbc.ResultSet;
public class C3p0Utils {
//创建ComboPooledDataSource对象
private static DataSource dataSource=new ComboPooledDataSource();
//获取连接的方法
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
throw new RuntimeException("服务器出错");
}
}
//获取数据源
public static DataSource getDataSource() {
return dataSource;
}
//释放资源
public static void release(Connection conn,PreparedStatement prsmt,ResultSet rs){
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
conn=null;
}
if(prsmt!=null){
try {
prsmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
prsmt=null;
}
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
rs=null;
}
}
}
4.调用工具类创建连接
Connection conn=null;
PreparedStatement ps=null;
try {
conn=C3p0Utils.getConnection();
ps=conn.prepareStatement("insert into student(name,age) values('wency','22'");
ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
C3p0Utils.release(conn, ps, null);
}