• java学习day24-数据库连接池(数据源)-c3p0


    数据库连接池

    什么是连接池

    池:指内存中的一片空间(容器,比如数组、集合)

    连接池:就是将连接存放在容器中,供整个程序共享,可以实现连接的复用,减少连接创建和关闭的次数,从而提高程序执行的效率!

    为什么要使用连接池

    1、传统方式操作数据库

    Connection conn = DriverManager.getConnection( url, user, pwd ); 
    //创建连接对象
    conn.close(); //关闭连接, 销毁连接
    

    在传统方式中,每次用户需要连接访问数据库时,都是创建一个连接对象,基于这个连接对象访问数据库,用完连接后,会将连接关闭(conn.close)。

    由于每次创建连接和关闭连接非常的耗时间而且耗资源,因此会导致程序执行的效率低下。

    2、使用连接池操作数据库

    可以在程序一启动时,就创建一批连接放在一个连接池中(容器),当用户需要连接时,就从连接池中获取一个连接对象,用完连接后,不要关闭,而是将连接再还回连接池中,这样一来,用来用去都是池中的这一批连接,实现了连接的复用,减少了连接创建和关闭的次数,从而提高了程序执行的效率!

    如何使用C3P0连接池

    dbcp/c3p0/druid

    使用C3P0连接池开发步骤:

    1、导入开发包

    2、创建数据库连接池(对象)

    ComboPooledDataSource cpds = new ComboPooledDataSource();
    

    3、设置连接数据库的基本信息

    (1)方式一:(不推荐) 直接将参数通过 pool.setXxx方法设置给c3p0程序

    这种方式直接将参数写死在了程序中,后期一旦参数发生变化,就要修改程序,要重新编译项目、重新发布项目,非常麻烦。

    //设置连接数据库的基本信息
    pool.setDriverClass( "com.mysql.jdbc.Driver" );
    pool.setJdbcUrl( "jdbc:mysql:///jt_db?characterEncoding=utf-8" );
    pool.setUser( "root" );
    pool.setPassword( "root" );
    

    (2)方式二:将连接参数提取到properties文件中(推荐)

    文件必须放在src(源码根目录)目录下 !

    文件名必须叫做 c3p0.properties !

    在类目录下(开发时可以放在src或者类似的源码目录下),添加一个c3p0.properties文件,配置内容如下:

    c3p0.driverClass=com.mysql.jdbc.Driver
    c3p0.jdbcUrl=jdbc:mysql:///jt_db?characterEncoding=utf-8
    c3p0.user=root
    c3p0.password=root
    

    这种方式由于是c3p0到指定的位置下寻找指定名称的properties文件,所以文件的位置必须是放在src或其他源码根目录下,文件名必须是c3p0.properties。

    (3)方式三:将连接参数提取到xml文件中(推荐)

    文件必须放在src(源码根目录)目录下 !

    文件名必须叫做 c3p0-config.xml

    在类目录下(开发时可以放在src或者类似的源码目录下),添加一个c3p0-config.xml文件,配置内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <c3p0-config>
        <default-config>
            <property name="driverClass">com.mysql.jdbc.Driver</property>
            <property
            name="jdbcUrl">jdbc:mysql:///jt_db?characterEncoding=utf-8</property>
            <property name="user">root</property>
            <property name="password">root</property>
        </default-config>
    </c3p0-config>
    

    这种方式由于是c3p0到指定的位置下寻找指定名称的xml文件,所以文件的位置必须是放在src或其他源码根目录下,文件名必须是c3p0-config.xml。

    4、从连接池中获取一个连接对象并进行使用

    Connection conn = pool.getConnection();
    

    5、用完连接后将连接还回连接池中

    JdbcUtil.close(conn, ps, rs);
    //conn.close()
    /* 如果是自己创建的连接对象,这个连接对象没有经过任何的改动,调用
    * conn.close方法,是将连接对象关闭
    * 如果是从连接池中获取的连接对象,该连接对象在返回时就已经被连接池
    * 改造了,将连接对象的close方法改为了还连接到连接池中
    */
    

    C3P0连接池常用配置

    <c3p0-config> 
    	<default-config>
    		<!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 --> 
    		<property name="initialPoolSize">3</property>
    		
    		<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> 
    		<property name="acquireIncrement">3</property> 
    
    		<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --> 
    		<property name="acquireRetryAttempts">30</property> 
    
    		<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
    		<property name="maxIdleTime">60</property> 
    
    		<!--连接池中保留的最大连接数。Default: 15 --> 
    		<property name="maxPoolSize">15</property> 
    		
    		<!--每60秒检查所有连接池中的空闲连接。Default: 0 --> 
    		<property name="idleConnectionTestPeriod">60</property> 
    		
    		<!--两次连接中间隔时间,单位毫秒。Default: 1000 --> 
    		<property name="acquireRetryDelay">1000</property> 
    
    		<!--连接关闭时默认将所有未提交的操作回滚。Default: false --> 
    		<property name="autoCommitOnClose">false</property> 
    
    		<!--c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么 
    		属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试 
    		使用。Default: null--> 
    		<property name="automaticTestTable">Test</property> 
    
    		<!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 
    		保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试 
    		获取连接失败后该数据源将申明已断开并永久关闭。Default: false--> 
    		<property name="breakAfterAcquireFailure">false</property> 
    
    		<!--当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出 
    		SQLException,如设为0则无限期等待。单位毫秒。Default: 0 --> 
    		<property name="checkoutTimeout">100</property> 
    
    		<!--通过实现ConnectionTester或QueryConnectionTester的类来测试连接。类名需制定全路径。 
    		Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester--> 
    		<property name="connectionTesterClassName"></property> 
    
    		<!--指定c3p0 libraries的路径,如果(通常都是这样)在本地即可获得那么无需设置,默认null即可 
    		Default: null--> 
    		<property name="factoryClassLocation">null</property> 
    
    		<!--Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs. 
    		(文档原文)作者强烈建议不使用的一个属性--> 
    		<property name="forceIgnoreUnresolvedTransactions">false</property> 
    
    		<!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements 
    		属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。 
    		如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0--> 
    		<property name="maxStatements">100</property> 
    
    		<!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 --> 
    		<property name="maxStatementsPerConnection"></property> 
    
    		<!--c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能 
    		通过多线程实现多个操作同时被执行。Default: 3--> 
    		<property name="numHelperThreads">3</property> 
    
    		<!--当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0 
    		的数据源时。Default: null--> 
    		<property name="overrideDefaultUser">root</property> 
    
    		<!--与overrideDefaultUser参数对应使用的一个参数。Default: null--> 
    		<property name="overrideDefaultPassword">password</property> 
    
    		<!--定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意: 
    		测试的表必须在初始数据源的时候就存在。Default: null--> 
    		<property name="preferredTestQuery">select id from test where id=1</property> 
    
    		<!--用户修改系统配置参数执行前最多等待300秒。Default: 300 --> 
    		<property name="propertyCycle">300</property> 
    
    		<!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的 
    		时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable 
    		等方法来提升连接测试的性能。Default: false --> 
    		<property name="testConnectionOnCheckout">false</property> 
    
    		<!--如果设为true那么在取得连接的同时将校验连接的有效性。Default: false --> 
    		<property name="testConnectionOnCheckin">true</property> 
    
    		<!--早期的c3p0版本对JDBC接口采用动态反射代理。在早期版本用途广泛的情况下这个参数 
    		允许用户恢复到动态反射代理以解决不稳定的故障。最新的非反射代理更快并且已经开始 
    		广泛的被使用,所以这个参数未必有用。现在原先的动态反射与新的非反射代理同时受到 
    		支持,但今后可能的版本可能不支持动态反射代理。Default: false--> 
    		<property name="usesTraditionalReflectiveProxies">false</property>
    
    		<property name="automaticTestTable">con_test</property> 
    		<property name="checkoutTimeout">30000</property> 
    		<property name="idleConnectionTestPeriod">30</property> 
    		<property name="initialPoolSize">10</property> 
    		<property name="maxIdleTime">30</property> 
    		<property name="maxPoolSize">25</property> 
    		<property name="minPoolSize">10</property> 
    		<property name="maxStatements">0</property> 
    	</default-config> 
    
    </c3p0-config>
    
    
  • 相关阅读:
    WordPress“无法将上传的文件移动至wp-content/uploads/”的解决办法
    npm安装less和less-loadernpm或者stylus和stylus-loader
    vue-cli脚手架安装
    JavaScript 中的回调函数
    css同时满足两个类名才有效果的写法
    jQuery对象与JS原生对象之间的转换
    css3在动画完成后执行事件
    5秒让你的View变3D,ThreeDLayout使用和实现
    给大家安利一个学习angular2的视频网站
    JAVA中的常量定义在class中还是interface中比较合理?
  • 原文地址:https://www.cnblogs.com/liqbk/p/13033235.html
Copyright © 2020-2023  润新知