三種數據庫連接池的配置及使用(For JDBC)


DBCP

一、導包

Apache官網下載DBCP包,導入兩個包路徑如下:

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

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

CSDN上jar包的下載地址:http://download.csdn.NET/detail/u012802702/9491642

二、代碼示例:

方式一:使用BasicDataSource 通過方法設置連接參數。

//獲取BasicDataSource並配置,開始....
        BasicDataSource source = new BasicDataSource();
    source.setDriverClassName("com.mysql.jdbc.Driver");
    source.setUrl("jdbc:mysql:///dbcptest");
    source.setUsername("root");
    source.setPassword("root");
//獲取BasicDataSource並配置,結束......
    try {
            conn = source.getConnection();
            ps = conn.prepareStatement("select * from account");
            rs = ps.executeQuery();
            while (rs.next()) {
                String name = rs.getString("name");
                System.out.println(name);
            } 
     } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    rs = null;
                }
            }
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    ps = null;
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    conn = null;
                }
            }
        }

其中的Close方法是被改寫過得,及不會真正的將連接關閉,而是將其放回到連接池中,對於所有的數據源一般都會改寫此方法(使用修飾)。

 

方式二:使用BasicDataSourceFactory +配置文件

 try {               //獲取並配置DataSource開始
            Properties prop = new Properties();
            prop.load(new FileReader("dbcp.properties"));
            BasicDataSourceFactory factory = new BasicDataSourceFactory();
            DataSource source = factory.createDataSource(prop);
        //獲取並配置DataSource,結束
            conn = source.getConnection();
            ps = conn.prepareStatement("select * from account");
            rs = ps.executeQuery();
            while (rs.next()) {
                String name = rs.getString("name");
                System.out.println(name);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    rs = null;
                }
            }
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    ps = null;
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    conn = null;
                }
            }
        }

配置文件dbcp.properties(注配置文件中的參數的名稱固定): 

driver=com.mysql.jdbc.Driver
url=jdbc:mysql:///dbcptest
user=root
password=root

另:配置文件中除了可以配置以上4個數據庫連接的必須信息外,還可以配置其他的參數,官方較完整的配置文件的參考如下:

#連接設置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc
username=root
password=
 
#<!-- 初始化創建的連接數,當不夠時再去創建 -->
initialSize=10
 
#最大連接數量,連接數連不能超過該值
maxActive=50
 
#<!-- 最大空閑連接,當空閑連接超過該值時就挨個關閉多余的連接,但不能小於minldle -->
maxIdle=20
 
#<!-- 最小空閑連接,空閑連接的最下值 -->
minIdle=5
 
#<!-- 超時等待時間以毫秒為單位 6000毫秒/1000等於60秒,當連接超過該時間便認為其實空閑連接 -->
maxWait=60000
 
 
#JDBC驅動建立連接時附帶的連接屬性屬性的格式必須為這樣:[屬性名=property;] 
#注意:"user" 與 "password" 兩個屬性會被明確地傳遞,因此這里不需要包含他們。
connectionProperties=useUnicode=true;characterEncoding=gbk
 
#指定由連接池所創建的連接的自動提交(auto-commit)狀態。
defaultAutoCommit=true
 
#driver default 指定由連接池所創建的連接的事務級別(TransactionIsolation)。
#可用值為下列之一:(詳情可見javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED

C3P0

一、導包

下載C3p0數據源的jar包導入如下jar包:

Lib\c3p0-0.9.1.2.jar

CDSN的下載地址:http://download.csdn.Net/detail/u012802702/9491641

二、示例

方式一:使用代碼配置參數

