数据库连接池基本概念
数据库连接池就是一个容器(集合),存放数据库连接的容器。当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
Druid连接池的基本使用
①导入jar包
mysql驱动jar包以及druid连接池jar包
②定义配置文件
#druid.properties
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/duobiaochaxun ? serverTimezone=Asia/Shanghai&characterEncoding=utf-8&useSSL=false
username=root
password=123321
#初始化连接数量
initialSize=5
#最大连接数
maxActive=10
#最大等待时间
maxWait=3000
validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
有关druid配置文件参数详解,可参考下面博客:
https://blog.csdn.net/weixin_42323802/article/details/82726267
③加载配置文件
//1、利用properties对象来读取文件 创建properties对象
Properties pp = new Properties();
//2、获取src路径下的文件的方式 ---> classLoader类加载器
ClassLoader classLoader = Demotest.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream("druid.properties");
//3、调用properties对象的load方法来将properties文件加载进内存
pp.load(is);
④获取连接池对象
通过工厂类的方法来获取 DruidDataSourceFactory类的createDataSource方法
传入参数:Properties properties
因此将properties配置文件加载进内存后,传给createDataSource方法
//获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pp);
⑤获取数据库连接对象
//获取数据库连接对象
Connection conn = ds.getConnection();
⑥获取到数据库连接对象后,其余使用方法同普通jdbc相同
定义SQL语句
获取执行SQL语句对象
执行SQL
处理结果
⑦资源释放
除释放ResultSet rs, Statement stmt外,如果连接对象Connection 是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了。而是归还连接。
代码实现:
package druid;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.Statement;
import java.util.Properties;
public class Demo01 {
public static void main(String[] args) throws Exception {
//加载properties配置文件
Properties pp = new Properties();
ClassLoader classLoader = Demo01.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream("druid.properties");
pp.load(is);
//获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pp);
//获取数据库连接对象
Connection conn = ds.getConnection();
//定义SQL语句
String sql = "update account set balance = 500 where id = 1";
//获取执行SQL对象
Statement stmt = conn.createStatement();
//执行SQL
//返回的是SQL语句执行影响的行数
int count = stmt.executeUpdate(sql);
//处理结果
System.out.println(count);
//释放资源 归还连接
stmt.close();
conn.close();
}
}
Druid连接池的工具类
每当用到Druid连接池,那么加载配置文件,获取连接池对象,获取数据库连接对象,释放资源,这些都是一些必须要做的工作,因此抽取成为工具类,配合Druid.properties,实现工具类的高可用性。
(可参考:JDBC的工具类JdbcUtils及配置文件jdbc.properties
https://blog.csdn.net/weixin_43402591/article/details/105640971)
①加载配置文件获取连接池对象
private static DataSource ds;
static {
try {
//加载properties配置文件
Properties pp = new Properties();
ClassLoader classLoader = Demo01.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream("druid.properties");
pp.load(is);
//获取连接池对象
ds = DruidDataSourceFactory.createDataSource(pp);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
②工具类中方法的创建
获取连接池对象方法
获取数据库连接对象
释放资源归还连接(释放资源又分为有没有ResultSet结果集对象的情况,因此释放资源的方法需要方法重载。)
//获取连接池对象
public static DataSource getDatasource() {
return ds;
}
//获取数据库连接对象
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
//关闭资源
public static void close(Statement stmt,Connection conn){
close(null,stmt,conn);
}
public static void close(ResultSet rs, Statement stmt,Connection conn){
if (stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
druid工具类代码
package druid;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
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;
static {
try {
//加载properties配置文件
Properties pp = new Properties();
ClassLoader classLoader = Demo01.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream("druid.properties");
pp.load(is);
//获取连接池对象
ds = DruidDataSourceFactory.createDataSource(pp);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
//获取连接池对象
public static DataSource getDatasource() {
return ds;
}
//获取连接对象
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
//关闭资源
public static void close(Statement stmt,Connection conn){
close(null,stmt,conn);
}
public static void close(ResultSet rs, Statement stmt,Connection conn){
if (stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}