<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 32,  comments - 149,  trackbacks - 0
    1. 引言

      近年來,隨著Internet/Intranet建網(wǎng)技術(shù)的飛速發(fā)展和在世界范圍內(nèi)的迅速普及,計(jì)算機(jī)

      應(yīng)用程序已從傳統(tǒng)的桌面應(yīng)用轉(zhuǎn)到Web應(yīng)用。基于B/S(Browser/Server)架構(gòu)的3層開發(fā)模式逐漸取代C/S(Client/Server)架構(gòu)的開發(fā)模式,成為開發(fā)企業(yè)級應(yīng)用和電子商務(wù)普遍采用的技術(shù)。在Web應(yīng)用開發(fā)的早期,主要使用的技術(shù)是CGIASPPHP等。之后,Sun公司推出了基于Java語言的Servlet+Jsp+JavaBean技術(shù)。相比傳統(tǒng)的開發(fā)技術(shù),它具有跨平臺﹑安全﹑有效﹑可移植等特性,這使其更便于使用和開發(fā)。

      Java應(yīng)用程序訪問數(shù)據(jù)庫的基本原理

      在Java語言中,JDBC(Java DataBase Connection)是應(yīng)用程序與數(shù)據(jù)庫溝通的橋梁,

      即Java語言通過JDBC技術(shù)訪問數(shù)據(jù)庫。JDBC是一種“開放”的方案,它為數(shù)據(jù)庫應(yīng)用開發(fā)人員﹑數(shù)據(jù)庫前臺工具開發(fā)人員提供了一種標(biāo)準(zhǔn)的應(yīng)用程序設(shè)計(jì)接口,使開發(fā)人員可以用純Java語言編寫完整的數(shù)據(jù)庫應(yīng)用程序。JDBC提供兩種API,分別是面向開發(fā)人員的API和面向底層的JDBC驅(qū)動程序API,底層主要通過直接的JDBC驅(qū)動和JDBC-ODBC橋驅(qū)動實(shí)現(xiàn)與數(shù)據(jù)庫的連接。

      一般來說,Java應(yīng)用程序訪問數(shù)據(jù)庫的過程(如圖1所示)是:

      ①裝載數(shù)據(jù)庫驅(qū)動程序;

      ②通過JDBC建立數(shù)據(jù)庫連接;

      ③訪問數(shù)據(jù)庫,執(zhí)行SQL語句;

      ④斷開數(shù)據(jù)庫連接。


    圖1 Java數(shù)據(jù)庫訪問機(jī)制
      JDBC作為一種數(shù)據(jù)庫訪問技術(shù),具有簡單易用的優(yōu)點(diǎn)。但使用這種模式進(jìn)行Web應(yīng)用
      程序開發(fā),存在很多問題:首先,每一次Web請求都要建立一次數(shù)據(jù)庫連接。建立連接是一個(gè)費(fèi)時(shí)的活動,每次都得花費(fèi)0.05s~1s的時(shí)間,而且系統(tǒng)還要分配內(nèi)存資源。這個(gè)時(shí)間對于一次或幾次數(shù)據(jù)庫操作,或許感覺不出系統(tǒng)有多大的開銷。可是對于現(xiàn)在的Web應(yīng)用,尤其是大型電子商務(wù)網(wǎng)站,同時(shí)有幾百人甚至幾千人在線是很正常的事。在這種情況下,頻繁的進(jìn)行數(shù)據(jù)庫連接操作勢必占用很多的系統(tǒng)資源,網(wǎng)站的響應(yīng)速度必定下降,嚴(yán)重的甚至?xí)斐煞?wù)器的崩潰。不是危言聳聽,這就是制約某些電子商務(wù)網(wǎng)站發(fā)展的技術(shù)瓶頸問題。其次,對于每一次數(shù)據(jù)庫連接,使用完后都得斷開。否則,如果程序出現(xiàn)異常而未能關(guān)閉,將會導(dǎo)致數(shù)據(jù)庫系統(tǒng)中的內(nèi)存泄漏,最終將不得不重啟數(shù)據(jù)庫。還有,這種開發(fā)不能控制被創(chuàng)建的連接對象數(shù),系統(tǒng)資源會被毫無顧及的分配出去,如連接過多,也可能導(dǎo)致內(nèi)存泄漏,服務(wù)器崩潰。
    ?
      數(shù)據(jù)庫連接池(connection pool)的工作原理
      1、基本概念及原理
    由上面的分析可以看出,問題的根源就在于對數(shù)據(jù)庫連接資源的低效管理。我們知道,
      對于共享資源,有一個(gè)很著名的設(shè)計(jì)模式:資源池(Resource Pool)。該模式正是為了解決資源的頻繁分配﹑釋放所造成的問題。為解決上述問題,可以采用數(shù)據(jù)庫連接池技術(shù)。數(shù)據(jù)庫連接池的基本思想就是為數(shù)據(jù)庫連接建立一個(gè)“緩沖池”。預(yù)先在緩沖池中放入一定數(shù)量的連接,當(dāng)需要建立數(shù)據(jù)庫連接時(shí),只需從“緩沖池”中取出一個(gè),使用完畢之后再放回去。我們可以通過設(shè)定連接池最大連接數(shù)來防止系統(tǒng)無盡的與數(shù)據(jù)庫連接。更為重要的是我們可以通過連接池的管理機(jī)制監(jiān)視數(shù)據(jù)庫的連接的數(shù)量﹑使用情況,為系統(tǒng)開發(fā)﹑測試及性能調(diào)整提供依據(jù)。連接池的基本工作原理見下圖2。

    圖2 連接池的基本工作原理
      2、服務(wù)器自帶的連接池
      JDBC的API中沒有提供連接池的方法。一些大型的WEB應(yīng)用服務(wù)器如BEA的WebLogic和IBM的WebSphere等提供了連接池的機(jī)制,但是必須有其第三方的專用類方法支持連接池的用法。
      連接池關(guān)鍵問題分析
      1、并發(fā)問題
      為了使連接管理服務(wù)具有最大的通用性,必須考慮多線程環(huán)境,即并發(fā)問題。這個(gè)問題相對比較好解決,因?yàn)?a target="_blank">Java語言自身提供了對并發(fā)管理的支持,使用synchronized關(guān)鍵字即可確保線程是同步的。使用方法為直接在類方法前面加上synchronized關(guān)鍵字,如:
    public synchronized Connection getConnection()
      2、多數(shù)據(jù)庫服務(wù)器和多用戶
      對于大型的企業(yè)級應(yīng)用,常常需要同時(shí)連接不同的數(shù)據(jù)庫(如連接OracleSybase)。如何連接不同的數(shù)據(jù)庫呢?我們采用的策略是:設(shè)計(jì)一個(gè)符合單例模式的連接池管理類,在連接池管理類的唯一實(shí)例被創(chuàng)建時(shí)讀取一個(gè)資源文件,其中資源文件中存放著多個(gè)數(shù)據(jù)庫的url地址(<poolName.url>)﹑用戶名(<poolName.user>)﹑密碼(<poolName.password>)等信息。如tx.url=192.168.1.123:5000/tx_it,tx.user=cyl,tx.password=123456。根據(jù)資源文件提供的信息,創(chuàng)建多個(gè)連接池類的實(shí)例,每一個(gè)實(shí)例都是一個(gè)特定數(shù)據(jù)庫的連接池。連接池管理類實(shí)例為每個(gè)連接池實(shí)例取一個(gè)名字,通過不同的名字來管理不同的連接池。
      對于同一個(gè)數(shù)據(jù)庫有多個(gè)用戶使用不同的名稱和密碼訪問的情況,也可以通過資源文件處理,即在資源文件中設(shè)置多個(gè)具有相同url地址,但具有不同用戶名和密碼的數(shù)據(jù)庫連接信息。
      3、事務(wù)處理
      我們知道,事務(wù)具有原子性,此時(shí)要求對數(shù)據(jù)庫的操作符合“ALL-ALL-NOTHING”原則,即對于一組SQL語句要么全做,要么全不做。
    Java語言中,Connection類本身提供了對事務(wù)的支持,可以通過設(shè)置Connection的AutoCommit屬性為false,然后顯式的調(diào)用commit或rollback方法來實(shí)現(xiàn)。但要高效的進(jìn)行Connection復(fù)用,就必須提供相應(yīng)的事務(wù)支持機(jī)制。可采用每一個(gè)事務(wù)獨(dú)占一個(gè)連接來實(shí)現(xiàn),這種方法可以大大降低事務(wù)管理的復(fù)雜性。
      4、連接池的分配與釋放
      連接池的分配與釋放,對系統(tǒng)的性能有很大的影響。合理的分配與釋放,可以提高連接的復(fù)用度,從而降低建立新連接的開銷,同時(shí)還可以加快用戶的訪問速度。
      對于連接的管理可使用空閑池。即把已經(jīng)創(chuàng)建但尚未分配出去的連接按創(chuàng)建時(shí)間存放到一個(gè)空閑池中。每當(dāng)用戶請求一個(gè)連接時(shí),系統(tǒng)首先檢查空閑池內(nèi)有沒有空閑連接。如果有就把建立時(shí)間最長(通過容器的順序存放實(shí)現(xiàn))的那個(gè)連接分配給他(實(shí)際是先做連接是否有效的判斷,如果可用就分配給用戶,如不可用就把這個(gè)連接從空閑池刪掉,重新檢測空閑池是否還有連接);如果沒有則檢查當(dāng)前所開連接池是否達(dá)到連接池所允許的最大連接數(shù)(maxConn),如果沒有達(dá)到,就新建一個(gè)連接,如果已經(jīng)達(dá)到,就等待一定的時(shí)間(timeout)。如果在等待的時(shí)間內(nèi)有連接被釋放出來就可以把這個(gè)連接分配給等待的用戶,如果等待時(shí)間超過預(yù)定時(shí)間timeout,則返回空值(null)。系統(tǒng)對已經(jīng)分配出去正在使用的連接只做計(jì)數(shù),當(dāng)使用完后再返還給空閑池。對于空閑連接的狀態(tài),可開辟專門的線程定時(shí)檢測,這樣會花費(fèi)一定的系統(tǒng)開銷,但可以保證較快的響應(yīng)速度。也可采取不開辟專門線程,只是在分配前檢測的方法。
      5、連接池的配置與維護(hù)
      連接池中到底應(yīng)該放置多少連接,才能使系統(tǒng)的性能最佳?系統(tǒng)可采取設(shè)置最小連接數(shù)(minConn)和最大連接數(shù)(maxConn)來控制連接池中的連接。最小連接數(shù)是系統(tǒng)啟動時(shí)連接池所創(chuàng)建的連接數(shù)。如果創(chuàng)建過多,則系統(tǒng)啟動就慢,但創(chuàng)建后系統(tǒng)的響應(yīng)速度會很快;如果創(chuàng)建過少,則系統(tǒng)啟動的很快,響應(yīng)起來卻慢。這樣,可以在開發(fā)時(shí),設(shè)置較小的最小連接數(shù),開發(fā)起來會快,而在系統(tǒng)實(shí)際使用時(shí)設(shè)置較大的,因?yàn)檫@樣對訪問客戶來說速度會快些。最大連接數(shù)是連接池中允許連接的最大數(shù)目,具體設(shè)置多少,要看系統(tǒng)的訪問量,可通過反復(fù)測試,找到最佳點(diǎn)。
      如何確保連接池中的最小連接數(shù)呢?有動態(tài)和靜態(tài)兩種策略。動態(tài)即每隔一定時(shí)間就對連接池進(jìn)行檢測,如果發(fā)現(xiàn)連接數(shù)量小于最小連接數(shù),則補(bǔ)充相應(yīng)數(shù)量的新連接,以保證連接池的正常運(yùn)轉(zhuǎn)。靜態(tài)是發(fā)現(xiàn)空閑連接不夠時(shí)再去檢查。
    連接池的實(shí)現(xiàn)
      1、連接池模型
      本文討論的連接池包括一個(gè)連接池類(DBConnectionPool)和一個(gè)連接池管理類(DBConnetionPoolManager)和一個(gè)配置文件操作類(ParseDSConfig)。連接池類是對某一數(shù)據(jù)庫所有連接的“緩沖池”,主要實(shí)現(xiàn)以下功能:①從連接池獲取或創(chuàng)建可用連接;②使用完畢之后,把連接返還給連接池;③在系統(tǒng)關(guān)閉前,斷開所有連接并釋放連接占用的系統(tǒng)資源;④還能夠處理無效連接(原來登記為可用的連接,由于某種原因不再可用,如超時(shí),通訊問題),并能夠限制連接池中的連接總數(shù)不低于某個(gè)預(yù)定值和不超過某個(gè)預(yù)定值。(5)當(dāng)多數(shù)據(jù)庫時(shí),且數(shù)據(jù)庫是動態(tài)增加的話,將會加到配置文件中。
      連接池管理類是連接池類的外覆類(wrapper),符合單例模式,即系統(tǒng)中只能有一個(gè)連接池管理類的實(shí)例。其主要用于對多個(gè)連接池對象的管理,具有以下功能:①裝載并注冊特定數(shù)據(jù)庫的JDBC驅(qū)動程序;②根據(jù)屬性文件給定的信息,創(chuàng)建連接池對象;③為方便管理多個(gè)連接池對象,為每一個(gè)連接池對象取一個(gè)名字,實(shí)現(xiàn)連接池名字與其實(shí)例之間的映射;④跟蹤客戶使用連接情況,以便需要是關(guān)閉連接釋放資源。連接池管理類的引入主要是為了方便對多個(gè)連接池的使用和管理,如系統(tǒng)需要連接不同的數(shù)據(jù)庫,或連接相同的數(shù)據(jù)庫但由于安全性問題,需要不同的用戶使用不同的名稱和密碼。
    ???????? 2、連接池實(shí)現(xiàn)(經(jīng)過本人改版,可以適用多數(shù)據(jù)庫類型的應(yīng)用以及一種數(shù)據(jù)庫類型多個(gè)數(shù)據(jù)庫且數(shù)據(jù)? 庫的數(shù)量可以動態(tài)增加的應(yīng)用程序)
    ???????? 1),DBConnectionPool.java?? 數(shù)據(jù)庫連接池類
    ???????? 2),DBConnectionManager?.java?? 數(shù)據(jù)庫管理類
    ???????? 3),DSConfigBean?.java??????????????? 單個(gè)數(shù)據(jù)庫連接信息Bean
    ???????? 4),ParseDSConfig.java??????????????? 操作多(這個(gè)'多'包括不同的數(shù)據(jù)庫和同一種數(shù)據(jù)庫有多個(gè)數(shù)據(jù)庫)
    ??????????????????????????????????????????????????????????? 數(shù)據(jù) 配置文件xml
    ???????? 5),ds.config.xml?????????????????????????? 數(shù)據(jù)庫配置文件xml
    ???????? 原代碼如下:?
    ??????? DBConnectionPool.java??
    ??????? ----------------------------------------------------------
    ????? /**
    ?*?數(shù)據(jù)庫連接池類
    ?*/
    package com.chunkyo.db;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.Timer;
    /**
    ?* @author chenyanlin
    ?*
    ?*/
    public class DBConnectionPool implements TimerListener {
    ?private Connection con=null;
    ?private int inUsed=0;??? //使用的連接數(shù)
    ?private ArrayList freeConnections = new ArrayList();//容器,空閑連接
    ?private int minConn;???? //最小連接數(shù)
    ?private int maxConn;???? //最大連接
    ?private String name;???? //連接池名字
    ?private String password; //密碼
    ?private String url;????? //數(shù)據(jù)庫連接地址
    ?private String driver;?? //驅(qū)動
    ?private String user;???? //用戶名
    ?public Timer timer;????? //定時(shí)
    ?/**
    ? *
    ? */
    ?public DBConnectionPool() {
    ??// TODO Auto-generated constructor stub
    ?}
    ?/**
    ? * 創(chuàng)建連接池
    ? * @param driver
    ? * @param name
    ? * @param URL
    ? * @param user
    ? * @param password
    ? * @param maxConn
    ? */
    ?public DBConnectionPool(String name, String driver,String URL, String user, String password, int maxConn)
    ?{
    ??this.name=name;
    ??this.driver=driver;
    ??this.url=URL;
    ??this.user=user;
    ??this.password=password;
    ??this.maxConn=maxConn;
    ?}
    ?/**
    ? * 用完,釋放連接
    ? * @param con
    ? */
    ?public synchronized void freeConnection(Connection con)
    ?{
    ??this.freeConnections.add(con);//添加到空閑連接的末尾
    ??this.inUsed--;
    ?}
    ?/**
    ? * timeout? 根據(jù)timeout得到連接
    ? * @param timeout
    ? * @return
    ? */
    ?public synchronized Connection getConnection(long timeout)
    ?{
    ??Connection con=null;
    ??if(this.freeConnections.size()>0)
    ??{
    ???con=(Connection)this.freeConnections.get(0);
    ???if(con==null)con=getConnection(timeout); //繼續(xù)獲得連接
    ??}
    ??else
    ??{
    ???con=newConnection(); //新建連接
    ??}
    ??if(this.maxConn==0||this.maxConn<this.inUsed)
    ??{
    ???con=null;//達(dá)到最大連接數(shù),暫時(shí)不能獲得連接了。
    ??}
    ??if(con!=null)
    ??{
    ???this.inUsed++;
    ??}
    ??return con;
    ?}
    ?/**
    ? *
    ? * 從連接池里得到連接
    ? * @return
    ? */
    ?public synchronized Connection getConnection()
    ?{
    ??Connection con=null;
    ??if(this.freeConnections.size()>0)
    ??{
    ???con=(Connection)this.freeConnections.get(0);
    ???this.freeConnections.remove(0);//如果連接分配出去了,就從空閑連接里刪除
    ???if(con==null)con=getConnection(); //繼續(xù)獲得連接
    ??}
    ??else
    ??{
    ???con=newConnection(); //新建連接
    ??}
    ??if(this.maxConn==0||this.maxConn<this.inUsed)
    ??{
    ???con=null;//等待 超過最大連接時(shí)
    ??}
    ??if(con!=null)
    ??{
    ???this.inUsed++;
    ???System.out.println("得到 "+this.name+" 的連接,現(xiàn)有"+inUsed+"個(gè)連接在使用!");
    ??}
    ??return con;
    ?}
    ?/**
    ? *釋放全部連接
    ? *
    ? */
    ?public synchronized void release()
    ?{
    ??Iterator allConns=this.freeConnections.iterator();
    ??while(allConns.hasNext())
    ??{
    ???Connection con=(Connection)allConns.next();
    ???try
    ???{
    ????con.close();
    ???}
    ???catch(SQLException e)
    ???{
    ????e.printStackTrace();
    ???}
    ???
    ??}
    ??this.freeConnections.clear();
    ???
    ?}
    ?/**
    ? * 創(chuàng)建新連接
    ? * @return
    ? */
    ?private Connection newConnection()
    ?{
    ??try {
    ???Class.forName(driver);
    ???con=DriverManager.getConnection(url, user, password);
    ??} catch (ClassNotFoundException e) {
    ???// TODO Auto-generated catch block
    ???e.printStackTrace();
    ???System.out.println("sorry can't find db driver!");
    ??} catch (SQLException e1) {
    ???// TODO Auto-generated catch block
    ???e1.printStackTrace();
    ???System.out.println("sorry can't create Connection!");
    ??}
    ??return con;
    ??
    ?}
    ?/**
    ? * 定時(shí)處理函數(shù)
    ? */
    ?public synchronized void TimerEvent()
    ?{
    ???? //暫時(shí)還沒有實(shí)現(xiàn)以后會加上的
    ?}
    ?/**
    ? * @param args
    ? */
    ?public static void main(String[] args) {
    ??// TODO Auto-generated method stub
    ?}
    ?/**
    ? * @return the driver
    ? */
    ?public String getDriver() {
    ??return driver;
    ?}
    ?/**
    ? * @param driver the driver to set
    ? */
    ?public void setDriver(String driver) {
    ??this.driver = driver;
    ?}
    ?/**
    ? * @return the maxConn
    ? */
    ?public int getMaxConn() {
    ??return maxConn;
    ?}
    ?/**
    ? * @param maxConn the maxConn to set
    ? */
    ?public void setMaxConn(int maxConn) {
    ??this.maxConn = maxConn;
    ?}
    ?/**
    ? * @return the minConn
    ? */
    ?public int getMinConn() {
    ??return minConn;
    ?}
    ?/**
    ? * @param minConn the minConn to set
    ? */
    ?public void setMinConn(int minConn) {
    ??this.minConn = minConn;
    ?}
    ?/**
    ? * @return the name
    ? */
    ?public String getName() {
    ??return name;
    ?}
    ?/**
    ? * @param name the name to set
    ? */
    ?public void setName(String name) {
    ??this.name = name;
    ?}
    ?/**
    ? * @return the password
    ? */
    ?public String getPassword() {
    ??return password;
    ?}
    ?/**
    ? * @param password the password to set
    ? */
    ?public void setPassword(String password) {
    ??this.password = password;
    ?}
    ?/**
    ? * @return the url
    ? */
    ?public String getUrl() {
    ??return url;
    ?}
    ?/**
    ? * @param url the url to set
    ? */
    ?public void setUrl(String url) {
    ??this.url = url;
    ?}
    ?/**
    ? * @return the user
    ? */
    ?public String getUser() {
    ??return user;
    ?}
    ?/**
    ? * @param user the user to set
    ? */
    ?public void setUser(String user) {
    ??this.user = user;
    ?}
    }

    -------------------------------------------
    ?DBConnectionManager?.java
    ------------------------------------------
    /**
    ?*?數(shù)據(jù)庫連接池管理類
    ?*/
    package com.chunkyo.db;
    import java.sql.Connection;
    import java.util.ArrayList;
    import java.util.Enumeration;
    import java.util.HashMap;
    import java.util.Hashtable;
    import java.util.Iterator;
    import java.util.Properties;
    import java.util.Vector;
    /**
    ?* @author chenyanlin
    ?*
    ?*/
    public class DBConnectionManager {
    ?static private DBConnectionManager instance;//唯一數(shù)據(jù)庫連接池管理實(shí)例類
    ?static private int clients;???????????????? //客戶連接數(shù)
    ?private Vector drivers? = new Vector();//驅(qū)動信息
    ?private Hashtable pools=new Hashtable();//連接池
    ?
    ?/**
    ? * 實(shí)例化管理類
    ? */
    ?public DBConnectionManager() {
    ??// TODO Auto-generated constructor stub
    ??this.init();
    ?}
    ?/**
    ? * 得到唯一實(shí)例管理類
    ? * @return
    ? */
    ?static synchronized public DBConnectionManager getInstance()
    ?{
    ??if(instance==null)
    ??{
    ???instance=new DBConnectionManager();
    ??}
    ??return instance;
    ??
    ?}
    ?/**
    ? * 釋放連接
    ? * @param name
    ? * @param con
    ? */
    ?public void freeConnection(String name, Connection con)
    ?{
    ??DBConnectionPool pool=(DBConnectionPool)pools.get(name);//根據(jù)關(guān)鍵名字得到連接池
    ??if(pool!=null)
    ??pool.freeConnection(con);//釋放連接
    ?}
    ?/**
    ? * 得到一個(gè)連接根據(jù)連接池的名字name
    ? * @param name
    ? * @return
    ? */
    ?public Connection getConnection(String name)
    ?{
    ??DBConnectionPool pool=null;
    ??Connection con=null;
    ??pool=(DBConnectionPool)pools.get(name);//從名字中獲取連接池
    ??con=pool.getConnection();//從選定的連接池中獲得連接
    ??if(con!=null)
    ??System.out.println("得到連接。。。");
    ??return con;
    ?}
    ?/**
    ? * 得到一個(gè)連接,根據(jù)連接池的名字和等待時(shí)間
    ? * @param name
    ? * @param time
    ? * @return
    ? */
    ?public Connection getConnection(String name, long timeout)
    ?{
    ??DBConnectionPool pool=null;
    ??Connection con=null;
    ??pool=(DBConnectionPool)pools.get(name);//從名字中獲取連接池
    ??con=pool.getConnection(timeout);//從選定的連接池中獲得連接
    ??System.out.println("得到連接。。。");
    ??return con;
    ?}
    ?/**
    ? * 釋放所有連接
    ? */
    ?public synchronized void release()
    ?{
    ??Enumeration allpools=pools.elements();
    ??while(allpools.hasMoreElements())
    ??{
    ???DBConnectionPool pool=(DBConnectionPool)allpools.nextElement();
    ???if(pool!=null)pool.release();
    ??}
    ??pools.clear();
    ?}
    ?/**
    ? * 創(chuàng)建連接池
    ? * @param props
    ? */
    ?private void createPools(DSConfigBean dsb)
    ?{
    ??DBConnectionPool dbpool=new DBConnectionPool();
    ??dbpool.setName(dsb.getName());
    ??dbpool.setDriver(dsb.getDriver());
    ??dbpool.setUrl(dsb.getUrl());
    ??dbpool.setUser(dsb.getUsername());
    ??dbpool.setPassword(dsb.getPassword());
    ??dbpool.setMaxConn(dsb.getMaxconn());
    ??System.out.println("ioio:"+dsb.getMaxconn());
    ??pools.put(dsb.getName(), dbpool);
    ?}
    ?/**
    ? * 初始化連接池的參數(shù)
    ? */
    ?private void init()
    ?{
    ??//加載驅(qū)動程序
    ??this.loadDrivers();
    ??//創(chuàng)建連接池
    ??Iterator alldriver=drivers.iterator();
    ??while(alldriver.hasNext())
    ??{
    ???this.createPools((DSConfigBean)alldriver.next());
    ???System.out.println("創(chuàng)建連接池。。。");
    ???
    ??}
    ??System.out.println("創(chuàng)建連接池完畢。。。");
    ?}
    ?/**
    ? * 加載驅(qū)動程序
    ? * @param props
    ? */
    ?private void loadDrivers()
    ?{
    ??ParseDSConfig pd=new ParseDSConfig();
    ?//讀取數(shù)據(jù)庫配置文件
    ??drivers=pd.readConfigInfo("ds.config.xml");
    ??System.out.println("加載驅(qū)動程序。。。");
    ?}
    ?/**
    ? * @param args
    ? */
    ?public static void main(String[] args) {
    ??// TODO Auto-generated method stub
    ?}
    }
    ----------------------------------------
    DSConfigBean.java
    ----------------------------------------
    /**
    ?*?配置文件Bean類
    ?*/
    package com.chunkyo.db;
    /**
    ?* @author chenyanlin
    ?*
    ?*/
    public class DSConfigBean {
    ?private String type???? =""; //數(shù)據(jù)庫類型
    ?private String name???? =""; //連接池名字
    ?private String driver?? =""; //數(shù)據(jù)庫驅(qū)動
    ?private String url????? =""; //數(shù)據(jù)庫url
    ?private String username =""; //用戶名
    ?private String password =""; //密碼
    ?private int maxconn? =0; //最大連接數(shù)
    ?/**
    ? *
    ? */
    ?public DSConfigBean() {
    ??// TODO Auto-generated constructor stub
    ?}
    ?/**
    ? * @param args
    ? */
    ?public static void main(String[] args) {
    ??// TODO Auto-generated method stub
    ?}
    ?/**
    ? * @return the driver
    ? */
    ?public String getDriver() {
    ??return driver;
    ?}
    ?/**
    ? * @param driver the driver to set
    ? */
    ?public void setDriver(String driver) {
    ??this.driver = driver;
    ?}
    ?/**
    ? * @return the maxconn
    ? */
    ?public int getMaxconn() {
    ??return maxconn;
    ?}
    ?/**
    ? * @param maxconn the maxconn to set
    ? */
    ?public void setMaxconn(int maxconn) {
    ??this.maxconn = maxconn;
    ?}
    ?/**
    ? * @return the name
    ? */
    ?public String getName() {
    ??return name;
    ?}
    ?/**
    ? * @param name the name to set
    ? */
    ?public void setName(String name) {
    ??this.name = name;
    ?}
    ?/**
    ? * @return the password
    ? */
    ?public String getPassword() {
    ??return password;
    ?}
    ?/**
    ? * @param password the password to set
    ? */
    ?public void setPassword(String password) {
    ??this.password = password;
    ?}
    ?/**
    ? * @return the type
    ? */
    ?public String getType() {
    ??return type;
    ?}
    ?/**
    ? * @param type the type to set
    ? */
    ?public void setType(String type) {
    ??this.type = type;
    ?}
    ?/**
    ? * @return the url
    ? */
    ?public String getUrl() {
    ??return url;
    ?}
    ?/**
    ? * @param url the url to set
    ? */
    ?public void setUrl(String url) {
    ??this.url = url;
    ?}
    ?/**
    ? * @return the username
    ? */
    ?public String getUsername() {
    ??return username;
    ?}
    ?/**
    ? * @param username the username to set
    ? */
    ?public void setUsername(String username) {
    ??this.username = username;
    ?}
    }
    -----------------------------------------------------
    ParseDSConfig.java
    -----------------------------------------------------
    /**
    ?*?操作配置文件類 讀? 寫 修改 刪除等操作
    ?*/
    package com.chunkyo.db;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    import java.util.Vector;
    import java.util.Iterator;
    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.JDOMException;
    import org.jdom.input.SAXBuilder;
    import org.jdom.output.Format;
    import org.jdom.output.XMLOutputter;
    /**
    ?* @author chenyanlin
    ?*
    ?*/
    public class ParseDSConfig {
    ?/**
    ? * 構(gòu)造函數(shù)
    ? */
    ?public ParseDSConfig() {
    ??// TODO Auto-generated constructor stub
    ?}
    ?/**
    ? * 讀取xml配置文件
    ? * @param path
    ? * @return
    ? */
    ?public Vector readConfigInfo(String path)
    ?{
    ??String rpath=this.getClass().getResource("").getPath().substring(1)+path;
    ??Vector dsConfig=null;
    ??FileInputStream fi = null;
    ??try
    ??{
    ???fi=new FileInputStream(rpath);//讀取路徑文件
    ???dsConfig=new Vector();
    ???SAXBuilder sb=new SAXBuilder();
    ???Document doc=sb.build(fi);
    ???Element root=doc.getRootElement();
    ???List pools=root.getChildren();
    ???Element pool=null;
    ???Iterator allPool=pools.iterator();
    ???while(allPool.hasNext())
    ???{
    ????pool=(Element)allPool.next();
    ????DSConfigBean dscBean=new DSConfigBean();
    ????dscBean.setType(pool.getChild("type").getText());
    ????dscBean.setName(pool.getChild("name").getText());
    ????System.out.println(dscBean.getName());
    ????dscBean.setDriver(pool.getChild("driver").getText());
    ????dscBean.setUrl(pool.getChild("url").getText());
    ????dscBean.setUsername(pool.getChild("username").getText());
    ????dscBean.setPassword(pool.getChild("password").getText());
    ????dscBean.setMaxconn(Integer.parseInt(pool.getChild("maxconn").getText()));
    ????dsConfig.add(dscBean);
    ???}
    ???
    ??} catch (FileNotFoundException e) {
    ???// TODO Auto-generated catch block
    ???e.printStackTrace();
    ??} catch (JDOMException e) {
    ???// TODO Auto-generated catch block
    ???e.printStackTrace();
    ??} catch (IOException e) {
    ???// TODO Auto-generated catch block
    ???e.printStackTrace();
    ??}
    ??
    ??finally
    ??{
    ???try {
    ????fi.close();
    ???} catch (IOException e) {
    ????// TODO Auto-generated catch block
    ????e.printStackTrace();
    ???}
    ??}
    ??
    ??return dsConfig;
    ?}
    /**
    ?*修改配置文件 沒時(shí)間寫 過段時(shí)間再貼上去 其實(shí)一樣的
    ?*/
    ?public void modifyConfigInfo(String path,DSConfigBean dsb) throws Exception
    ?{
    ??String rpath=this.getClass().getResource("").getPath().substring(1)+path;
    ??FileInputStream fi=null; //讀出
    ??FileOutputStream fo=null; //寫入
    ??
    ?}
    /**
    ?*增加配置文件
    ?*
    ?*/
    ?public void addConfigInfo(String path,DSConfigBean dsb)
    ?{
    ??String rpath=this.getClass().getResource("").getPath().substring(1)+path;
    ??FileInputStream fi=null;
    ??FileOutputStream fo=null;
    ??try
    ??{
    ???fi=new FileInputStream(rpath);//讀取xml流
    ???
    ???SAXBuilder sb=new SAXBuilder();
    ???
    ???Document doc=sb.build(fi); //得到xml
    ???Element root=doc.getRootElement();
    ???List pools=root.getChildren();//得到xml子樹
    ???
    ???Element newpool=new Element("pool"); //創(chuàng)建新連接池
    ???
    ???Element pooltype=new Element("type"); //設(shè)置連接池類型
    ???pooltype.setText(dsb.getType());
    ???newpool.addContent(pooltype);
    ???
    ???Element poolname=new Element("name");//設(shè)置連接池名字
    ???poolname.setText(dsb.getName());
    ???newpool.addContent(poolname);
    ???
    ???Element pooldriver=new Element("driver"); //設(shè)置連接池驅(qū)動
    ???pooldriver.addContent(dsb.getDriver());
    ???newpool.addContent(pooldriver);
    ???
    ???Element poolurl=new Element("url");//設(shè)置連接池url
    ???poolurl.setText(dsb.getUrl());
    ???newpool.addContent(poolurl);
    ???
    ???Element poolusername=new Element("username");//設(shè)置連接池用戶名
    ???poolusername.setText(dsb.getUsername());
    ???newpool.addContent(poolusername);
    ???
    ???Element poolpassword=new Element("password");//設(shè)置連接池密碼
    ???poolpassword.setText(dsb.getPassword());
    ???newpool.addContent(poolpassword);
    ???
    ???Element poolmaxconn=new Element("maxconn");//設(shè)置連接池最大連接
    ???poolmaxconn.setText(String.valueOf(dsb.getMaxconn()));
    ???newpool.addContent(poolmaxconn);
    ???pools.add(newpool);//將child添加到root
    ???Format format = Format.getPrettyFormat();
    ????? format.setIndent("");
    ????? format.setEncoding("utf-8");
    ????? XMLOutputter outp = new XMLOutputter(format);
    ????? fo = new FileOutputStream(rpath);
    ????? outp.output(doc, fo);
    ??} catch (FileNotFoundException e) {
    ???// TODO Auto-generated catch block
    ???e.printStackTrace();
    ??} catch (JDOMException e) {
    ???// TODO Auto-generated catch block
    ???e.printStackTrace();
    ??} catch (IOException e) {
    ???// TODO Auto-generated catch block
    ???e.printStackTrace();
    ??}
    ??finally
    ??{
    ???
    ??}
    ?}
    ?/**
    ? *刪除配置文件
    ? */
    ?public void delConfigInfo(String path,String name)
    ?{
    ??String rpath=this.getClass().getResource("").getPath().substring(1)+path;
    ??FileInputStream fi = null;
    ??FileOutputStream fo=null;
    ??try
    ??{
    ???fi=new FileInputStream(rpath);//讀取路徑文件
    ???SAXBuilder sb=new SAXBuilder();
    ???Document doc=sb.build(fi);
    ???Element root=doc.getRootElement();
    ???List pools=root.getChildren();
    ???Element pool=null;
    ???Iterator allPool=pools.iterator();
    ???while(allPool.hasNext())
    ???{
    ????pool=(Element)allPool.next();
    ????if(pool.getChild("name").getText().equals(name))
    ????{
    ?????pools.remove(pool);
    ?????break;
    ????}
    ???}
    ???Format format = Format.getPrettyFormat();
    ????? format.setIndent("");
    ????? format.setEncoding("utf-8");
    ????? XMLOutputter outp = new XMLOutputter(format);
    ????? fo = new FileOutputStream(rpath);
    ????? outp.output(doc, fo);
    ???
    ??} catch (FileNotFoundException e) {
    ???// TODO Auto-generated catch block
    ???e.printStackTrace();
    ??} catch (JDOMException e) {
    ???// TODO Auto-generated catch block
    ???e.printStackTrace();
    ??} catch (IOException e) {
    ???// TODO Auto-generated catch block
    ???e.printStackTrace();
    ??}
    ??
    ??finally
    ??{
    ???try {
    ????fi.close();
    ???} catch (IOException e) {
    ????// TODO Auto-generated catch block
    ????e.printStackTrace();
    ???}
    ??}
    ?}
    ?/**
    ? * @param args
    ? * @throws Exception
    ? */
    ?public static void main(String[] args) throws Exception {
    ??// TODO Auto-generated method stub
    ??ParseDSConfig pd=new ParseDSConfig();
    ??String path="ds.config.xml";
    ??pd.readConfigInfo(path);
    ??//pd.delConfigInfo(path, "tj012006");
    ??DSConfigBean dsb=new DSConfigBean();
    ??dsb.setType("oracle");
    ??dsb.setName("yyy004");
    ??dsb.setDriver("org.oracle.jdbc");
    ??dsb.setUrl("jdbc:oracle://localhost");
    ??dsb.setUsername("sa");
    ??dsb.setPassword("");
    ??dsb.setMaxconn(1000);
    ??pd.addConfigInfo(path, dsb);
    ??pd.delConfigInfo(path, "yyy001");
    ?}
    }

    --------------------------------------
    ds.config.xml?? 配置文件
    --------------------------------------


    <ds-config>
    <pool>
    <type>mysql</type>
    <name>user</name>
    <driver>com.mysql.jdbc.driver</driver>
    <url>jdbc:mysql://localhost:3306/user</url>
    <username>sa</username>
    <password>123456</password>
    <maxconn>100</maxconn>
    </pool>
    <pool>
    <type>mysql</type>
    <name>user2</name>
    <driver>com.mysql.jdbc.driver</driver>
    <url>jdbc:mysql://localhost:3306/user2</url>
    <username>sa</username>
    <password>1234</password>
    <maxconn>10</maxconn>
    </pool>
    <pool>
    <type>sql2000</type>
    <name>books</name>
    <driver>com.microsoft.sqlserver.driver</driver>
    <url>jdbc:sqlserver://localhost:1433/books:databasename=books</url>
    <username>sa</username>
    <password></password>
    <maxconn>100</maxconn>
    </pool>
    </ds-config>


    3. 連接池的使用
    ? 1。Connection的獲得和釋放
    ? DBConnectionManager?? connectionMan=DBConnectionManager?.getInstance();//得到唯一實(shí)例
    ?? //得到連接
    ?? String name="mysql";//從上下文得到你要訪問的數(shù)據(jù)庫的名字
    ?? Connection? con=connectionMan.getConnection(name);
    ? //使用
    ? 。。。。。。。
    ? // 使用完畢
    ?connectionMan.freeConnection(name,con);//釋放,但并未斷開連接
    ?2。數(shù)據(jù)庫連接的動態(tài)增加和連接池的動態(tài)增加
    ????? 1。調(diào)用xml操作增加類

    ??????2。重新實(shí)例華連接池管理池類




    posted on 2007-01-16 17:54 chunkyo 閱讀(97595) 評論(113)  編輯  收藏 所屬分類: Java技術(shù)
    評論共2頁: 1 2 下一頁 

    FeedBack:
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)![未登錄]
    2007-06-22 14:48 | liu
    老大給我傳份完整版的吧謝謝了!!!!
    liuyingxiao@sohu.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2007-08-14 15:26 | Jarod Cai
    大牛:
    麻煩把這個(gè)文檔呵程序包發(fā)給我一份。小弟最近正在學(xué)做一個(gè)小網(wǎng)站,被數(shù)據(jù)庫整得頭都大了。幸好搜到了您的這篇文檔。十分感激。
    caigzh04@gmail.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2007-08-31 16:39 | 楊開杰
    你好~看了你的總結(jié)
    有些地方不完整看不大明白~
    我也希望能得到你完整的數(shù)據(jù)庫連接池的Java代碼~
    小弟多謝了~
    郵箱:yangkj2006@gmail.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2007-09-11 16:39 | zyw
    謝謝,給份完整的代碼!
    zyw8136@163.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2007-10-02 08:28 | dicke
    請也給我一份完整的代碼,謝謝!
    fenggui.gu@126.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2007-10-16 19:04 | yuqian
    不錯(cuò)兄弟,能發(fā)一份完成的代碼嗎?萬分感謝!!
    zhang_0308@sina.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)![未登錄]
    2007-11-23 11:07 | liu
    兄弟,能給我發(fā)一份完整的代碼嗎?謝謝!!
    aimdlau@sina.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2007-11-29 13:51 | Snow
    謝謝chunkyo,只是有些地方看得不懂,比如說那個(gè)TimerListner接口是自己寫的還是哪個(gè)第三方提供的類等,所以希望能得到完整的代碼!
    hsbljyy@yahoo.com.cn
      回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)![未登錄]
    2007-12-31 00:58 | tiger
    測試了幾次都沒通過,能否發(fā)個(gè)完整版的給我?
    beijihu3@163.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2008-01-15 10:46 | ge
    我也是調(diào)了好長時(shí)間也沒調(diào)通,能否發(fā)個(gè)完整的給我
    qsge2005@126.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)![未登錄]
    2008-01-17 10:44 | king
    TimerListener沒理解,能發(fā)給我個(gè)完整的么,謝謝!
    lidongge123@163.com
    QQ:635390790 加qq時(shí)請注明理由,謝謝  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2008-01-22 11:05 | abcd
    能不能給我一個(gè)完整版的阿,謝謝
    maming134@sohu.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2008-02-14 11:36 | 小小陳
    也發(fā)一份給我吧,先謝過了...
    acon_cl@126.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2008-03-09 17:51 | hsiholi
    liguiquan8@yahoo.com.cn  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2008-03-09 17:52 | hsiholi
    也給我一份學(xué)習(xí)了 謝謝 liguiquan8@yahoo.com.cn  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2008-03-15 10:19 | hxs
    謝謝樓上分享, 但調(diào)了很長時(shí)間沒有調(diào)通,懇請摟主發(fā)一份完整代碼,謝謝!
    email:hxiaosu@126.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2008-04-01 11:11 | 小呆
    感覺不錯(cuò),需要一份源碼 謝謝
    aty03@163.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2008-04-02 17:53 | 楊帆
    能否發(fā)份源碼給我。謝謝。  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2008-04-02 17:54 | 楊帆
    能否發(fā)份源碼給我。謝謝。

    xa_yangfan@yahoo.com.cn  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2008-04-07 13:30 | 悠然
    感覺不錯(cuò),需要一份源碼 謝謝
    youranxj@126.com   回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2008-04-15 13:18 | 東林遙竹
    我正在學(xué)習(xí)連接池的東西,請問能也給我發(fā)一份完整代碼嗎
    謝謝了! carlchou825@yahoo.com.cn  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2008-06-04 19:35 | yezi
    也給我發(fā)一份好么?謝謝~~~~~~~~~
    xyzhang0010@163.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2008-06-19 20:04 | gaofeirong
    現(xiàn)在才看到,源碼還有么!
    發(fā)我一份
    gaofeirong@gmail.com
    非常感謝  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2008-07-20 12:18 | chlee
    感覺很好,能否給一份完整的源碼,非常感謝!!
    redh@163.com   回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2008-07-31 15:36 | wish520
    感覺很好,能否給一份完整的源碼,非常感謝!! qianjiang520@126.com
      回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2008-08-15 21:31 | 唐唐
    寫的太好了,正需要,麻煩給發(fā)一份完整的源碼,多謝多謝!
    郵箱:datang_flying@163.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2008-10-14 10:45 | zhangxinwei
    兄臺寫得太棒了 !可否給小弟學(xué)習(xí)學(xué)習(xí)
    zhangxinwe999@163.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)![未登錄]
    2008-10-21 14:45 | james
    寫的真好,受教了,不過確實(shí)不太完整,能否轉(zhuǎn)送一份源碼,小弟不勝感謝!
    james4837@163.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2008-10-27 16:54 | qooler
    阿道夫  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2008-10-27 16:56 | 樹林
    看的不是很懂,希望大哥能給我一份完整版的,讓我好好研究一下。

    xue_qiwei@yahoo.com.cn

    非常崇拜!  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2008-11-12 20:44 | edaoman
    good~~~  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2009-02-20 10:01 | 老土新地
    TimerListener沒理解,能發(fā)給我個(gè)完整的么,謝謝!
    luo_qing@sogou.com
    QQ:303353513 加qq時(shí)請注明理由,謝謝   回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2009-02-25 17:03 | janlkan
    TimerListener是不是第三方包,能否轉(zhuǎn)送一份源碼,不勝感謝!

    janklan@163.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2009-03-31 23:01 | 油炸大龍蝦
    建議:樓豬的思路是面向過程的。建議去研究AOP,好好看一下JDK的java.lang.reflect.InvocationHandler和Proxy

    良好的用戶體驗(yàn)是這樣的:
    Connection conn = Pool.getConn();
    // doSomething
    conn.close(); // 不改變用戶習(xí)慣,用戶close也行放回空閑池

    如何實(shí)現(xiàn)?很簡單:
    public Object invoke(...) {
    if (!method.getName().equals("close")) return method.invoke(...);
    // push back
    return null;
    }

    強(qiáng)烈建議樓豬好好學(xué)習(xí)設(shè)計(jì)模式,否則會阻礙你發(fā)展的。  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2009-04-21 11:34 | every
    能否也給我一份兒
    mwgjkf@139.com
    謝謝  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)![未登錄]
    2009-04-26 12:24 | 高山
    能給我一份嗎,
    yachaofeng@163.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2009-04-28 13:46 | 孫修鵬
    能否也給我一份兒
    sxpujs@163.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2009-07-09 14:58 | 張向陽
    謝謝您的分享,非常實(shí)用,也是我非常需要的現(xiàn)在,傳給我一份吧。3Q!

    Email: zhangxiangyang.bupt@gmail.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2009-07-28 10:11 | ThankYou
    第二次在筆試時(shí)碰到這問題。
    給我也發(fā)一份我好好研究研究。
    bing.huang8419@163.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2009-08-06 19:42 | Fly533
    寫得很不錯(cuò)!!,可惜我調(diào)不出來,能發(fā)份完整的代碼不?謝謝了
    fly533@126.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)![未登錄]
    2009-10-07 06:08 | JavaMan
    非常好,很實(shí)用,測試一下沒有通過,能否傳給我一份!
    chinaxwn@hotmail.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2009-12-02 14:57 | 趙薇薇
    我自己寫的那個(gè)沒有分的這么細(xì)的,只是從dataSource中取得一個(gè)只讀連接和寫連接的。能否傳我一份的!
    zhaoweiwei-2006@sohu.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)![未登錄]
    2009-12-10 09:17 | JavaBoy
    正在學(xué)習(xí),希望傳份詳細(xì)的
    謝謝了!
    artwhy@163.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)![未登錄]
    2009-12-10 11:34 | Sam
    我也剛開始學(xué)習(xí)連接池
    希望傳我一份謝謝先!
    fl49809045@163.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2010-01-13 20:17 | magicmo
    能否發(fā)我一份!
    bluesky.mo@foxmail.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)![未登錄]
    2010-04-14 10:43 | boy
    給一份完整的謝謝樓主 happy_javaboy@163.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2010-05-18 12:52 | 哈合
    能否發(fā)我一份!
    sjxlsn@163.com 謝謝了  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2010-08-06 19:03 | admin
    TimerListener 這是做什么用的,我看到很多人都在問。

    樓主你好, 我現(xiàn)在也在找連接池,麻煩你發(fā)一份給我,不勝感激。
    bisubisu@163.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2010-08-09 07:17 | darren
    能否傳我一份啊,ddf168913@163.com,謝謝  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2010-10-22 21:21 | crazyant
    非常棒的資料,雖然內(nèi)容不是很完全,不過完全實(shí)現(xiàn)了數(shù)據(jù)庫連接池的核心,仔細(xì)理解以后,我抽取出了自己想要的代碼,可以使用,十分感謝  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2010-11-27 21:37 | wanhition@163.com
    TimerListener 這是做什么用的,我看到很多人都在問。

    樓主你好, 我現(xiàn)在也在找連接池,麻煩你發(fā)一份給我,不勝感激。
    wanhition@163.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2011-03-27 21:25 | xixi
    我想了解一下,可以用 WORD 文檔 發(fā)一下這些代碼給我嗎?jiajia10161@163.com 唔該  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2011-10-17 11:05 | 許宇寶
    希望樓主也給我發(fā)一份完整的:包括源碼和JAR包!謝謝
    xu.yubao@163.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2012-05-17 22:44 | liuliu
    麻煩發(fā)一份到我郵箱 572079078@qq.com 最好帶上測試代碼  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)![未登錄]
    2012-05-18 15:01 | ***
    給我也發(fā)一份完整的吧 TimerListener不太明白是怎么回事
    21269125@qq.com給我發(fā)一份完整的代碼 謝謝  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)![未登錄]
    2012-05-31 14:36 |
    @Li
    是啊,我也找不到這個(gè)接口  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)![未登錄]
    2012-05-31 14:38 |
    @油炸大龍蝦
    高手就是高手,向你學(xué)習(xí)  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)![未登錄]
    2012-06-29 16:16 | bobby
    在程序中你后面留著的幾個(gè)問題,有沒有完整版本?有的話,麻煩給我一份。謝謝  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)![未登錄]
    2012-10-22 00:46 | 小杰
    謝謝你也給我一份完整的代碼 急需!!
    849066286@qq.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)![未登錄]
    2012-11-03 08:05 | java
    自己動手 成為 風(fēng)衣祖師~!  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2013-01-08 10:11 | 李沙沙
    大哥,有沒有完整的代碼,給一份,謝謝,QQ:513084206  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2013-02-24 17:06 | dahuzij
    正在學(xué)習(xí),能不能也發(fā)份完整代碼給我,謝謝,dahuzij@sina.cn   回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2013-03-27 16:14 | liuvlun
    jdbc 連接池能給我份完整的源碼嗎,現(xiàn)在著急使用,謝謝,liuqinglong88@126.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2013-04-10 10:33 | dahai
    jdbc 連接池能給我份完整的源碼嗎,現(xiàn)在著急使用,謝謝,servcelayer163@163.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2013-04-15 09:57 | 頌山
    你好!能不能麻煩發(fā)份完整版源碼,急用下,謝謝 215038085@qq.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2013-04-15 15:50 | piao2072
    遇到第一個(gè)問題就是TimerListener,我本地建立的新類繼承不了timerlistener,import java.util.Timer;我也引入了  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2013-04-15 16:26 | piao2072
    我是發(fā)現(xiàn)了timer 是打醬油的啊???  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2013-06-04 11:20 | liaoshiyong
    麻煩也給我一份吧,郵箱:649241354@qq.com,先感謝樓主!  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2013-06-05 15:26 | king_soku
    麻煩也給我一份吧,郵箱:563794876@qq.com,先感謝樓主!  回復(fù)  更多評論
      
    # 感謝樓主,鄙視要源碼的
    2013-07-22 09:07 | 感謝樓主
    首先感謝樓主的精心整理,雖然是07年的,但對我?guī)椭艽螅瑫r(shí)也說一下要源碼的,別人整理出來就不容易,如果幾百個(gè)都去要人家還做事嗎,自己多去調(diào)試整理  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)![未登錄]
    2013-08-01 16:56 | steven
    感謝樓主,雖然是07年的,不過正好新項(xiàng)目要用到連接池。不知能否發(fā)一份源碼給我? 郵箱:635326524@qq.com 萬分感謝  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2013-08-20 09:16 | 求源碼
    求一份源碼,謝謝、郵箱 963620703@qq.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2013-10-17 10:26 | 源碼
    感謝樓主分享,希望能給一份源碼,郵箱644143964@qq.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2013-11-04 08:59 | 德國戰(zhàn)車
    看了你的博客,希望得到一份源碼!謝謝了,郵箱317224116@qq.com
      回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2013-11-11 20:37 | 靜JING
    看了你的博客,讓我了解了更多,最近我正在學(xué)習(xí)連接池,能不能得到你的一份源代碼呀……非常感謝……郵箱:ljj_0729@126.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2013-11-11 21:06 | 1111
    那個(gè)所謂單列寫的有問題。  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2013-12-04 14:51 | @jcy
    @靜JING
    你要到源碼了嗎?給發(fā)一份唄!!!
    還有這個(gè)數(shù)據(jù)庫連接池是在哪里實(shí)現(xiàn)創(chuàng)建多個(gè)連接的?  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2013-12-04 14:52 | @jcy
    @感謝樓主
    你好 我想要問一下這個(gè)數(shù)據(jù)庫連接池是在哪里實(shí)現(xiàn)創(chuàng)建多個(gè)連接的?這個(gè)你知道是怎么實(shí)現(xiàn)的嗎?  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)![未登錄]
    2013-12-11 20:22 | h
    感覺樓主的單例模式 好像是錯(cuò)的  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)![未登錄]
    2014-03-28 16:31 | z
    哪有這樣實(shí)現(xiàn)單例類的?  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2014-04-19 16:39 | 小王
    樓主,給我也發(fā)一份吧,正在學(xué)習(xí)中,突然發(fā)現(xiàn)自己的項(xiàng)目中急需數(shù)據(jù)庫連接池,寫的有點(diǎn)多,發(fā)一份完整的代碼吧,不勝感激
    郵箱:841894885@qq.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2014-05-12 14:46 | terminator
    正在研究數(shù)據(jù)庫連接池,樓主好人一生平安,只求一份源碼,1044018467@qq.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2014-05-15 10:17 | 了1
    樓主能發(fā)份給我嗎?謝謝1489248672@qq.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2014-05-23 16:19 | codehunt
    測試成功  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2014-07-30 16:07 | 爬代碼的
    信不信多線程并發(fā)情況下,會出現(xiàn)連接無法歸還?取連接和還連接的同步不合理。  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2014-08-08 11:39 | gtt
    樓主發(fā)份原碼,謝謝
    gtt509109@163.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)![未登錄]
    2014-08-11 15:30 |
    能不能發(fā)份完整的資料到我郵箱,感激不盡
    517571628@qq.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)![未登錄]
    2014-10-08 09:56 | kevin
    能不能也發(fā)一份完整的代碼給我,多謝樓主
    2518487357@qq.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2014-10-14 10:35 | zhen
    能發(fā)我一份完整的代碼給我啊,感謝樓主  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2014-10-27 14:17 | 愛喝開水的魚
    我按照你的方法進(jìn)行配置,但是最后一打開數(shù)據(jù)連接就自動關(guān)閉,這是什么原因啊!  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2014-11-05 14:44 | leov1
    真心不錯(cuò),現(xiàn)在正在做服務(wù)器這塊,數(shù)據(jù)庫連接池 問題 ,無從下手,現(xiàn)在 了解很多,謝謝了。  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)![未登錄]
    2014-12-05 10:57 | 晨曦
    剛好需要封裝一個(gè)數(shù)據(jù)庫連接池,樓主大哥給我發(fā)一份完整的,多謝
    hhm.617@126.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2015-03-27 09:23 | cdxx
    內(nèi)容很詳細(xì),謝謝!!  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2015-04-14 09:02 | Mrs ZHANG
    @codehunt
    層主,測通了??求一份完整的源碼,急用啊,不勝感激啊~~~  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2015-04-14 12:45 | D骷髏殤
    樓主,小弟學(xué)習(xí)中。。。求一份源碼研究T.T 不勝感激  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2015-04-14 12:47 | D骷髏殤
    我的郵箱是973631606@qq.com 謝謝樓主  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2015-04-15 09:04 | fsn
    樓主,我的郵箱是sn93@qq.com,求一份源碼學(xué)習(xí),謝謝  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)![未登錄]
    2015-04-24 12:26 | fanfan
    好人一生平安,求一份源碼學(xué)習(xí)。
    我的郵箱是66761960@qq.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2015-08-18 15:56 | 蜂蜜
    求代碼!!!
    928012536@qq.com  回復(fù)  更多評論
      
    # re: Java jdbc數(shù)據(jù)庫連接池總結(jié)!
    2016-06-19 20:49 | 邱明發(fā)
    剛把源碼放在eclipse中,先頂一個(gè)  回復(fù)  更多評論
      
    評論共2頁: 1 2 下一頁 
    <2016年6月>
    2930311234
    567891011
    12131415161718
    19202122232425
    262728293012
    3456789

    這個(gè)博客主要是關(guān)于java技術(shù)和開源技術(shù),大家一起來進(jìn)步了!

    常用鏈接

    留言簿(12)

    隨筆分類

    隨筆檔案

    文章分類

    收藏夾

    DotNet

    Java技術(shù)網(wǎng)站

    Linux VS Unix

    其他常去網(wǎng)站

    常光顧的BLOG

    文學(xué)類網(wǎng)站

    游戲類網(wǎng)站

    最新隨筆

    搜索

    •  

    積分與排名

    • 積分 - 196749
    • 排名 - 293

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲精品国产精品国自产网站| 亚洲爆乳成av人在线视菜奈实| 日韩在线视频线视频免费网站| 2021在线永久免费视频| 国产国拍亚洲精品福利 | 朝桐光亚洲专区在线中文字幕| 亚洲一区免费观看| 亚洲性日韩精品一区二区三区| 亚洲一区二区无码偷拍| 69免费视频大片| 亚洲色中文字幕无码AV| 国产成人综合亚洲| 国产va免费精品观看精品 | 一级特黄录像免费播放肥| 免费观看的毛片手机视频| 亚洲日韩中文字幕| 国产高清不卡免费视频| 国产a v无码专区亚洲av| 国产亚洲Av综合人人澡精品| 日韩精品福利片午夜免费观着| 亚洲高清视频在线观看| 精精国产www视频在线观看免费| 四虎永久免费观看| 国产精品亚洲一区二区麻豆| 亚洲一区免费视频| 亚洲男人都懂得羞羞网站| 两个人看的www视频免费完整版| www亚洲精品少妇裸乳一区二区| 亚洲第一第二第三第四第五第六| 日韩欧毛片免费视频| 亚洲男人天堂影院| 99精品视频免费观看| 亚洲av最新在线网址| 在线观看黄片免费入口不卡| 成人亚洲综合天堂| 羞羞漫画页面免费入口欢迎你| 麻豆成人精品国产免费| 亚洲欧美成人综合久久久| 久久WWW免费人成人片| 亚洲AV综合色区无码二区偷拍| 国产成人精品免费视|