数据库连接池

数据库连接池(Connection pool)

jdbc数据库连接池的必要性:

传统的模式:

——主程序中建立数据库连接

——进行sql操作

——断开数据库

问题:普通JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接的时候都要将Connection加载到内存中,验证用户密码,执行完断开连接,这样的方式将会消耗大量的资源和时间。数据库的连接资源并没有更好的重复利用。

 

数据库连接池的基本思想:为数据库连接建立一个"缓冲池",预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从缓冲池中取出一个,使用完毕之后再放回去。

 

数据库连接池的功能:

——负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。

 

数据库连接池的初始化

——数据库连接池初始化时将创建一定数量的数据库连接放到连接池中

——(这些数据库连接的数量是由最小数据库连接数来设定的。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数)

 

使用DBCP数据库连接池

1.加入jar包(2个jar包),依赖于Commons pool

2.创建数据库连接池

3.为数据源实例指定必须的属性

4.从数据源中获取数据库连接

 

    /**
     * 1.加载dbcp的properties的配置文件:配置文件中的键需要来自BaiscDataSource中的属性
     * 2.创建BaiscDataSourceFactory的createDataSource方法创建DataSource实例
     * 3.从DataSource实例中获取数据库连接
     * @throws Exception
     */
    @Test
    public void testDBCPWithDataSourceFactory() throws Exception{
        Properties properties = new Properties();
        InputStream inputStream = TestDBCP.class.getClassLoader().getResourceAsStream("./dbcp.properties");
        properties.load(inputStream);

        DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);
        Connection conn = dataSource.getConnection();
        System.out.println(conn.getClass());

        BasicDataSource basicDataSource = (BasicDataSource) dataSource;
        System.out.println(basicDataSource.getMaxWait());
        conn = dataSource.getConnection();
        System.out.println(conn.getClass());
        conn = dataSource.getConnection();
        System.out.println(conn.getClass());
        conn = dataSource.getConnection();
        System.out.println(conn.getClass());
        Connection conn2 = dataSource.getConnection();
        System.out.println(conn.getClass());

        new Thread(){
            @Override
            public void run() {
                try {
                    Connection conn = dataSource.getConnection();
                    System.out.println(conn.getClass());
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            };
        }.start();
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
            conn2.close();

    }

    @Test
    public void testDBCP() throws SQLException {
        BasicDataSource dataSource = null;

        //1.实例化数据源对象
        dataSource = new BasicDataSource();


        //2.为数据源实例指定必须的属性
        dataSource.setUsername("root");
        dataSource.setPassword("password");
        dataSource.setUrl("jdbc:mysql://localhost:3306/yang");
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");

        //3.指定数据源一些可选的属性
        //1)指定数据库连接池初始化连接数的个数
        dataSource.setInitialSize(10);

        //2)指定最大的连接数:同一时刻可以同时向数据库申请的连接数
        dataSource.setMaxActive(50);

        //3)指定最小连接数:在数据库连接池中保存的最少的空闲连接的数量
        dataSource.setMinIdle(5);

        //4)等待数据库连接池分配连接的最长时间,单位为毫秒,超出该时间将抛出异常。
        dataSource.setMaxWait(1000*5);

        //4.从数据源中获取数据库连接
        Connection conn = dataSource.getConnection();

        System.out.println(conn.getClass());
    }
posted @ 2019-05-09 16:16  鸿森  阅读(283)  评论(0编辑  收藏  举报