【Java 进阶篇】JDBC数据库连接池Druid工具类详解

2023-10-12 18:08:53 浏览数 (2)

在Java应用程序中,数据库连接是一种重要的资源,因为每次创建和销毁数据库连接都会产生开销,降低了系统性能。为了高效地管理数据库连接,降低资源消耗,常常使用数据库连接池。Druid是一个功能强大的数据库连接池,本文将详细介绍如何使用Druid连接池及其工具类。

1. 什么是Druid连接池

Druid是阿里巴巴开源的一个数据库连接池实现,它结合了传统数据库连接池的优点和一些独特的功能。Druid连接池具有如下特点:

  • 高效:Druid连接池采用了一些高效的技术,如预编译语句缓存、连接池预热等,可以提高数据库访问的效率。
  • 安全:Druid连接池内置了防SQL注入功能,可以有效地防止SQL注入攻击。
  • 强大的监控和统计功能:Druid连接池可以监控连接池的状态,包括活跃连接数、空闲连接数、执行SQL的次数等,可以帮助开发人员更好地了解应用程序的性能。
  • 配置灵活:Druid连接池提供了丰富的配置选项,可以根据应用程序的需求进行灵活配置。

2. 导入Druid库

要使用Druid连接池,首先需要在项目中导入Druid库。可以通过Maven或手动下载jar包来导入Druid库。

Maven依赖:

代码语言:javascript复制
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.6</version>
</dependency>

3. 配置Druid连接池

配置Druid连接池需要创建一个DruidDataSource对象,并设置一些连接属性,如数据库URL、用户名、密码等。以下是一个简单的Druid连接池配置示例:

代码语言:javascript复制
import com.alibaba.druid.pool.DruidDataSource;

public class DruidUtils {
    private static DruidDataSource dataSource;

    static {
        dataSource = new DruidDataSource();
        dataSource.setUrl("jdbc:mysql://localhost:3306/mydatabase");
        dataSource.setUsername("root");
        dataSource.setPassword("password");
    }

    public static DruidDataSource getDataSource() {
        return dataSource;
    }
}

在上面的示例中,我们创建了一个DruidDataSource对象并设置了数据库的URL、用户名和密码。这是一个简单的配置示例,您可以根据实际需求设置更多的属性,如连接池大小、最大活跃连接数、初始化连接数等。

4. 获取数据库连接

使用Druid连接池,您可以通过DruidDataSource对象来获取数据库连接。以下是一个获取数据库连接的示例:

代码语言:javascript复制
import com.alibaba.druid.pool.DruidDataSource;

import java.sql.Connection;
import java.sql.SQLException;

public class DruidUtils {
    // 省略其他代码

    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
}

在上面的示例中,我们定义了一个getConnection方法,该方法可以获取一个数据库连接。注意要处理SQLException异常。

5. 关闭数据库连接

使用完数据库连接后,一定要及时关闭以释放资源。Druid连接池的连接是可以重复使用的,所以在关闭连接时,实际上是将连接归还给连接池,而不是真正地关闭连接。

以下是一个关闭数据库连接的示例:

代码语言:javascript复制
import com.alibaba.druid.pool.DruidDataSource;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

public class DruidUtils {
    // 省略其他代码

    public static void close(Connection conn, Statement stmt) {
        try {
            if (stmt != null) {
                stmt.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        try {
            if (conn != null) {
                conn.close(); // 归还连接给连接池
            }
        } catch (SQLException e) {
        	e.printStackTrace();
        }
    }
}

6. 编写Druid工具类

为了更方便地使用Druid连接池,我们可以编写一个Druid工具类,该工具类封装了获取连接、关闭连接等操作。

以下是一个简单的Druid工具类示例:

代码语言:javascript复制
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;

import java.sql.SQLException;

public class DruidUtils {
    private static DruidDataSource dataSource;

    static {
        dataSource = new DruidDataSource();
        dataSource.setUrl("jdbc:mysql://localhost:3306/mydatabase");
        dataSource.setUsername("root");
        dataSource.setPassword("password");
    }

    public static DruidPooledConnection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

    public static void close(DruidPooledConnection connection) {
        if (connection != null) {
            try {
                connection.close(); // 归还连接给连接池
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

在上面的示例中,我们将DruidPooledConnection对象用于获取连接,而不是Connection对象,以便于后续的连接管理。同时,我们编写了一个close方法用于关闭连接。这个工具类可以进一步封装其他常用的数据库操作。

7. 编写Druid示例代码

接下来,我们将编写一个示例代码,展示如何使用Druid连接池进行数据库操作。假设我们有一个User表,我们将编写一个查询所有用户的示例代码。

代码语言:javascript复制
import com.alibaba.druid.pool.DruidPooledConnection;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserDao {
    public static void main(String[] args) {
        DruidPooledConnection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try {
            connection = DruidUtils.getConnection();
            String sql = "SELECT * FROM user";
            preparedStatement = connection.prepareStatement(sql);
            resultSet = preparedStatement.executeQuery();

            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String username = resultSet.getString("username");
                String email = resultSet.getString("email");

                System.out.println("ID: "   id   ", Username: "   username   ", Email: "   email);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DruidUtils.close(connection);
        }
    }
}

在上面的示例中,我们首先通过DruidUtils获取数据库连接,然后使用PreparedStatement执行SQL查询语句,最后关闭连接。这个示例展示了如何使用Druid连接池执行查询操作。

8. 总结

Druid连接池是一个功能强大的数据库连接池,在高并发的Java应用中具有良好的性能和安全性。通过配置和使用Druid连接池,您可以更好地管理数据库连接,提高应用程序的性能和安全性。希望本文的介绍和示例对您有所帮助,让您更加熟悉如何使用Druid连接池。

作者信息 作者 : 繁依Fanyi CSDN: https://techfanyi.blog.csdn.net 掘金:https://juejin.cn/user/4154386571867191

0 人点赞