Java使用数据库连接池
一、原生JDBC操作数据库的步骤
(1)加载数据库驱动。
(2)获取数据库连接。
(3)预编译SQL语句。
(4)执行SQL。
(5)获取结果集。
(6)释放资源。
示例代码如下:
public class JDBCTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
String url = "jdbc:mysql://localhost:3306/manage";
String user = "root";
String password = "123456";
// (1)加载数据库驱动。 mysql 5后已无需手动注册
Class.forName("com.mysql.jdbc.Driver");
// (2)获取数据库连接。
Connection conn = DriverManager.getConnection(url,user,password);;
// (3)预编译SQL语句。
String sql = "SELECT * FROM page_test where id = 1 ";
PreparedStatement statement = conn.prepareStatement(sql);
// (4)执行SQL。
ResultSet resultSet = statement.executeQuery();
// (5)获取结果集。
if(resultSet.next()){
System.out.println("id:"+resultSet.getInt("id"));
System.out.println("name:"+resultSet.getString("name"));
System.out.println("age:"+resultSet.getInt("age"));
}
// (6)释放资源。
conn.close();
statement.close();
}
}
测试结果如下
二、问题分析
使用原生JDBC操作数据库,可以正确获取到结果,可是也存在一些问题。每操作一次数据库比如增、删、改、查,都需要创建数据库连接,使用完成之后在释放资源。使用时创建连接,使用完毕后销毁连接。这样频繁地创建、销毁过程是非常消耗系统时间和资源的。当大量用户操作需要访问数据库时,每次都要进行数据库连接对象的创建和销毁,对系统来性能说是一种大量的消耗。
三、数据库连接池的引入
如何解决上面存在的问题呢?
这时就可以使用数据库连接池。数据库连接池是用来分配、管理、释放数据库连接对象的容器,它允许应用程序重复使用同一个数据库连接对象。常用的数据库连接池有C3P0,DPCP,druid(德鲁伊)。
四、连接池的工作原理
简单理解就是在项目初始化的时候,一次性创建一些可用的连接。某一次操作数据库需要使用连接时直接从连接池中获取,操作完成之后再将连接归还到连接池中。这样就可以起到资源重用的作用。
五、连接池的优势
.a.提高性能:连接池可以避免频繁创建和销毁数据库连接的开销,从而提高数据库访问性能。
.b.资源管理:连接池可以限制并发连接数,防止过多的连接导致数据库性能下降或崩溃。
.c.连接复用:连接池可以重复利用已经建立的连接,减少连接建立和认证的时间。
.d.连接管理:连接池可以监控和管理连接的状态,确保连接的可用性和稳定性。
六、Java中如何使用连接池
.a.导入druid连接池对应的Maven依赖;
<!-- Druid 数据源依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<!-- 需要确认最新的稳定版 -->
<version>1.2.9</version>
</dependency>
.b.编写配置文件,添加必要的配置。
druid.properties
配置内容如下:
#driverClassName这一项也可以不配置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/testtest
username=root
password=123456
#初始化建立连接个数
initialSize=5
#最大连接池数量
maxActive=10
#获取连接最大等待时间
maxWait=3000
#不在使用
maxIdle=6
#最小连接池数量
minIdle=3
.c.编写工具类读取配置文件,获取连接。
public class DruidDataSourceUtils {
private static DataSource ds;
/** 加载配置文件 */
static {
try {
Properties info = new Properties();
// 加载类路径下,配置文件 /druid.properties 表示当前类的路径下的配置文件
info.load(DruidDataSourceUtils.class.getResourceAsStream("/druid.properties"));
// 读取属性文件,创建连接池
ds = DruidDataSourceFactory.createDataSource(info);
} catch (Exception e) {
e.printStackTrace();
}
}
/** 获取连接 */
public static DataSource getDataSource() {
return ds;
}
// 获取连接
public static Connection getConnection() {
try {
return (Connection) ds.getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
throw new RuntimeException(e);
}
}
/** 释放连接资源 */
public static void close(Connection connection, Statement statement,
ResultSet resultSet) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/** 释放连接资源 */
public static void close(Connection connection, Statement statement) {
close(connection, statement, null);
}
}
七、连接池的参数配置
最大连接数:连接池中允许存在的最大连接数量。
最小空闲连接数:连接池中保持的最小空闲连接数量。
最大空闲连接数:连接池中保持的最大空闲连接数量。
连接超时时间:连接在池中的最长空闲时间,超过该时间未被使用则会被回收。
连接生命周期:连接被创建后的最长生命周期,超过该时间连接会被关闭和重新创建。
测试结果如下:
总结: 池化技术在开发中的应用很广泛,不光是数据库连接池,redis连接数据库的时候,也在使用连接池。使用池化技术可以提高性能,节省资源,降低系统开销;简化代码。因此在开发中推荐使用池化技术,提高系统性能。
参考博客: https://developer.aliyun.com/article/1002335