一、连接池概述
- 什么是连接池?
连接池是装有连接的容器,使用连接的话,可以从连接池中获取,使用完成之后将连接归还给连接池。
- 为什么要学习连接池?
连接对象创建和销毁是需要耗费时间的,在服务器初始化的时候就初始化一些连接,从内存中获取和归还的效率要远远高于创建和销毁的效率(提升性能)。 - 连接池原理?
二、 Druid开源连接池
- 传统连接数据库方法
public void demo1() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//获得连接
conn = DBHelper.getConn();
//编写sql
String sql = "select * from dept";
//预编译sql
ps = conn.prepareStatement(sql);
//执行sql
rs = ps.executeQuery();
while(rs.next()) {
System.out.println(rs.getInt("deptno"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
DBHelper.close(conn, ps, rs);
}
}
- 手动连接Druid的方法
/*
- druid的使用:手动设置参数的方式
*/
public void demo2() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//使用连接池:
DruidDataSource dataSource = new DruidDataSource();
//手动设置数据库连接参数:
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///exercise");
dataSource.setUsername("root");
dataSource.setPassword("root");
//获得连接:
conn = dataSource.getConnection();
//编写sql
String sql = "select * from dept";
//预编译sql
ps = conn.prepareStatement(sql);
//执行sql
rs = ps.executeQuery();
while(rs.next()) {
System.out.println(rs.getInt("deptno")+" "+rs.getString("dname")+" "+rs.getString("loc"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
DBHelper.close(conn, ps, rs);
}
}
- 使用配置的方式连接连接池
/*
* druid的使用:配置方式设置参数
* 使用属性文件配置:文件名称没有规定,但是属性key有规定
*/
public void demo3() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//使用连接池:
//从属性文件中获取:
Properties prop = new Properties();
prop.load(new FileInputStream("src/druid.properties"));
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//获得连接:
conn = dataSource.getConnection();
//编写sql
String sql = "select * from dept";
//预编译sql
ps = conn.prepareStatement(sql);
//执行sql
rs = ps.executeQuery();
while(rs.next()) {
System.out.println(rs.getInt("deptno")+" "+rs.getString("dname")+" "+rs.getString("loc"));
}
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.close(conn, ps, rs);
}
}
- druid工具类
package com.javasm.util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class DruidUtil {
private DruidUtil() {
}
private static DataSource dataSource = null;
static {
try {
Properties p = new Properties();
p.load(DruidUtil.class.getClassLoader().getResourceAsStream("druid.properties"));
DruidDataSourceFactory druidDataSourceFactory = new DruidDataSourceFactory();
dataSource = druidDataSourceFactory.createDataSource(p);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
public static DataSource getDataSource(){
return dataSource;
}
public static void close(Connection connection, Statement statement, ResultSet resultSet) {
// 此处的close是归还而不是关闭
try {
if (resultSet != null) {
resultSet.close();
}
} catch (Exception e) {
e.printStackTrace();
}
try {
if (statement != null) {
statement.close();
}
} catch (Exception e) {
e.printStackTrace();
}
try {
if (connection != null) {
connection.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 配置文件内容:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF8&useSSL=true
username=root
password=root
扩展资料(配置文件中可设置的其他参数):
- 文件目录:
三、C3P0开源连接池
- 手动连接
//手动设置参数的方法
public void demo1() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//创建连接池
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//手动设置参数
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql:///exercise");
dataSource.setUser("root");
dataSource.setPassword("root");
//从连接池中获得连接
conn = dataSource.getConnection();
//编写sql语句
String sql = "select * from dept";
//预编译
ps = conn.prepareStatement(sql);
//接收结果集
rs = ps.executeQuery();
//输出
while(rs.next()) {
System.out.println(rs.getInt("deptno")+" "+rs.getString("dname")+" "+rs.getString("loc"));
}
} catch (PropertyVetoException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBHelper.close(conn, ps, rs);
}
}
- 设置配置文件连接
//设置配置文件的方法
public void demo2(){
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//创建连接池 默认去类路径下查找c3p0-config.xml文件
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//从连接池中获得连接
conn = dataSource.getConnection();
//编写sql语句
String sql = "select * from dept";
//预编译
ps = conn.prepareStatement(sql);
//接收结果集
rs = ps.executeQuery();
//输出
while(rs.next()) {
System.out.println(rs.getInt("deptno")+" "+rs.getString("dname")+" "+rs.getString("loc"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBHelper.close(conn, ps, rs);
}
}
配置文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="dirverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///exercise</property>
<property name="user">root</property>
<property name="password">root</property>
</default-config>
</c3p0-config>
- 文件目录(记得加载mchange-commons-java-0.2.12.jar包,否则会报java.lang.NoClassDefFoundError错误):
四、改写工具类
连接池对象应该是一个应用只创建一次就可以,不需要每次使用都创建一个新的连接池。
- 改写后的工具类代码(C3P0):
public class JDBCUtils{
private static final ComboPooledDataSource dataSource = new ComboPooledDataSource();
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
public static DataSource getDataSource() {
return dataSource;
}
public static void close(Connection conn,PreparedStatement ps,ResultSet rs) {
try {
if(rs != null) rs.close();
if(ps != null) ps.close();
if(conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
测试代码:
//使用新的工具类的测试
public void demo3(){
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//创建连接池 默认去类路径下查找c3p0-config.xml文件
//从连接池中获得连接
conn = JDBCUtils.getConnection();
//编写sql语句
String sql = "select * from dept";
//预编译
ps = conn.prepareStatement(sql);
//接收结果集
rs = ps.executeQuery();
//输出
while(rs.next()) {
System.out.println(rs.getInt("deptno")+" "+rs.getString("dname")+" "+rs.getString("loc"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.close(conn, ps, rs);
}
}