Druid连接池入门使用和工具类封装

Druid(德鲁伊):阿里巴巴提供的数据库连接池技术,是目前最好的数据库连接池。
600+ 项目中使用,支持 sql 日志监控

Java 为数据库连接池提供了公共的接口: DataSource ,各个连接池厂商去实现这套接口,提供 jar 包。

DataSource
    功能
       * 获取连接:
           Connection getConnection()  
       * 归还连接:
           connction.close()连接池厂商对 connection 对象的 close() 方法进行(增强),执行该方法时不是销毁对象,而是归还到连接池中
                使用的动态代理技术进行增强的....

Druid 连接池快速入门

// 1. 创建 druid 数据源(连接池)对象
DruidDataSource dataSource = new DruidDataSource();
// 2. 配置数据库基本四项,创建连接,初始化连接池容器
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/web");
dataSource.setUsername("root");
dataSource.setPassword("root");

// 指定初始化个数
dataSource.setInitialSize(5);
// 指定最大个数
dataSource.setMaxActive(100);
// 指定低峰期个数
dataSource.setMinIdle(20);
// 指定等待时间
dataSource.setMaxWait(3000);

// 3. 从连接池中获得连接对象
Connection connection = dataSource.getConnection();
System.out.println(connection);

// 4. 归还到连接池
connection.close(); // 此对象是 druid 提供的子类,实现了对 close 方法的增强,不再是销毁对象,而是归还到连接池

Druid 连接池配置文件读取

 

 

 

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/databasename
username=root
password=root
#初始化个数
initialSize=5
#最大连接数
maxActive=10
#等待时间,毫秒
maxWait=3000
#最少连接数
minIdle=3
// 通过类加载器,加载 druid.properties 文件,获取 io 流
InputStream in = DruidDemo2.class.getClassLoader().getResourceAsStream("druid.properties");
Properties properties = new Properties();
properties.load(in);

// 通过 druid 工厂,创建 druid 连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);

// 从连接池获取连接
for (int i = 1; i <= 11; i++) {
Connection connection
= dataSource.getConnection();
// 进行 jdbc 的 crud 操作
System.out.println(connection);
// 模拟归还
if(i== 10){
connection.close();
}
// 连接池使用详情
System.out.println(dataSource);
}

连接池工具类

/*
    mybatis 内置连接初始化代码....
 */
public class JdbcUtils {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 声明连接池对象</span>
<span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> DataSource dataSource;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 1. 初始化连接池容器  static{}</span>
<span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> {
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 1.加载druid.properties 配置文件</span>
        InputStream in = JdbcUtils.<span style="color: rgba(0, 0, 255, 1)">class</span>.getClassLoader().getResourceAsStream("druid.properties"<span style="color: rgba(0, 0, 0, 1)">);
        Properties properties </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Properties();
        properties.load(in);

        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 2.通过druid的工厂,创建连接池对象</span>
        dataSource =<span style="color: rgba(0, 0, 0, 1)"> DruidDataSourceFactory.createDataSource(properties);
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        </span><span style="color: rgba(0, 0, 255, 1)">throw</span> <span style="color: rgba(0, 0, 255, 1)">new</span> RuntimeException("druid连接池初始化失败..."<span style="color: rgba(0, 0, 0, 1)">);

    }
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 2. 提供获取连接池对象的静态方法</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> DataSource getDataSource() {
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> dataSource;
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 3. 提供获取连接对象的静态方法</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> Connection getConnection() <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> Exception {
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> dataSource.getConnection();
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 4. 提供释放资源的方法(conn对象不是销毁,而是归还到连接池)</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> release(ResultSet resultSet, Statement statement, Connection connection) {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 关闭ResultSet</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> (resultSet != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
        </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
            resultSet.close();
        } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (SQLException e) {
            e.printStackTrace();
        }
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 关闭Statement</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> (statement != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
        </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
            statement.close();
        } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (SQLException e) {
            e.printStackTrace();
        }
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 关闭Connection</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> (connection != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
        </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
            statement.close();
        } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (SQLException e) {
            e.printStackTrace();
        }
    }
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 方法重载</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> release(Statement statement, Connection connection) {
    release(</span><span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">, statement, connection);
}

}