c语言编程笔录

首页 >   > 笔记大全

笔记大全

Druid核心源码分析DruidDataSource

更新时间:2023-08-01
前言 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连接池,提高应用程序的性能和稳定性。