• 数据库连接池(connection pool)


    1.JDBC数据库连接池的必要性 

    • 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤:  

      –      在主程序(如servlet、beans)中建立数据库连接。

      –      进行sql操作

      –      断开数据库连接。

    • 这种模式开发,存在的问题:

      –      普通的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证用户名和密码(得花费0.05s~1s的时间)。需要数据库连接的时候,就向数据库要求一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。数据库的连接资源并没有得到很好的重复利用.若同时有几百人甚至几千人在线,频繁的进行数据库连接操作将占用很多的系统资源,严重的甚至会造成服务器的崩溃。

      –      对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将导致重启数据库。

      –      这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃。

     2.数据库连接池

    • 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
    • 数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个

        JDBC 的数据库连接池使用 javax.sql.DataSource 来表示,DataSource 只是一个接口,该接口通常由服务器(Weblogic, WebSphere, Tomcat)提供实现,也有一些开源组织提供实现:

          DBCP 数据库连接池

         –      C3P0 数据库连接池

    3.DBCP:

    • DBCP 是 Apache 软件基金组织下的开源连接池实现,该连接池依赖该组织下的另一个开源系统:Common-pool. 如需使用该连接池实现,应在系统中增加如下两个 jar 文件:

      –      Commons-dbcp.jar:连接池的实现

      –      Commons-pool.jar:连接池实现的依赖库

    • Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用

        数据源和数据库连接不同,数据源无需创建多个,它是产生数据库连接的工厂,因此整个应用只需要一个数据源即可。

    • 当数据库访问结束后,程序还是像以前一样关闭数据库连接:conn.close(); 但上面的代码并没有关闭数据库的物理连接,它仅仅把数据库连接释放,归还给了数据库连接池

           数据源和数据库连接不同,数据源无需创建多个,它是产生数据库连接的工厂,因此整个应用只需要一个数据源即可。

    当数据库访问结束后,程序还是像以前一样关闭数据库连接:conn.close(); 但上面的代码并没有关闭数据库的物理连接,它仅仅把数据库连接释放,归还给了数据库连接池

     

    /**
         * 使用 DBCP 数据库连接池
         * 1. 加入 jar 包(2 个jar 包). 依赖于 Commons Pool
         * 2. 创建数据库连接池
         * 3. 为数据源实例指定必须的属性
         * 4. 从数据源中获取数据库连接
         * @throws SQLException 
         */
        @Test
        public void testDBCP() throws SQLException{
            final BasicDataSource dataSource = new BasicDataSource();
            
            //2. 为数据源实例指定必须的属性
            dataSource.setUsername("root");
            dataSource.setPassword("1230");
            dataSource.setUrl("jdbc:mysql:///atguigu");
            dataSource.setDriverClassName("com.mysql.jdbc.Driver");
            
            //3. 指定数据源的一些可选的属性.
            //1). 指定数据库连接池中初始化连接数的个数
            dataSource.setInitialSize(5);
            
            //2). 指定最大的连接数: 同一时刻可以同时向数据库申请的连接数
            dataSource.setMaxActive(5);
            
            //3). 指定小连接数: 在数据库连接池中保存的最少的空闲连接的数量 
            dataSource.setMinIdle(2);
            
            //4).等待数据库连接池分配连接的最长时间. 单位为毫秒. 超出该时间将抛出异常. 
            dataSource.setMaxWait(1000 * 5);
            
            //4. 从数据源中获取数据库连接
            Connection connection = dataSource.getConnection();
            System.out.println(connection.getClass()); 
            
            connection.close();
        }

     

    改进如下:

    /**
         * 1. 加载 dbcp 的 properties 配置文件: 配置文件中的键需要来自 BasicDataSource
         * 的属性.
         * 2. 调用 BasicDataSourceFactory 的 createDataSource 方法创建 DataSource
         * 实例
         * 3. 从 DataSource 实例中获取数据库连接. 
         */
        @Test
        public void testDBCPWithDataSourceFactory() throws Exception{
            
            Properties properties = new Properties();
            InputStream inStream = JDBCTest.class.getClassLoader()
                    .getResourceAsStream("dbcp.properties");
            properties.load(inStream);
            
            DataSource dataSource = 
                    BasicDataSourceFactory.createDataSource(properties);
            
            System.out.println(dataSource.getConnection()); 
        }
    username=root
    password=1230
    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql:///lhf
    
    initialSize=10
    maxActive=50
    minIdle=5
    maxWait=5000

    4.C3P0

    @Test
        public void testC3poWithConfigFile() throws Exception{
            DataSource dataSource = new ComboPooledDataSource("helloc3p0"); //加载配置文件中的named-config属性值所对应的配置
    System.out.println(dataSource.getConnection()); ComboPooledDataSource comboPooledDataSource = (ComboPooledDataSource) dataSource; System.out.println(comboPooledDataSource.getMaxStatements()); } @Test public void testC3P0() throws Exception{ ComboPooledDataSource cpds = new ComboPooledDataSource(); cpds.setDriverClass( "com.mysql.jdbc.Driver" ); //loads the jdbc driver  cpds.setJdbcUrl( "jdbc:mysql:///atguigu" ); cpds.setUser("root"); cpds.setPassword("1230"); System.out.println(cpds.getConnection()); }
    文件名:c3p0-config.xml

    <?
    xml version="1.0" encoding="UTF-8"?> <c3p0-config> <named-config name="helloc3p0"> <!-- 指定连接数据源的基本属性 --> <property name="user">root</property> <property name="password">1230</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql:///atguigu</property> <!-- 若数据库中连接数不足时, 一次向数据库服务器申请多少个连接 --> <property name="acquireIncrement">5</property> <!-- 初始化数据库连接池时连接的数量 --> <property name="initialPoolSize">5</property> <!-- 数据库连接池中的最小的数据库连接数 --> <property name="minPoolSize">5</property> <!-- 数据库连接池中的最大的数据库连接数 --> <property name="maxPoolSize">10</property> <!-- C3P0 数据库连接池可以维护的 Statement 的个数 --> <property name="maxStatements">20</property> <!-- 每个连接同时可以使用的 Statement 对象的个数 --> <property name="maxStatementsPerConnection">5</property> </named-config> </c3p0-config>

     看到一篇博客比此文写的详细,记录下来

    http://www.cnblogs.com/whgk/p/6442768.html

  • 相关阅读:
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车按键启动和蜂鸣器报警
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车指定花式动作
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车指定花式动作
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车指定花式动作
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车前后左右综合实验
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车前后左右综合实验
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车前后左右综合实验
    asp中设置session过期时间方法总结
    asp中设置session过期时间方法总结
    ASP.NET关于Session_End触发与否的问题
  • 原文地址:https://www.cnblogs.com/pjlhf/p/8681062.html
Copyright © 2020-2023  润新知