Java实现数据连接池Druid举例

 更新时间:2022年03月17日 09:24:36   作者:晴天哥_王志  
本文主要介绍了Java实现数据连接池Druid举例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

开篇

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

到此这篇关于Java实现数据连接池Druid举例的文章就介绍到这了,更多相关Java 数据连接池Druid内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 利用Java实现简单的猜数字小游戏

    利用Java实现简单的猜数字小游戏

    这篇文章主要为大家详细介绍了如何利用java语言实现猜数字小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Java程序中使用JavaMail发送带图片和附件的邮件

    Java程序中使用JavaMail发送带图片和附件的邮件

    这篇文章主要介绍了Java程序中使用JavaMail发送带图片和附件的邮件,JavaMail是专门用来处理邮件的Java API,需要的朋友可以参考下
    2015-11-11
  • 通过java备份恢复mysql数据库的实现代码

    通过java备份恢复mysql数据库的实现代码

    这篇文章主要介绍了如何通过java备份恢复mysql数据库,其实一般情况下通过bat或sh就可以,这里主要是介绍了java的实现思路,喜欢的朋友可以参考下
    2013-09-09
  • Mybatis优化检索的方法详解

    Mybatis优化检索的方法详解

    MyBatis是一款优秀的基于Java的持久层框架,它可以将 SQL 语句和数据库中的记录映射成为 Java 对象,并且支持灵活的 SQL 查询语句,在Mybatis中,可以使用动态SQL来灵活构造SQL语句,从而满足各种不同的检索需求,本文介绍Mybatis如何优化检索,需要的朋友可以参考下
    2024-05-05
  • 举例讲解Java的Jackson库中ObjectMapper类的使用

    举例讲解Java的Jackson库中ObjectMapper类的使用

    这篇文章主要介绍了举例讲解Java的Jackson库中ObjectMapper类的使用,Jackson库通常被用来实现Java的对象和JSON之间的转换功能,需要的朋友可以参考下
    2016-01-01
  • Java转JSON串的几种方式

    Java转JSON串的几种方式

    本文给大家总结一下java转json串的几种方式,每种方式通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随脚本之家小编一起学习吧
    2018-05-05
  • 详解在java中进行日期时间比较的4种方法

    详解在java中进行日期时间比较的4种方法

    这篇文章主要介绍了详解在java中进行日期时间比较的4种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 一文教你如何使用原生的Feign

    一文教你如何使用原生的Feign

    Feign使得 Java HTTP 客户端编写更方便,Feign 灵感来源于Retrofit、JAXRS-2.0和WebSocket,这篇文章主要给大家介绍了如何使用原生的Feign的相关资料,需要的朋友可以参考下
    2021-10-10
  • SpringBoot统一返回格式的方法详解

    SpringBoot统一返回格式的方法详解

    今天小编主要是和大家分享一个让代码变得更简洁的小技巧:统一返回格式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-08-08
  • SpringCloud超详细讲解负载均衡组件Ribbon源码

    SpringCloud超详细讲解负载均衡组件Ribbon源码

    在微服务中,对服务进行拆分之后,必然会带来微服务之间的通信需求,而每个微服务为了保证高可用性,又会去部署集群,那么面对一个集群微服务进行通信的时候,如何进行负载均衡也是必然需要考虑的问题
    2022-07-07

最新评论