Java实现数据连接池Druid举例

作者:晴天哥_王志 时间:2022-12-10 21:21:47 

开篇

Druid号称是Java语言中最好的数据库连接池,并且能够提供强大的监控和扩展功能。作为日常使用较多的数据库连接组件,纯粹个人兴趣研究下理解下的实现原理。

理解一个工具组件最好的方式就是进行 debug,这里建议大家下载下参考连接中的 druid demo,修改下具体的数据库连接参数就可以直接进行调试跟踪。

之所以强调 Demo 的重要性,在于通过 demo 能够跟踪所有的执行流程,有了 Demo 剩下的事情只要花时间都能很好的梳理。

Druid的调试

url=jdbc:mysql://localhost:3306/github_demo?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=true
username=root
password=123456
name=zzs001
driverClassName=com.mysql.cj.jdbc.Driver
initialSize=4
maxActive=8
minIdle=0
maxWait=-1
poolPreparedStatements=false
maxOpenPreparedStatements=10
validationQuery=select 1 from dual
validationQueryTimeout=-1
testOnBorrow=false
testOnReturn=false
testWhileIdle=true
timeBetweenEvictionRunsMillis=-1
minEvictableIdleTimeMillis=1800000
defaultAutoCommit=true
defaultReadOnly=false
defaultTransactionIsolation=REPEATABLE_READ
defaultCatalog=github_demo
removeAbandoned=false
removeAbandonedTimeoutMillis=300*1000
logAbandoned=true
filters=log4j,wall,mergeStat
connectionProperties=druid.useGlobalDataSourceStat=true;druid.stat.logSlowSql=true;druid.stat.slowSqlMillis=5000
accessToUnderlyingConnectionAllowed=false
init=true

基础的配置信息如上,核心在于 JDBC 的连接地址信息。

public class DruidDataSourceTest {

    @Test
    public void save() throws SQLException {
        // 创建sql
        String sql = "insert into demo_user values(null,?,?,?,?,?)";
        Connection connection = null;
        PreparedStatement statement = null;
        try {
            // 获得连接
            connection = JDBCUtils.getConnection();
            // 开启事务设置非自动提交
            connection.setAutoCommit(false);
            // 获得Statement对象
            statement = connection.prepareStatement(sql);
            // 设置参数
            statement.setString(1, "zzf003");
            statement.setInt(2, 18);
            statement.setDate(3, new Date(System.currentTimeMillis()));
            statement.setDate(4, new Date(System.currentTimeMillis()));
            statement.setBoolean(5, false);
            // 执行
            statement.executeUpdate();
            // 提交事务
            connection.commit();
        } finally {
            // 释放资源
            JDBCUtils.release(connection, statement, null);
        }
    }
}

核心步骤获获取 Connection 并设置并通过 Connection 设置statement,最后通过statement进行 SQL 的执行。

public class JDBCUtils {

    private static DataSource dataSource;
    private static ThreadLocal<Connection> tl = new ThreadLocal<>();
    private static final Log log = LogFactory.getLog(JDBCUtils.class);

    static {
        init();
    }

    private static void init() {
        Properties properties = new Properties();
        InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
        try {
            properties.load(in);
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch(Exception e) {
            throw new RuntimeException("创建数据源失败", e);
        }
    }

    /**
     * <p>获取数据库连接对象的方法,线程安全</p>
     * @return: Connection
     */
    public static Connection getConnection() throws SQLException {
        // 从当前线程中获取连接对象
        Connection connection = tl.get();
        // 判断为空的话,创建连接并绑定到当前线程
        if(connection == null) {
            connection = createConnection();
            tl.set(connection);
        }
        return connection;
    }

    /**
     * <p>创建数据库连接</p>
     * @return: Connection
     * @throws SQLException 
     */
    private static Connection createConnection() throws SQLException {
        Connection conn = null;
        // 获得连接
        conn = dataSource.getConnection();
        return conn;
    }
}
  • 通过DruidDataSourceFactory创建 DataSource。

  • 通过DataSource获取 Connection。

参考

druid源码仓库
druid demo

来源:https://www.jianshu.com/p/dfdee14ab0c5

标签:Java,数据连接池,Druid
0
投稿

猜你喜欢

  • C#中异步Socket通信编程代码实例

    2022-02-23 11:29:59
  • Java并发之ReentrantLock类源码解析

    2022-08-09 18:10:35
  • android虚拟键盘弹出遮挡登陆按钮问题的解决方法

    2022-03-06 15:54:54
  • Android 异步获取网络图片并处理导致内存溢出问题解决方法

    2022-10-11 07:58:14
  • java注解的全面分析

    2023-11-25 11:28:50
  • Java JDK 二分法 分析demo(推荐)

    2022-02-28 23:29:21
  • C#中的图像Image类与打印Printing类用法

    2022-07-25 06:24:36
  • Spring Boot实现分布式系统中的服务发现和注册(最新推荐)

    2022-07-10 03:50:23
  • c#解析jobject的数据结构

    2023-09-28 00:25:33
  • Unity3D动态对象优化代码分享

    2023-12-22 09:38:24
  • Java中方法重写与重载的区别

    2022-07-25 04:49:01
  • java设计模式之简单工厂模式详解

    2021-12-21 22:16:34
  • Flutter开发Mac桌面应用实现自动提取生成视频字幕文件

    2023-05-11 05:25:58
  • Struts2中Action中是否需要实现Execute方法

    2021-10-30 06:57:23
  • SpringBoot集成Jpa对数据进行排序、分页、条件查询和过滤操作

    2022-03-06 19:17:50
  • Android 文件数据存储实例详解

    2023-07-28 17:08:03
  • Hibernate实现批量添加数据的方法

    2023-11-29 08:53:56
  • java 服务器接口快速开发之servlet详细教程

    2022-11-07 09:37:28
  • Java 导出Excel增加下拉框选项

    2021-10-13 07:58:50
  • Java网络编程之简易聊天室的实现

    2022-05-05 22:23:45
  • asp之家 软件编程 m.aspxhome.com