try{
            ComboPooledDataSource source = new ComboPooledDataSource();
            source.setDriverClass("com.mysql.jdbc.Driver");
            source.setJdbcUrl("jdbc:mysql:///day11");
            source.setUser("root");
            source.setPassword("root");
            
            conn = source.getConnection();
            ps = conn.prepareStatement("select * from account");
            rs = ps.executeQuery();
            while(rs.next()){
                String name = rs.getString("name");
                System.out.println(name);
            }
        }catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(rs!=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }finally{
                    rs = null;
                }
            }
            if(ps!=null){
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }finally{
                    ps = null;
                }
            }
            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }finally{
                    conn = null;
                }
            }
        }
    }

方式二:配置文件的方式加載數據庫驅動信息 

C3p0的使用較為簡單,通常來說只要在src目錄下添加一個c3p0的配置文件,在程序中使用一句代碼

1)ComboPooledDataSource source = new ComboPooledDataSource()使用配置文件中的默認配置<default-config>,或者

2)ComboPooledDataSource source = new ComboPooledDataSource(“配置文件中name-config的名稱”)使用配置文件中的其他配置

 

默認情況下C3p0會在類加載路徑下搜索名稱為c3p0-config.xml的配置文件,因此該配置文件應該方式在類加載目錄、或者jar加載目錄、或者WEB-INF/classes、或類似目錄下。

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:///c3p0test</property>
    <property name="user">root</property>
    <property name="password">root</property>
  </default-config>
  <named-config name="mysql2"> 
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql:///c3p0test1</property>
    <property name="user">root</property>
    <property name="password">root</property>
  </named-config>
</c3p0-config>
    

當然在配置文件中可以配置數據庫連接池的其他相關信息,官方建議的基本配置參數有:

acquireIncrement:聲明當連接池中連接耗盡時再一次新生成多少個連接,默認為3個

initialPoolSize:當連接池啟動時,初始化連接的個數,必須在minPoolSize~maxPoolSize之間,默認為3

minPoolSize:任何時間連接池中保存的最小連接數,默認3

maxPoolSize:在任何時間連接池中所能擁有的最大連接數,默認15

maxIdleTime:超過多長時間連接自動銷毀,默認為0,即永遠不會自動銷毀

 代碼如下:

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class JDBCUtils {

    private static DataSource dataSource = null;
    
    static{
        dataSource = new ComboPooledDataSource("javawebapp");
    }
    
    public static Connection getConnection(){  
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
            throw new DBException("");
        }
    }
 
    public static void release(Connection connection) {
        try {
            if(connection != null){
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new DBException("");
        }
    }
    
}

 

C03p0的官方參考模板如下:

<c3p0-config>
  <default-config>
    <property name="automaticTestTable">con_test</property>
    <property name="checkoutTimeout">30000</property>
    <property name="idleConnectionTestPeriod">30</property>
<property name="initialPoolSize">10</property>
超過多長時間連接自動銷毀,默認為0,即永遠不會自動銷毀
    <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>

  <!-- This app is massive! -->
  <named-config name="intergalactoApp"> 
聲明當連接池中連接耗盡時再一次新生成多少個連接,默認為3個
<property name="acquireIncrement">50</property>
當連接池啟動時,初始化連接的個數,必須在minPoolSize~maxPoolSize之間,默認為3
<property name="initialPoolSize">100</property>
任何時間連接池中保存的最小連接數,默認3
<property name="minPoolSize">50</property>
在任何時間連接池中所能擁有的最大連接數,默認15
    <property name="maxPoolSize">1000</property>

    <!-- intergalactoApp adopts a different approach to configuring statement caching -->
    <property name="maxStatements">0</property> 
    <property name="maxStatementsPerConnection">5</property>

    <!-- he's important, but there's only one of him -->
    <user-overrides user="master-of-the-universe"> 
      <property name="acquireIncrement">1</property>
      <property name="initialPoolSize">1</property>
      <property name="minPoolSize">1</property>
      <property name="maxPoolSize">5</property>
      <property name="maxStatementsPerConnection">50</property>
    </user-overrides>
  </named-config>
</c3p0-config>

Tomcat內置數據源(DBCP) 

 

