设为首页 收藏本站
查看: 517|回复: 0

[经验分享] MySql数据库连接池

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-9-5 09:16:14 | 显示全部楼层 |阅读模式


1.传统链接(如下为示意图)
Center.jpg


注意:

(1).传统方式找DriverManager要连接,数目是有限的。

(2).传统方式的close(),并没有将Connection重用,只是切断应用程序和数据库的桥梁,即无发送到SQL命令到数据库端执行

(3).项目中,对于Connection不说,不会直接使用DriverManager取得,而使用连接池方式。

2.采用连接池(示意图)
Center.jpg


3.开源数据库连接池

(1).现在很多Web服务器(Weblogic, WebSphere, Tomcat)都提供了DataSoruce的实现,即连接池的实现。通常我们把DataSource的实现,按其英文含义称之为数据源,数据源中都包含了数据库连接池的实现。
(2).也有一些开源组织提供了数据源的独立实现:
       DBCP 数据库连接池(tomcat)
       C3P0 数据库连接池(hibernate)
(3).实际应用时不需要编写连接数据库代码,直接从数据源获得数据库的连接。程序员编程时也应尽量使用这些数据源的实现,以提升程序的数据库访问性能。

4.C3P0的使用:
(1).在classpath的路径下配置xml文件,即src的文件下而且这个文件名必须是c3p0-config.xml

原始的c3p0-config.xml的文件参数:

[html] view plaincopyprint?

    <c3p0-config>  
        <default-config>  
            <!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->  
            <property name="acquireIncrement">3</property>  
      
            <!-- 定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->  
            <property name="acquireRetryAttempts">30</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>  
      
            <!-- 每60秒检查所有连接池中的空闲连接。Default: 0 -->  
            <property name="idleConnectionTestPeriod">60</property>  
      
            <!-- 初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->  
            <property name="initialPoolSize">3</property>  
      
            <!-- 最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->  
            <property name="maxIdleTime">60</property>  
      
            <!-- 连接池中保留的最大连接数。Default: 15 -->  
            <property name="maxPoolSize">15</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="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>  
      
            <!-- 用户名。Default: null-->  
            <property name="user">root</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>  
            <user-overrides user="swaldman">  
            </user-overrides>  
        </default-config>  
        <named-config name="dumbTestConfig">  
            <property name="maxStatements">200</property>  
            <user-overrides user="poop">  
                <property name="maxStatements">300</property>  
            </user-overrides>  
        </named-config>  
    </c3p0-config>  


实战练习:
1>.首先配置c3p0-config.xml文件

[html] view plaincopyprint?

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


2>.代码操作连接(TestC3P0.java)



    package cn.wwh.www.java.jdbc.datasource;  
      
    import java.sql.Connection;  
      
    import com.mchange.v2.c3p0.ComboPooledDataSource;  
      
    /**
     *类的作用:
     *
     *
     *@author 一叶扁舟
     *@version 1.0
     *@创建时间: 2014-9-2   上午12:02:13
     */  
      
    //测试连接池C3P0的用法  
    public class TestC3P0 {  
        public static void main(String[] args) throws Exception {  
            long begin = System.currentTimeMillis();  
            //创建C3P0连接池,并加载c3p0-config.xml文件  
            ComboPooledDataSource dataSource = new ComboPooledDataSource();  
            for(int i=1;i<=1000000;i++){  
                Connection conn = dataSource.getConnection();  
                if(conn!=null){  
                    System.out.println("获取连接第"+i+"个");  
                    conn.close();  
                }  
            }  
            long end = System.currentTimeMillis();  
            System.out.println("用了" + (end-begin)/1000+"秒");  
        }  
    }  

5.DBCP的使用:
(1).采用类加载的方式,文件名是:dbcp.properties

[html] view plaincopyprint?

    driverClassName=com.mysql.jdbc.Driver  
    url=jdbc:mysql://127.0.0.1:3306/jdbctest  
    username=root  
    password=wwh  


(2).在代码中使用(TestDBCP.java)



    package cn.wwh.www.java.jdbc.datasource;  
      
    import java.io.InputStream;  
    import java.sql.Connection;  
    import java.util.Properties;  
      
    import javax.sql.DataSource;  
      
    import org.apache.commons.dbcp.BasicDataSourceFactory;  
      
    /**
     *类的作用:采用DBCP连接池的方式去获取数据库的链接,并测试他的时间
     *
     *
     *@author 一叶扁舟
     *@version 1.0
     *@创建时间: 2014-9-1   下午09:27:59
     */  
      
    //测试连接池DBCP的用法  
    public class TestDBCP {  
        public static void main(String[] args) throws Exception {  
            long begin = System.currentTimeMillis();  
            //加载属性文件  
            InputStream is = TestDBCP.class.getClassLoader().getResourceAsStream("cn/wwh/www/java/jdbc/config/dbcp.properties");  
            Properties props = new Properties();  
            props.load(is);  
            //创建DBCP连接池工厂  
            BasicDataSourceFactory factory = new BasicDataSourceFactory();   
            //创建数据源,即连接池  
            DataSource ds = factory.createDataSource(props);  
            for(int i=1;i<=1000000;i++){  
                //从连接池中取得一个空闲的连接对象  
                Connection conn = ds.getConnection();  
                if(conn!=null){  
                    System.out.println("获取连接第"+i+"个");  
                }  
                //将连接对象还回给连接池  
                conn.close();  
            }  
            long end = System.currentTimeMillis();  
            System.out.println("用了" + (end-begin)/1000+"秒");  
        }  
    }  


第一的测试时间为18秒,第二个的测试时间为13秒,不同的机器性能不一样,测试的时间快慢也不可能。但是理论上C3P0的速度应该更快,但是我测试的数据却恰恰相反,很是奇怪。


总结:

   1>DBCP和C3P0,都是Java开源的,都必须直接或间接实现javax.sql.DataSource接口
   2>DBCP连接池需要dbcp.properties文件,同时需加入3个对应的jar包
   3>C3P0连接池需要在/WEB-INF/classes/目录下存放c3p0-config.xml文件,该类ComboPooledDataSource在创建时
     会自动在指定的目录下找xml文件,并加载默认设置

   4>tomcat用的也是c3p0

6.导入的jar包

commons-dbcp.jar:DBCP实现要导入的jar

commons-pool.jar: 连接池实现的依赖类

commons-collections.jar :连接池实现的集合类

c3p0-0.9.1.2.jar :C3P0实现要导入的jar包




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-24476-1-1.html 上篇帖子: ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.56.105' (113) 下篇帖子: MHA+非root用户SSH等效性配置 数据库连接
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表