数据库连接池
数据库连接池
数据库连接池就是一个容器,存放数据库链接的容器
当我们使用Java连接数据库时,会首先创建对数据库的链接,执行完sql语句之后再将连接释放,再执行SQL语句时就要重新申请,重新释放,创建链接的速度是很慢的,所以我们采用将数据库链接池化的方式增加代码的速度.
当使用数据库连接池之后,在系统初始化好后,链接池(容器)被创建,连接池(容器)会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完后,会将链接归还给容器,这样就节省了申请链接的时间,增大了代码效率.
C3P0数据库连接池的基本使用
- C3P0 jar包导入
- 定义配置文件 c3p0.properties 或者 c3p0-config.xml 自动获取
- 创建连接池对象
- 获取链接
jar包导入
C3P0 jar包下载地址 https://sourceforge.net/projects/c3p0/
定义配置文件
自定义配置文件c3p0-config.xml 放在src包下
<c3p0-config>
<!-- 默认的配置-->
<default-config>
<!-- 连接参数-->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/database</property>
<property name="user">root</property>
<property name="password">mysql</property>
<!-- 连接池参数-->
<!-- 初始化申请的连接数量-->
<property name="initialPoolSize">5</property>
<!-- 最大连接数量-->
<property name="maxPoolSize">10</property>
<!-- 最大等待时间 ms-->
<property name="checkoutTimeout">3000</property>
</default-config>
<!-- 指定名称的配置-->
<named-config name="luoyudi">
<!-- 连接参数-->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/database</property>
<property name="user">root</property>
<property name="passworld">mysql</property>
<!-- 连接池参数-->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">10</property>
<property name="checkoutTimeout">3000</property>
</named-config>
</c3p0-config>
获取连接池对象
//使用默认配置
DataSource dataSource = new ComboPooledDataSource();
//或者 使用指定名称的配置
DataSource dataSource = new ComboPooledDataSource("luoyudi");
获取链接
Connection connection = dataSource.getConnection();
Druid数据库连接池基本使用
- 导入jar包
- 定义配置文件 .properties文件 手动获取
- 加载配置文件
- 获取数据库连接池对象
- 获取链接
导入jar包
Druid jar包下载官网https://repo1.maven.org/maven2/com/alibaba/druid/
定义配置文件
diverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/db1
username=root
password=mysql
#初始化连接数量
initialSize=5
#最大连接数量
maxActive=10
#最大等待时间
maxWait=3000
加载配置文件
Properties properties = new Properties();
InputStream inputStream = test.class.getClassLoader().getResourceAsStream("druid.properties");
properties.load(inputStream);
获取链接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
获取链接
Connection connection = dataSource.getConnection();
jdbc工具类
为了简化我们的操作,我们需要创建一个工具类JdbcUtils
用来提供
- 静态代码块初始化连接池对象
- 获取连接方法
- 获取资源池方法
- 释放资源
这里使用的是Druid数据库连接池
package 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;
/**
* @author luoyudi
*/
public class JdbcUtils {
// 定义成员变量
private static DataSource dataSource;
static {
// 加载配置文件
Properties properties = new Properties();
try {
properties.load(JdbcUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
dataSource= DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取链接
*/
public static Connection getConnection() throws SQLException {
return dataSource.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();
}
}
}
/**
* 获取链接池
*/
public static DataSource getDataSource(){
return dataSource;
}
}
接下来 我们可以使用这个工具类测试一下
package cn.Druid;
import util.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* 使用工具类
*
* @author luouydi
*/
public class DruidDemo {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
// 获取链接
try {
connection = JdbcUtils.getConnection();
// 定义sql
String sql = "insert into student values(?,?)";
// 获取pstmt对象
preparedStatement = connection.prepareStatement(sql);
// 补全sql
preparedStatement.setString(1, "wangwu");
preparedStatement.setInt(2, 1000);
// 执行sql
int count = preparedStatement.executeUpdate();
System.out.println(count);
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放资源
JdbcUtils.close(preparedStatement, connection);
}
}
}