jdbc 池化思想

jdbc

  1. 什么是数据库元数据

    1. 参数元数据
    2. 结果集元数据
PreparedStatement接口中的方法 说明
ParameterMetaData getParameterMetaData() 通过预编译语句获取
ParameterMetaData接口中的方法 说明
int getParameterCount() 获取参数的个数
String getParameterTypeName(int param) 获取指定列的参数类型
ResultSet接口中的方法 说明
ResultSetMetaData getMetaData() 通过结果集获取
ResultSetMetaData接口中的方法 说明
int getColumnCount() 获取列数
String getColumnName(int column) 获取指定列的名字
String getColumnTypeName(int column) 获取指定列的

连接池解决现状问题的原理

目标

  1. 为什么需要连接池
  2. 连接池的执行原理

JDBC访问数据库时操作Connection对象

JDBC访问数据库的每个增删改查的操作都需要先创建连接,而且这个连接对象是不能共享的。每个用户每次访问都必须创建一个连接对象,并且这个连接对象应该设置成局部变量。

1562377031462

连接对象的使用问题

  1. 经过测试,每次访问数据库最耗时的部分就是创建连接对象。
  2. 每次使用完连接对象以后,就马上关闭。

需要解决两个问题

  1. 如何提高创建连接对象的速度
  2. 如何提高连接对象的使用率

使用连接池的目的就是为了解决以上2个问题

连接池的原理图

没有使用连接池的情况:每个用户访问数据库的时候,都是自己创建连接对象

1562377180466

使用连接池的情况:一开始系统启动的时候就创建了一定数量的连接对象,使用的时候直接从连接池中去获取就可以了。不需要自己来创建连接对象。

1562377203244

连接池解决现状问题的原理

Connection连接对象 操作特点
创建时 连接对象不再由自己创建,而是系统启动的时候已经创建一定数量的连接,
并且放在连接池中
使用时 直接从连接池中去获取一个已经创建好的连接对象即可
关闭时 不是真的关闭连接对象,而是将连接对象再放回到连接池中,供下一个用户使用

数据库连接池API

目标

  1. 连接池的接口名
  2. 从连接池中得到连接的方法

数据源接口

javax.sql.DataSource接口

实现类在哪?由第三方厂商来实现,只要实现这个接口都可以编写自己的连接池。

数据源接口中的方法

DataSource接口中的方法 描述
Connection getConnection() 从连接池中获取连接对象

常用连接池参数含义

每个连接池都有很多的参数,几乎所有的参数都是有默认的值的,我们也可以根据实际情况进行调整。参数名在不同的连接池中参数名是有区别的。

常用参数 描述
初始连接数 服务器启动的时候创建的连接对象数量
最大连接数 连接池中最多可以允许放多少个连接对象
最长等待时间 如果连接池中没有连接对象,设置用户等待的最长时间是多久,单位是毫秒。
如果超过这个时间就抛出异常
最长空闲回收时间 如果一个连接对象长时间没有人使用,设置多久回收这个对象,默认是不回收。

连接池

​ 池化思想
​ 使用一个集合, 在初始时就创建一些连接存入其中.如果要使用连接, 则从集合中获取, 用完之后, 再把连接归还到集合中供后续使用.
​ 作用:
​ 可以节省创建连接的时间以及释放资源的时间.
​ DataSource
​ 数据源.所有的连接池对象都需要实现该接口.
​ 方法:
​ Connection getConnection() 获取连接池中的一个连接.从连接池中获取的连接, 它的close方法都被修改掉了.
​ 连接的close方法不再释放资源, 而是把自己归还到连接池中
​ 通常情况下,在一个项目中,连接池只会创建一个。这个项目中所有的dao都从这个连接池获取连接操作数据库。
实现(第三方连接池)

C3P0

  1. package com.itheima;

    import com.mchange.v2.c3p0.ComboPooledDataSource;

    import java.sql.Connection;
    import java.sql.SQLException;

    /**

      1. 从连接池中得到10个连接对象,输出每个对象
      1. 分别设置默认配置和命名配置
        */
        public class Demo1C3p0 {

      public static void main(String[] args) throws SQLException {
      //1.创建连接池,使用默认配置。ComboPooledDataSource实现了DataSource接口
      //ComboPooledDataSource ds = new ComboPooledDataSource();

    代码

        //使用命名配置
        ComboPooledDataSource ds = new ComboPooledDataSource("otherc3p0");
        //2.使用连接池,从连接池中获取10个连接对象
        for (int i = 1; i <= 16; i++) {
            Connection connection = ds.getConnection();
            System.out.println("第" + i + "个连接对象:" + connection);
            //第5个释放
            if (i==5) {
                //放回到连接池中
                connection.close();
            }
        }
    

DRUID连接池API介绍

使用druid创建连接池,从连接池中得到连接对象,输出得到的连接对象。

导包

1 在src目录下创建一个properties文件,文件名随意,设置上面的参数

2 在src目录下新建一个DRUID配置文件,命名为:druid.properties

url=jdbc:mysql://localhost:3306/test
username=root
password=root
driverClassName=com.mysql.jdbc.Driver
initialSize=5
maxActive=10
maxWait=2000

代码

package com.itheima;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

public class Demo2Druid {

public static void main(String[] args) throws Exception {
    //1.从类路径下加载配置文件,获取一个输入流。如果不指定路径,默认是读取同一个包下资源文件
    InputStream inputStream = Demo2Druid.class.getResourceAsStream("/druid.properties");
    //2.使用Properties对象的方法将配置文件中属性加载到Properties对象中
    Properties properties = new Properties();
    //加载了配置文件中所有的属性
    properties.load(inputStream);
    //3.通过druid的工厂类创建连接池
    DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);

    //获取10个连接对象
    for (int i = 1; i <= 11; i++) {
        Connection connection = dataSource.getConnection();
        System.out.println("第" + i + "个连接对象:" + connection);
        //第3个连接关闭
        if (i==3) {
            connection.close();
        }
    }
}

你可能感兴趣的:(jdbc 池化思想)