Druid核心源码分析DruidDataSource
更新时间:2023-10-25
前言
Druid是一个开源的数据库连接池,被广泛应用于Java应用程序中。Druid连接池具有高性能、强大的监控和扩展能力。Druid的核心源码之一是DruidDataSource,它是Druid连接池的主要实现类。本文将深入分析DruidDataSource的核心源码,以便更好地理解Druid连接池的工作原理。
1. DruidDataSource的初始化
DruidDataSource的初始化是通过调用其构造方法来完成的。在构造方法中,会进行一系列属性的初始化操作,如设置数据库URL、用户名、密码等。此外,还会创建一些核心对象,如DruidPooledConnection对象池、DruidDataSourceStatManager数据源统计管理器等。 下面是DruidDataSource的构造方法的部分源码:public DruidDataSource() { // 初始化其他属性 configFromPropety(System.getProperties()); // 创建对象池 createConnectionPool(); // 创建数据源统计管理器 if (MBeanUtils.isPlatformBean(this)) { DruidDataSourceStatManager.getInstance().register(this); } }
2. 数据源的配置
DruidDataSource支持通过配置文件和属性来配置数据库连接池。DruidDataSource会根据配置文件或者属性配置来设置相关参数,如初始连接数、最小空闲连接数、最大活跃连接数等。具体的配置可以通过setXxx方法进行设置。 下面是DruidDataSource的一些常用属性配置的方法:public synchronized void setInitialSize(int initialSize) { this.config.setInitialSize(initialSize); } public synchronized void setMinIdle(int minIdle) { this.config.setMinIdle(minIdle); } public synchronized void setMaxActive(int maxActive) { this.config.setMaxActive(maxActive); }
3. 获取数据库连接
DruidDataSource通过getConnection方法来获取数据库连接。在该方法中,DruidDataSource会调用内部的createPhysicalConnection方法来创建真正的数据库连接,并将其封装到DruidPooledConnection对象中。DruidDataSource会根据配置的参数来判断是否返回活跃的连接,或者创建新的连接。 下面是DruidDataSource的getConnection方法的源码:public Connection getConnection() throws SQLException { return getConnection(username, password); } public Connection getConnection(String username, String password) throws SQLException { // 判断是否开启过滤器 if (filters != null && !filters.isEmpty()) { String realUrl = config.getUrl(); Properties info = config.getConnectProperties(); if (info == null) { info = new Properties(); } info.put("druid.realUrl", realUrl); info.put("druid.userName", username); info.put("druid.password", password); info.put("druid.filters", filters); return DruidDriver.createConnectiion(this, new Properties(info)); } else { return getConnectionDirect(username, password); } }
4. 数据源的监控
DruidDataSource内置了丰富的监控功能,可以通过配置参数来开启这些监控功能。DruidDataSource内部维护了多个统计类,用于统计数据源的使用情况,如连接池的活跃连接数、最大活跃连接数、平均等待时间等等。通过这些统计数据,可以实时监控数据源的状态,并进行一些性能调优。 下面是DruidDataSource的一些监控属性的方法:public void setStatLoggerClassName(String statLoggerClassName) { config.setStatLoggerClassName(statLoggerClassName); } public void setFilters(String filters) { config.setFilters(filters); } public void setRemoveAbandoned(boolean removeAbandoned) { config.setRemoveAbandoned(removeAbandoned); }总结 通过对DruidDataSource核心源码的分析,我们可以看到Druid连接池的设计非常合理,支持强大的配置和监控功能。DruidDataSource通过合理的属性设置和内部池化技术,提供了高效、可靠的数据库连接管理功能。同时,DruidDataSource还内置了丰富的监控统计功能,可以帮助开发人员及时了解数据源的使用情况,并进行性能优化。通过深入理解DruidDataSource的核心源码,我们能更好地使用和定制Druid连接池,提高应用程序的性能和稳定性。