dbcp和c3p0

1、應用程序直接獲取數據庫鏈接的缺點mysql

      用戶每次請求服務器都須要向數據戶獲取鏈接,數據庫建立鏈接一般須要消耗較大的資源。若是一個網站的訪問量有上萬次,無疑須要建立上萬個數據庫鏈接,極大地消耗數據庫的資源,而且會加大服務器的負擔,形成服務器內存溢出等問題。sql

2、使用數據路鏈接池的方式進行優化數據庫

    數據庫的鏈接池基本思想是爲數據庫創建一個「緩衝池」,預先在緩衝池中放入必定數量的鏈接,當須要創建數據庫鏈接時,只需從「緩衝池」中取出一個,使用完後再放回去。能夠經過設定鏈接池最大鏈接數來防止與服務器無盡的鏈接,數據庫鏈接池負責分配管理和釋放數據庫鏈接,容許應用程序重複使用現有的一個數據庫鏈接,而不是新創建一個。apache

    數據庫鏈接池在初始化時建立必定數量的鏈接放到鏈接池中,這些鏈接的數量由最小鏈接數來指定,不管這些數據庫是否被使用,鏈接池中都保證至少存在這麼多數量的鏈接,鏈接池的最大鏈接數的設定限制了該鏈接池可擁有鏈接的最大數量,當應用程序持續向服務請求鏈接,而且超過鏈接池最大鏈接數時,超過這些請求當被加入到等待隊列中。服務器

    數據庫鏈接池最小鏈接數和最大鏈接數:優化

       一、最小鏈接數是鏈接池一直保持的數據鏈接。若是應用程序對數據庫鏈接的使用量不大,將會有大量的數據庫鏈接資源被浪費掉。網站

       二、最大鏈接數是鏈接池能申請的最大鏈接數。若是數據鏈接請求超過此數,後面的數據鏈接請求將被加入到等待隊列中,這會影響以後的數據庫操做。ui

       三、若是最小鏈接數與最大鏈接數相差太大,那麼,最早的鏈接請求將會獲利,以後超過最小鏈接數量的鏈接請求等價於創建一個新的數據庫鏈接。不過,這些大於最小鏈接數的數據庫鏈接在使用完不會立刻被釋放,它將被放到鏈接池中等待重複使用或是空閒超時後被釋放。對象

3、開源的數據庫鏈接池隊列

     3.1  DBCP數據庫鏈接池

         DBCP 是apache軟件基金組織下的開源數據庫鏈接池,須要的兩個jar包分別是

原生的寫法以下:

BasicDataSource dataSource = null;
//一、建立數據源實例
dataSource = new BasicDataSource();

//二、爲數據庫實例自定必須的屬性
dataSource.setUsername("root");
dataSource.setPassword("123456");
dataSource.setUrl("jdbc:mysql:///test");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
 //三、指定數據源的一些可選的屬性
 //1)指定數據庫鏈接池中初始化鏈接數的個數
dataSource.setInitialSize(5);
// 2)指定最大的鏈接數:同一時刻能夠向數據庫申請的鏈接數
dataSource.setMaxActive(50);
//3)指定最小空閒鏈接數:在數據庫鏈接池中保存的最少的鏈接的數量
dataSource.setMinIdle(5);
//等待數據庫鏈接池分配鏈接的最長時間,單位爲毫秒
dataSource.setMaxWait(6*1000);
System.out.println(dataSource.getConnection());
System.out.println(dataSource.getConnection().getClass());

 在類路徑下加入dpcp的配置文件進行「去耦」操做,配置文件內容以下:

#鏈接池設置
driver =com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://127.0.0.1:3306/test
user=root
password=123456
初始化連接
initialSize=10
最大鏈接數量
maxActive=50
最大空閒鏈接
maxIdle =20
最小空閒鏈接
minIdle=20
maxWait = 60000

------------------------------------------------   

加載代碼以下

Properties properties = new Properties();
InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("jdbc.properties");
properties.load(inputStream);
DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);
System.out.println(dataSource);

     3.2 C3P0數據庫鏈接池   

須要的jar包

原生寫法:

ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass("com.mysql.jdbc.Driver");
cpds.setJdbcUrl("jdbc:mysql:///peixun");
cpds.setUser("root");
cpds.setPassword("");
System.out.println(cpds.getConnection())

 

配置文件寫法:

<c3p0-config>
    <named-config name="helloc3p0">


        <property name="user">root</property>
        <property name="password"></property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql:///peixun</property>

        <!--若數據庫中鏈接數不足時,一次想數據庫服務器申請多少鏈接-->
        <property name="acquireIncrement">50</property>
        <!--初始化數據庫鏈接池時鏈接的數量-->
        <property name="initialPoolSize">5</property>
        <!--數據庫鏈接池中的最小的數據庫鏈接數-->
        <property name="minPoolSize">50</property>
        <!--數據庫鏈接池中的最小的數據庫鏈接數-->
        <property name="maxPoolSize">1000</property>
        <!--c3p0數據庫鏈接池能夠維護的Statement的個數-->
        <property name="maxStatements">20</property>
        <!--每一個鏈接同時可使用的Statement對象的個數-->
        <property name="maxStatementsPerConnection">5</property>
    </named-config>


</c3p0-config>

 

加載代碼以下:

 DataSource dataSource =  new ComboPooledDataSource("helloc3p0");         System.out.println(dataSource.getConnection());         ComboPooledDataSource comboPooledDataSource =                 (ComboPooledDataSource)dataSource;         System.out.println(comboPooledDataSource.getMaxStatements());

相關文章
相關標籤/搜索