zoukankan      html  css  js  c++  java
  • JDBC连接池

    JDBC优化之连接池

    (一)连接池简介

    ① 为什么使用连接池?
    	数据库连接是一种关键的有限的昂贵的资源,传统数据库连接每发出一个请求都要创建一个连接对象,使用完直接关闭不能重复利用;
    	关闭资源需要手动完成,一旦忘记会造成内存溢出;
    	请求过于频繁的时候,创建连接极其消耗内存;
    	而且一旦高并发访问数据库,有可能会造成系统崩溃。
    	为了解决这些问题,我们可以使用连接池。
    
    ② 连接池原理
    	数据库连接池负责分配、管理和释放数据库连接,它的核心思想就是连接复用.
        通过建立一个数据库连接池,这个池中有若干个连接对象,当用户想要连接数据库,就要先从连接池中获取连接对象,然后操作数据库。
        一旦连接池中的连接对象被用完了,判断连接对象的个数是否已达上限,如果没有可以再创建新的连接对象,如果已达上限,用户必须处于等待状态,等待其他用户释放连接对象,直到连接池中有被释放的连接对象了,这时候等待的用户才能获取连接对象,从而操作数据库。
        这样就可以使连接池中的连接得到高效、安全的复用,避免了数据库连接频繁创建、关闭的开销。这项技术明显提高对数据库操作的性能。
    
    ③ 连接池的优势
    	(1)程序启动时提前创建好连接,不用用户请求时创建,给服务器减轻压力;
    	(2)连接关闭的时候不会直接销毁connection,这样能够重复利用;
    	(3)如果超过设定的连接数量但是还没有达到最大值,那么可以再创建;
    	(4)如果空闲了,会默认销毁(释放)一些连接,让系统性能达到最优;
    
    常用的开源连接池
    	1. DBCP 
        	是Apache提供的数据库连接池,速度相对c3p0较快,但因自身存在BUG,Hibernate3已不再提供支持
    	2. C3P0
          	是一个开源组织提供的一个数据库连接池,速度相对较慢,稳定性还可以
       		Proxool 是sourceforge下的一个开源项目数据库连接池,有监控连接池状态的功能,稳定性较c3p0差一点
       		BoneCP 是一个开源组织提供的数据库连接池,速度快
    	3.Druid
        	是阿里提供的数据库连接池,据说是集DBCP 、C3P0 、Proxool 优点于一身的数据库连接池,但是速度不知道   是否有BoneCP快
    

    (二)连接池的使用:c3p0连接池

    ① 下载导包 c3p0-0.9.5.2.jar  mchange-commons-java-0.2.11.jar
    [https://www.mchange.com/projects/c3p0/](https://www.mchange.com/projects/c3p0/)
    
    第一种方式:代码配置
    	1. 创建c3p0连接池对象
    

    image

    2 配置信息 (必配)
    

    image

    3. 可以选配信息
    

    image

    4. 从池子中获取连接
    

    image

    代码
     @Test
        public void testInsert() throws PropertyVetoException, SQLException {
            ComboPooledDataSource dataSource = new ComboPooledDataSource();
            //配置连接池相关参数 驱动 地址  用户  密码
            dataSource.setDriverClass("com.mysql.jdbc.Driver");
            dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/day10");
            dataSource.setUser("root");
            dataSource.setPassword("root");
            Connection connection = dataSource.getConnection();
            Statement statement = connection.createStatement();
            statement.executeUpdate("insert into user values(null,'赵七','123',20,'男')");
            statement.close();
            //此时close不再直接释放资源,而是把连接返回到连接池中
            //close方法已经被重写 (装饰器模式、代理模式)实现
            connection.close();
        }
    
    第二种方式:配置文件方式  推荐使用
    	1 创建 c3p0.xml 放在src目录下 
    

    <?xml version="1.0" encoding="UTF-8"?>
    <c3p0-config>
    	<!-- 默认配置,如果没有指定则使用这个配置 -->
    	<default-config>
    		<!-- 四项基本配置 -->
    		<property name="driverClass">com.mysql.jdbc.Driver</property>
    		<property name="jdbcUrl">jdbc:mysql://localhost:3306/day10</property>
    		<property name="user">root</property>
    		<property name="password">root</property>
    		
    		<!-- 当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出
      			SQLException,如设为0则无限期等待。单位毫秒。Default: 0 -->
    		<property name="checkoutTimeout">30000</property>
    		
    		<!--隔多少秒检查连接池的空闲连接,0表示不检查-->
    		<property name="idleConnectionTestPeriod">30</property>
    		
    		<!-- 初始化连接数 -->
    		<property name="initialPoolSize">10</property>
    		
    		<!-- 连接的最大空闲时间,默认为0秒、不会关闭任何连接。设置30秒,30秒到期后,
    			连接若未使用就会被关闭 -->
    		<property name="maxIdleTime">30</property>
    		
    		<!-- 池中最多的连接存放数目 -->
    		<property name="maxPoolSize">100</property>
    		
    		<!-- 池中最少的连接存放数目 -->
    		<property name="minPoolSize">10</property>
    		<property name="maxStatements">200</property>
    		<user-overrides user="test-user">
    			<property name="maxPoolSize">10</property>
    			<property name="minPoolSize">1</property>
    			<property name="maxStatements">0</property>
    		</user-overrides>
    	</default-config>
    	
    </c3p0-config>
    
    
    2 使用
    	创建连接池对象 自动读取 配置文件信息
    
    @Test
        public void testDelete() throws PropertyVetoException, SQLException {
            //ComboPooledDataSource 会自动读取src 下 文件名 为c3p0-config.xml
            ComboPooledDataSource dataSource = new ComboPooledDataSource();
            Connection connection = dataSource.getConnection();
            Statement statement = connection.createStatement();
            statement.executeUpdate("delete from user where id = 3");
            statement.close();
            connection.close();
        }
    
  • 相关阅读:
    tar 命令详解
    必问的Java集合框架面试题
    计算机网络面试总结
    Java并发面试题
    error: cannot lock ref 'refs/remotes/origin/master': unable to resolve reference 'refs/remotes/origin/master': reference broken...
    String 类型的值能够被反射改变从而引发的意外事件
    dir 命令手册
    JVM可达性分析算法中,哪些可以作为 root ?
    Resnest:注意力+分组卷积的融合
    mmdetection(一)安装及训练、测试VOC格式的数据
  • 原文地址:https://www.cnblogs.com/conglingkaishi/p/15232255.html
Copyright © 2011-2022 走看看