数据库连接池——C3P0&Druid
(一) 数据库连接池
每一个事物都有其存在的意义,在初学jdbc的时候,我们建立数据库连接对象后,会对其进行释放,但是数据库连接的建立和关闭是非常消耗资源的,而且频繁的操作会使得性能变得低下,数据库连接池可以帮我们解决这样的问题
(1) 概念
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
简单理解:就是一个存放数据库连接的容器,当用户需要访问数据库的时候,容器提供连接对象给用户用,之后用户将连接对象归还给容器
(2) 使用
A:实现 javax.sql 包下的 DataSource 接口
- 方法:获取连接:
getConnection()
- 方法:归还连接:
Connection.close()
注意:在连接池中使用connection.close()方法,不代表关闭连接,代表归还连接
B:我们可以使用一些开源的数据库厂商提供的实现
- C3P0
- Druid (来自阿里巴巴)
(3) C3P0
A:首先导入三个jar包 c3p0-0.9.5.2.jar 、mchange-commons-java-0.2.12.jar、数据库驱动jar包
B:修改配置文件
C:创建数据库连接池对象——ComboPooledDataSource()
D:获取连接——getConnection()
package cn.ideal.datasource.c3p0;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class C3P0Demo {
private static DataSource comboPooledDataSource = null;
static{
//不指定则使用默认XML配置
//数据库连接池对象 ComboPooledDataSource
comboPooledDataSource = new ComboPooledDataSource();
}
public static Connection getConnection() throws SQLException {
//获取连接
return comboPooledDataSource.getConnection();
}
public static void main(String[] args) throws SQLException {
System.out.println(getConnection());
}
}
//测试输出日志及内容
(4) Druid
package cn.ideal.datasource.druid;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;
public class DruidDemo {
public static void main(String[] args) throws Exception {
//加载配置文件
Properties pro = new Properties();
InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
//获取连接
Connection connection =ds.getConnection();
System.out.println(connection);
}
}
试着用Druid写一个工具类
package cn.ideal.datasource.utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JDBCUtils {
private static DataSource ds = null;
static {
//加载配置文件
Properties properties = new Properties();
try {
properties.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
ds = DruidDataSourceFactory.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
/**
* 释放资源
*/
public static void close(Statement statement, Connection connection) {
close(null, statement, connection);
}
public static void close(ResultSet resultSet, Statement statement, Connection connection) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
工具类测试
package cn.ideal.datasource.test;
import cn.ideal.datasource.utils.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBCUtilsTest {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
//获取连接
connection = JDBCUtils.getConnection();
//定义sql
String sql = "INSERT INTO account VALUES(NULL,?,?)";
//获取preparedStatement对象
preparedStatement = connection.prepareStatement(sql);
//给?赋值
preparedStatement.setString(1, "lisi");
preparedStatement.setString(2, "2000");
//执行sql
int count = preparedStatement.executeUpdate();
System.out.println(count);
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.close(preparedStatement,connection);
}
}
}
结尾:
如果内容中有什么不足,或者错误的地方,欢迎大家给我留言提出意见, 蟹蟹大家 !^_^
如果能帮到你的话,那就来关注我吧!(系列文章均会在公众号第一时间更新)
在这里的我们素不相识,却都在为了自己的梦而努力 ❤一个坚持推送原创Java技术的公众号:理想二旬不止
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。