Tomcat中內置有數據源,而DBCP與tomcat同屬於Apache的項目,因此不難知道tomcat中內置的數據源其實就是DBCP數據源。使用Tomcat的內置數據源可分為兩步:

 

一:為tomcat配置數據源

通常情況下,在使用eclipse或Myeclipse開發時,自己習慣於使用如下方式為tomcat配置數據源:

在web應用的META-INF文件夾下創建一個context.xml配置文件,並在其中添加<Context>標簽進行配置,但,這種方式生成的數據源只能用於當前web應用.

詳細context.xml文件的參考代碼如下:

<?xml version="1.0" encoding="utf-8" ?>
<Context>
<Resource name="jdbc/EmployeeDB" 當前創建數據連接池的名字,自己定義,在使用jndi容器獲取該數據源對象時會用到
            auth="Container" 作者
            type="javax.sql.DataSource" 對象類型這里固定為DataSource即可
            username="dbusername" 數據庫連接的用戶名
            password="dbpassword" 連接密碼
            driverClassName="com.mysql.jdbc.Driver" 驅動
            url="jdbc:mysql:///dbcptest" 數據庫的url
            maxActive="8"  DBCP的參數,DBCP的其他參數可以加入
            maxIdle="4"/>
</Context>

在tomcat啟動時,會逐個加載其中的web應用,當其加載到當前應用時,會加載到META-INF文件夾下該context.xml配置文件,此時tomcat會根據其中的配置信息為當前web應用創建一個數據庫連接池,注該數據庫連接池只能用於當前web應用,tomcat下的其他web應用無法使用該數據庫連接池。至於如何配置tomcat的數據庫連接池才能使當前tomcat下的所有web應用都能使用,或者可以使當前虛擬主機下的web應用都能使用?請參考其他文章:http://blog.csdn.net/u012802702/article/details/51159547。 

二、程序中獲取數據源

當tomcat讀取到context.xml配置文件時會為當前web應用創建數據源,但我們在當前web應用中如何獲取該數據源對象?

Tomcat中有一個共有的容器:jndi,當Tomcat為web應用創建數據源之后會將數據源以鍵值對的形式存放到jndi容器當中,其中鍵名就是數據源配置時給定的名字(詳見context.xml配置文件)。

而Tomcat會自動將jndi容器放到初始化容器InitalContext中。且jndi以固定的名字(Java:comp/env)存儲在InitalContext容器中,因此在web應用中可以通過如下步驟首先獲取到數據源實例。

第一步:首先在Servlet中獲取InitalContext容器實例

Context initCtx = new InitialContext();

第二步:在InitalContext容器中根據字符串java:comp/env搜尋,以及獲取jndi容器實例

Context jndi = (Context) initCtx.lookup("java:comp/env");

第三部:根據數據源的名字從jndi容器獲取到數據源實例。

DataSource source = jndi.lookUp("mySource");

完整參考代碼如下:

Context initCtx = new InitialContext();
Context jndi = (Context) initCtx.lookup("java:comp/env");
DataSource source = jndi.lookUp("mySource");

但到此獲取到數據源對象還沒有結束,因為獲取jndi的代碼只能在Servlet中執行,即以上代碼只能在Servlet中執行,因此還應創建一個Servlet類並在其init方法中加入以上代碼,之后便可以將數據源對象傳給其他程序使用(可以將數據源對象設為類變量、或將其放入到ServletContext作用域中等等)。同時將該Servlet配置成為tomcat啟動時執行(即在web.xml配置文件中對應的該Servlet標簽下添加:<load-on-startup>1</load-on-startup>)。

參考代碼如下:

@Override
    public void init() throws ServletException {
        try{
            Context initCtx = new InitialContext();
            Context jndi = (Context) initCtx.lookup("java:comp/env");
            DataSource source = (DataSource) jndi.lookup("mySource");
            this.getServletContext().setAttribute(“dataSource”,source);
        }catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM