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操作数据库,可以正确获取到结果,可是也存在一些问题。每操作一次数据库比如增、删、改、查,都需要创建数据库连接,使用完成之后在释放资源。使用时创建连接,使用完毕后销毁连接。这样频繁地创建、销毁过程是非常消耗系统时间和资源的。当大量用户操作需要访问数据库时,每次都要进行数据库连接对象的创建和销毁,对系统来性能说是一种大量的消耗。

三、数据库连接池的引入

如何解决上面存在的问题呢?

这时就可以使用数据库连接池。数据库连接池是用来分配、管理、释放数据库连接对象的容器,它允许应用程序重复使用同一个数据库连接对象。常用的数据库连接池有C3P0DPCPdruid(德鲁伊)

四、连接池的工作原理

简单理解就是在项目初始化的时候,一次性创建一些可用的连接。某一次操作数据库需要使用连接时直接从连接池中获取,操作完成之后再将连接归还到连接池中。这样就可以起到资源重用的作用。

 

五、连接池的优势

.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

posted @ 2024-03-22 10:11  一只爱阅读的程序员  阅读(396)  评论(0编辑  收藏  举报