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