数据库连接池
1.数据库连接池基本概念:
JDBC连接池是一个管理数据库连接的重要工具,它能够显著提高应用程序与数据库之间的性能和效率。连接池通过预先创建和维护一组数据库连接,而不是每次请求都创建新的连接,从而避免了频繁的连接和断开操作,减少了数据库服务器的负担,并且能够更快地响应应用程序的数据库请求。
- 原理
数据库连接池初始化创建一定数量的数据库连接放在数据库连接池中,当访问数据库连接池时,需要向数据库连接池中申请一定的连接对象,如果没有再创建,用完之后放回到连接池中。
2.DataSource数据库连接池对象
为了获取数据库连接对象(Connection),JDBC提供了javax.sql.DataSource接口,iavax.sql.DataSource 接口负责与数据库建立连接,并定义了返回值为Connection 对象的方法,具体如下。
Connection getConnection()
Connection getConnection(String username, String password)
上述两个重载的方法都能用于获取 Connection对象。不同的是,第一个方法是通过无参的方式建立与数据库的连接,第二个方法是通过传人登录信息的方式建立与数据库的连接。
3.Druid数据库连接实现技术
- 步骤
1.导入Druid相关的jar包/通过maven配置
2.定义配置文件
是properties形式的
可以叫任意名字,放在任意目录下
3.加载配置文件:new properties()
4.获得数据库连接池对象:通过工厂来获得 DruidDataSourceFactory
5.获取连接:getConnection()
- 代码实现
1.导入Druid的Jar包
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.3</version>
</dependency>
2.druid.properties配置文件
diverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/school
username=root
password=123456
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最长等待时间
maxWait=3000
3.JDBCUtils工具类
package com.tyut.utils;
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 {
InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
Properties properties = new Properties();
properties.load(is);
ds = DruidDataSourceFactory.createDataSource(properties);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
//获得Connection对象
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
//释放资源
public static void close(ResultSet resultSet, Statement statement, Connection connection) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
if (connection != null) {
try {
connection.close();//归还资源
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
public static void close(Statement statement, Connection connection) {
close(null, statement, connection);
}
//获取连接池
public static DataSource getDataSource() {
return ds;
}
}
4.案例
package com.tyut.dao;
import com.tyut.utils.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TextJdbc04 {
public static void main(String[] args) {
PreparedStatement ps = null;
Connection conn = null;
try {
conn = JDBCUtils.getConnection();
String sql = "INSERT INTO dept(name) VALUES(?)";
ps = conn.prepareStatement(sql);
ps.setString(1, "人力资源部");
System.out.println(ps.executeUpdate());
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JDBCUtils.close(ps, conn);
}
}
}