【JDBC】数据库连接池Druid(德鲁伊)

一、连接池


JDBC每次连接数据库,都要获得一个连接对象。每次创建一个连接对象,都是一个较大的资源,如果在连接量较大的场景下,会极大的浪费资源。容易内存溢出。

1.1 自定义连接池

Java中提供了一个接口DataSource,通过实现该接口,可以创建连接池

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.logging.Logger;

/**
 * 数据库连接池
 */
public class MyDbPool implements DataSource {
    //存储连接对象的集合
    private static List<Connection> connections = new ArrayList<>();
    //类加载时,就往集合中存放指定数量的连接对象
    static {
        InputStream is = MyDbPool.class.getResourceAsStream("/db.properties");
        Properties properties = new Properties();
        try {
            properties.load(is);
            Class.forName(properties.getProperty("driver"));
            //通过循环,创建5个连接对象放进集合中
            for(int i=0;i<=5;i++){
                Connection connection = DriverManager.getConnection(properties.getProperty("url"),properties.getProperty("username"),properties.getProperty("password"));
                connections.add(connection);
            }
        } catch (IOException | ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
    @Override
    public Connection getConnection() throws SQLException {
        //池中获得连接
        System.out.println("池中有:"+connections.size());
        Connection connection = null;
        if(connections.size()>0){
            connection = connections.remove(0);
        }
        return connection;
    }

    //将连接放回池中
    public void release(Connection connection){
        connections.add(connection);
        System.out.println("放回一个"+connection);
    }
 }

import java.sql.Connection;

public class TestDBPool {
    public static void main(String[] args) throws Exception {
        Connection connection = null;
        MyDbPool myDbPool = new MyDbPool();
        for(int i = 1 ; i < 10 ; i++){
            connection = myDbPool.getConnection();
            System.out.println(connection);
            myDbPool.release(connection);
        }
    }
}

1.2 Druid(德鲁伊)

Druid 是目前比较流行高性能的,分布式列存储

一、亚秒级查询

二、实时数据注入

三、可扩展的PB级存储

四、多环境部署

五、丰富的社区

1.2.1 Druid配置

  • 创建database.properties 配置文件
  • 引入druid-1.1.5.jar

1.2.2 database.properties 文件配置

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/userinfo?useUnicode=true&characterEncoding=utf8
username=root
password=123456
#初始化连接
initialSize=10
#最大连接数量
maxActive=30
#最小空闲连接
minIdle=5
#超时等待时间以毫秒为单位
maxWait=5000

1.2.3 连接池工具类

package com.qf.day44.t2;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.xml.transform.Result;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class DBPoolUtils {
    //连接池对象
    private static DruidDataSource ds;

    static {
        Properties properties = new Properties();
        InputStream is = DBPoolUtils.class.getResourceAsStream("/database.properties");
        try {
            properties.load(is);
            //使用德鲁伊工厂创建连接池
            ds = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() {
        try {
            //在连接池中获得Connection
            return ds.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void closeAll(Connection connection, Statement statement, ResultSet resultSet) {
        try {
            if (resultSet != null) {
                resultSet.close();
            }
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
  • 注意:连接池中获得的Connection是DruidPooledConnection实现类,调用的close()方法不是关闭资源,而是将资源放回池中!

版权声明:本文为zl5230原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。