天天看点

连接池原理和使用连接池

连接池

连接池的原理

1.程序一开始就创建一定数量的连接,放在一个容器中,这个容器称为连接池

2.使用的时候直接从连接池中取一个已经创建好的连接对象

3.关闭的时候不是真正关闭连接,而是将连接对象再次放回到连接池中

4.当连接池中的连接对象用完后,还需使用的时候,任务会进入等待,等待几秒后若还没有使用完的连接对象返回连接池供其使用,连接池则会自动创建一个新的连接对象供其使用,使用完自动销毁

自定义一个简单的连接池

下面是一个自定义的,创建连接和释放资源的工具类:

需要创建一个jbdc.properties配置文件放在src目录下

配置文件信息:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/...
user=root
password=root
           

以及工具类:

public class MyJDBCUtils {
    private static String driver;
    private static String url;
    private static String user;
    private static String password;

    static {
        InputStream s = MyJDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
        Properties properties = new Properties();
        try {
            properties.load(s);
        } catch (IOException e) {
            e.printStackTrace();
        }
         driver = properties.getProperty("driver");
         url = properties.getProperty("url");
         user = properties.getProperty("user");
         password = properties.getProperty("password");
        //注册驱动
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    public  static Connection getConnection()throws Exception{
        //连接数据库
        Connection connection = DriverManager.getConnection(url, user, password);
        return connection;
    }
    public static void release(ResultSet resultSet, Statement statement, Connection connection)throws Exception{
        if (resultSet!=null){
            resultSet.close();
        }
        if (statement!=null) {
            statement.close();
        }
        if (connection!=null) {
            connection.close();
        }
    }
}
           

1.自定义一个连接池类

2.定义LinkList集合作为连接池,在静态代码块中,向集合中添加5个连接对象

3.添加一个方法,用来归还连接

public class MyDataSource {
    //定义集合,存放连接对象
    private static LinkedList<Connection> pool;
    
    static{
        try {
            pool = new LinkedList<Connection>();
            //添加5个连接对象
            for(int i = 0; i < 5;i++){
                //创建连接(在工具类自己定义的JbdcUtils类里面的getConnection方法)
                Connection connection =MyJDBCUtils.getConnection();
                pool.add(connection);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获得池子里面连接的数量
     * @return
     */
    public static int getCount(){
        return pool.size();
    }

    /**
     * 从pool里面拿出连接
     * @return
     */
    public  Connection getABC(){
        Connection connection = pool.removeFirst();
        return  connection;
    }

    /**
     * 归还连接
     * @param connection
     */
    public  void addBack(Connection connection){
        pool.addLast(connection);
    }
}
           

为了让连接池定义的方法具有统一,易用性,Java中提供了javax.sql.DataSource接口,这样应用程序可以方便的切换不同厂商的连接池

所以我们自定义连接池需要实现DataSource接口,并重写其中的抽象方法

使用第三方连接池

c3p0连接池

  • C3P0开源免费的连接池!目前使用它的开源项目有:Spring、Hibernate等。使用第三方工具需要导入jar包,c3p0使用时还需要添加配置文件c3p0-config.xml.
  • 使用C3P0需要添加c3p0-(版本号).jar

连接池的使用

  • 把配置文件c3p0-config.xml,放在src目录下
  • 在配置文件中更改需要更改的数据即可
  • 编写Java代码 (会自动读取src目录下的c3p0-config.xml,所以不需要我们解析配置文件)

创建连接池对象

DataSource ds = new ComboPooledDataSource();
           

DRUID连接池

Druid是阿里巴巴开发的号称为监控而生的数据库连接池,Druid是国内目前最好的数据库连接池。在功能、性能、扩展性方面,都超过其他数据库连接池。

使用方法:

需要自行导入properties配置文件

把 文件名.properties 文件放入src目录下作为配置文件

//0 根据druid.properties创建配置文件对象
        Properties properties = new Properties();
        // 关联druid.properties文件
        InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("文件名.properties");
        properties.load(is);
           

获取到了配置文件就可以创建连接池:

DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
           

我们还可以把c3p0和druid的方法提出来分别为他们创建工具类:

抽取c3p0工具类和druid工具类