連接池

1. 數據庫連接池

1.1 連接池概述

    連接池就是一次性創建多個連接,將多個連接緩存在內存中 ,形成數據庫連接池,如果應用程序需要操作數據庫,只需要從連接池中獲取一個連接,使用後,並不需要關閉連接,只需要將連接放回到連接池中。

1.2 連接池的優點

    節省創建連接與釋放連接性能消耗;

    連接池中連接起到複用的作用,提高程序性能。

沒有使用連接池的情景:


使用連接池的情景:


1.3 連接池原理

        連接池基本的思想是在系統初始化的時候,將數據庫連接作爲對象存儲在內存中,當用戶需要訪問數據庫時,並非建立一個新的連接,而是從連接池中取出一個已建立的空閒連接對象。使用完畢後,用戶也並非將連接關閉,而是將連接放回連接池中,以供下一個請求訪問使用。而連接的建立、斷開都由連接池自身來管理。同時,還可以通過設置連接池的參數來控制連接池中的初始連接數、連接的上下限數以及每個連接的最大使用次數、最大空閒時間等等。也可以通過其自身的管理機制來監視數據庫連接的數量、使用情況等。

2. 自定義連接池

(1)編寫連接池需實現javax.sql.DataSource接口。DataSource接口中定義了兩個重載的getConnection方法:

    •    Connection getConnection()

    •    Connection getConnection(String username,String password)

(2)實現DataSource接口,並實現連接池功能的步驟:

    •    在DataSource構造函數中批量創建與數據庫的連接,並把創建的連接保存到一個集合對象中;

    •    實現getConnection方法,讓getConnection方法每次調用時,從集合對象中取一個Connection返回給用戶;

    •    當用戶使用完Connection,調用Connection.close()方法時,Connection對象應保證將自己返回到連接池的集合對象中,而不要把conn還給數據庫。

 

        自定義連接池時儘量不要使用具體對象類型的引用(如MyDataSource dataSource = new MyDataSource(); 應該寫爲DataSource dataSource = new MyDataSource(););若連接對象Connection是通過連接池獲取的,當通過Connection對象調用close()方法時,不在是銷燬連接對象,而是將連接對象放回到連接池。

3. DBCP連接池

3.1 DBCP連接池概述

    DBCP 是 Apache 軟件基金組織下的開源連接池實現,使用DBCP數據源,應用程序應在系統中增加如下兩個 jar 文件:

        commons-dbcp.jar:連接池的實現

        commons-pool.jar:連接池實現的依賴庫

    Tomcat 的連接池正是採用該連接池來實現的。該數據庫連接池既可以與應用服務器整合使用,也可由應用程序獨立使用。

3.2 DBCP連接池的配置

(1)手動設置參數

    // 1.創建連接池對象

    BasicDataSource ds = new BasicDataSource();

    // 2.設置相關屬性

    ds.setDriverClassName("com.mysql.jdbc.Driver");

    ds.setUrl("jdbc:mysql:///test");

    ds.setUsername("root");

    ds.setPassword("root");

(2)通過配置文件設置

    //1.加載配置信息

    Properties props = new Properties();                                       

    props.load(new FileInputStream(properties配置文件路徑);

                 

    //properties文件內容

         driverClassName=com.mysql.jdbc.Driver

         url=jdbc:mysql:///test

         username=root

         password=root

 

    // 2.通過BasicDataSourceFactory獲取一個連接池對象

    DataSource ds = BasicDataSourceFactory.createDataSource(props);

4. C3P0連接池

4.1 C3P0連接池概述

    C3P0是一個開源的JDBC連接池,它實現了數據源和JNDI綁定,目前使用它的開源項目有Hibernate,Spring等。

4.2 C3P0連接池的配置

(1)手動配置

    //1.創建連接池對象

    ComboPooledDataSource ds = new ComboPooledDataSource();

    // 2.手動配置參數

    ds.setDriverClass("com.mysql.jdbc.Driver");

    ds.setJdbcUrl("jdbc:mysql:///test");

    ds.setUser("root");

    ds.setPassword("root");

(2)使用配置文件

    只要在src下創建c3p0.properties 或者 c3p0-config.xml名稱的配置文件,c3p0會自動查找

 

    ComboPooledDataSource ds = new ComboPooledDataSource();自動查找配置文件

 

在src/c3p0-config.xml

    <c3p0-config>

         <default-config>

                  <propertyname="driverClass">com.mysql.jdbc.Driver</property>

                  <propertyname="jdbcUrl">jdbc:mysql:///test</property>

                  <propertyname="user">root</property>

                  <propertyname="password">root</property>

         </default-config>

    </c3p0-config>

 

或者在src/c3p0.properties

        c3p0.jdbcUrl=jdbc:mysql://localhost:3306/test

        c3p0.driverClass=com.mysql.jdbc.Driver

        c3p0.user=root

        c3p0.password=root

 

常用基本連接池屬性:

   acquireIncrement   如果連接池中連接都被使用了,一次性增長3個新的連接

   initialPoolSize         連接池中初始化連接數量默認:3

   maxPoolSize           最大連接池中連接數量默認:15連接

   maxIdleTime          如果連接長時間沒有時間,將被回收默認:0 連接永不過期

   minPoolSize           連接池中最小連接數量 默認:3

 

 

c3p0與dbcp區別:

    (1)dbcp沒有自動回收空閒連接的功能;

    (2)c3p0有自動回收空閒連接功能。

5. Tomcat內置連接池
5.1 Tomcat內置連接池概述

        在web開發中,可以將連接池交給服務器管理,如果需要時,就可以直接從服務器中獲取連接對象。在tomcat中提供了一個context.xml文件,可以將連接池配置在這個文件中。

context.xml文件可以放置在三個位置:

        (1)tomcat/conf下  這個配置是被服務器下所有應用所使用的.

        (2)tomcat/Catalina/xxx目錄下,這個配置被某一個虛擬主機使用

        (3)在web工程的META-INF目錄下創建一個context.xml文件,它是被當前工程所使用

5.2 JDNI概述

        JNDI(Java Namingand Directory Interface,Java命名和目錄接口)是SUN公司提供的一種標準的Java命名系統接口,JNDI提供統一的客戶端API,通過不同的訪問提供者接口JNDI服務供應接口(SPI)的實現,由管理者將JNDI API映射爲特定的命名服務和目錄系統,使得Java應用程序可以和這些命名服務和目錄服務之間進行交互。目錄服務是命名服務的一種自然擴展 。

5.3 Tomcat內置連接池的配置

<Context>

      <Resource name="jdbc/abc"auth="Container"

                  type="javax.sql.DataSource"username="root" password="root"

                  driverClassName="com.mysql.jdbc.Driver"url="jdbc:mysql:///test"

                  maxActive="8"maxIdle="4"/>

</Context>

 

獲取連接的方法:

    Context context= new InitialContext(); // 初始化上下文對象

    Context envCtx =(Context) context.lookup("java:comp/env"); // 固定寫法

    DataSource ds =(DataSource) envCtx.lookup("jdbc/abc");// 通過綁定名稱,查找指定java對象


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章