• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      連接池訪問(wèn)數(shù)據(jù)庫(kù)的研究與應(yīng)用

      2017-11-18 16:13:05戴長(zhǎng)秀
      計(jì)算機(jī)時(shí)代 2017年11期
      關(guān)鍵詞:靜態(tài)動(dòng)態(tài)

      戴長(zhǎng)秀

      摘 要: 應(yīng)用程序用JDBC訪問(wèn)數(shù)據(jù)庫(kù)需要頻繁的建立連接和關(guān)閉連接,由于數(shù)據(jù)庫(kù)連接數(shù)的限制,當(dāng)用戶數(shù)、連接數(shù)達(dá)到一定程度時(shí),用JDBC訪問(wèn)數(shù)據(jù)庫(kù)的速度將會(huì)明顯下降,甚至需要重啟數(shù)據(jù)庫(kù)系統(tǒng),這極大地降低了數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的性能。連接池較好地解決了上述問(wèn)題,避免了連接數(shù)增加引起的數(shù)據(jù)庫(kù)性能瓶頸問(wèn)題。文章介紹了連接池的靜態(tài)、動(dòng)態(tài)創(chuàng)建,引用記數(shù)法分配連接等實(shí)現(xiàn)原理,對(duì)連接池的配置進(jìn)行了論述。實(shí)踐表明,連接池可以很好地提高數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的整體性能。

      關(guān)鍵詞: 連接池; 靜態(tài); 動(dòng)態(tài); 引用記數(shù)

      中圖分類(lèi)號(hào):TP311.52 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):1006-8228(2017)11-20-03

      Research and application of connection pool to access database

      Dai Changxiu

      (Department of Information Science and Technology, Guangdong University of Foreign Studies South China Business College, Guangdong, Guangzhou 510545, China)

      Abstract: The applications using JDBC to access database need to establish and close the connections frequently, because of the limitation of database connection, when the number of users, the number of connections increase to a certain extent, the speed of accessing database with JDBC will be decreased obviously, even need to restart the database system, which greatly reduces the performance of database application system. The connection pool solves the above problem well and avoids the bottleneck of database performance caused by the increase of the connection number. This paper introduces the principle of the static and dynamic creation of connection pool, and the principle of distributing connections with reference counting method, and discusses the configuration of connection pool. The practice shows that the connection pool can improve the overall performance of database application system.

      Key words: connection pool; static; dynamic; reference counting

      0 引言

      Web應(yīng)用程序最常用的數(shù)據(jù)管理方式就是使用關(guān)系數(shù)據(jù)庫(kù),往往都是用數(shù)據(jù)庫(kù)存儲(chǔ)的信息動(dòng)態(tài)生成Web頁(yè)面[1]。在基于JDBC訪問(wèn)數(shù)據(jù)庫(kù)方式中,每個(gè)用戶在請(qǐng)求訪問(wèn)數(shù)據(jù)庫(kù)前都必須先建立連接,建立連接將會(huì)消耗系統(tǒng)一定資源,延長(zhǎng)訪問(wèn)數(shù)據(jù)庫(kù)的時(shí)間。當(dāng)然,如果是單個(gè)用戶請(qǐng)求訪問(wèn),這個(gè)延時(shí)是比較小的,用戶體會(huì)不到。但是,如果是批量用戶、批量請(qǐng)求,這個(gè)延時(shí)將會(huì)急速劇增。同時(shí)還可能出現(xiàn)由于連接的不及時(shí)關(guān)閉而導(dǎo)致數(shù)據(jù)庫(kù)內(nèi)存泄露,數(shù)據(jù)庫(kù)系統(tǒng)重啟,從而系統(tǒng)無(wú)法響應(yīng)用戶請(qǐng)求問(wèn)題。眾所周知,每種數(shù)據(jù)庫(kù)在同一時(shí)刻都有允許的最大連接數(shù),隨著流量、用戶的增加,數(shù)據(jù)庫(kù)連接數(shù)達(dá)到一定數(shù)量時(shí),數(shù)據(jù)庫(kù)的性能就會(huì)急劇下降,甚至崩潰。

      數(shù)據(jù)庫(kù)連接池技術(shù)很好的解決了上述問(wèn)題,連接池通過(guò)預(yù)先建立一定數(shù)量的數(shù)據(jù)庫(kù)連接為應(yīng)用程序提供連接。當(dāng)應(yīng)用程序訪問(wèn)數(shù)據(jù)庫(kù)時(shí),應(yīng)用程序就可以從連接池中取出一個(gè)事先建立好的數(shù)據(jù)庫(kù)連接來(lái)訪問(wèn)數(shù)據(jù)庫(kù),從而免去每次訪問(wèn)數(shù)據(jù)庫(kù)時(shí)建立數(shù)據(jù)庫(kù)連接的開(kāi)銷(xiāo),同時(shí)也可以減少數(shù)據(jù)庫(kù)連接和斷開(kāi)時(shí)造成的程序錯(cuò)誤[2]。數(shù)據(jù)庫(kù)連接池技術(shù)不僅節(jié)省了數(shù)據(jù)庫(kù)建立連接的時(shí)間,而且通過(guò)池化管理機(jī)制,可以有效地使用和調(diào)度連接池中的連接,從而很好地解決數(shù)據(jù)庫(kù)連接數(shù)量限制問(wèn)題。

      1 連接池的實(shí)現(xiàn)原理

      服務(wù)器在啟動(dòng)時(shí)創(chuàng)建連接池,同時(shí)建立一定數(shù)量的數(shù)據(jù)庫(kù)連接。當(dāng)用戶請(qǐng)求數(shù)據(jù)庫(kù)連接時(shí),服務(wù)器為其分配連接。當(dāng)用戶請(qǐng)求數(shù)量超出了已建立好的數(shù)據(jù)庫(kù)連接數(shù)目時(shí),服務(wù)器為其創(chuàng)建新的數(shù)據(jù)庫(kù)連接或者復(fù)用已分配出去的數(shù)據(jù)庫(kù)連接或者處于等待狀態(tài)。通常情況下,使用連接池來(lái)訪問(wèn)數(shù)據(jù)庫(kù)包含以下兩個(gè)步驟:

      ⑴ 創(chuàng)建連接池;

      ⑵ 分配、釋放連接。

      1.1 創(chuàng)建連接池

      創(chuàng)建連接池的方法有靜態(tài)和動(dòng)態(tài)之分,所謂靜態(tài)是指,池中的連接是系統(tǒng)初始化時(shí)已創(chuàng)建好的,并且不能隨意的關(guān)閉,這樣就可以避免因連接隨意建立、關(guān)閉而造成的系統(tǒng)開(kāi)銷(xiāo)[3]。在系統(tǒng)初始化時(shí),根據(jù)配置文件中的參數(shù)創(chuàng)建數(shù)據(jù)庫(kù)連接并放置在連接池中,以后應(yīng)用程序使用數(shù)據(jù)庫(kù)連接時(shí)就從該連接池中獲取,連接池相對(duì)于應(yīng)用程序來(lái)說(shuō)是惟一的,數(shù)據(jù)庫(kù)連接數(shù)也是固定的。所謂的動(dòng)態(tài)是指可以動(dòng)態(tài)的加載、修改、刪除連接池,可以為不同類(lèi)型的數(shù)據(jù)庫(kù)同時(shí)創(chuàng)建連接池,可以靈活地配置連接池參數(shù)。動(dòng)態(tài)方法解決了靜態(tài)方法中靜態(tài)加載連接池的局限性,解決了連接池不能適時(shí)增刪改,配置參數(shù)不能根據(jù)應(yīng)用變化靈活調(diào)整的問(wèn)題[4]。endprint

      1.2 分配、釋放連接

      創(chuàng)建好連接池后,需要提供一套有效的分配連接機(jī)制以保證數(shù)據(jù)庫(kù)連接的有效使用。當(dāng)應(yīng)用程序請(qǐng)求一個(gè)數(shù)據(jù)庫(kù)連接時(shí),連接池通常以連接建立時(shí)間長(zhǎng)短為分配原則為該請(qǐng)求分配一個(gè)建立時(shí)間最長(zhǎng)的空閑的連接,此處的空閑是指沒(méi)有被分配出去的連接,如果連接池中沒(méi)有空閑連接,則檢查當(dāng)前連接池中連接數(shù)是否達(dá)到設(shè)定的最大值,如果沒(méi)有達(dá)到就新建一個(gè)連接,如果已達(dá)到連接池中所允許的最大連接數(shù),則該請(qǐng)求等待一定時(shí)間,如果在設(shè)定的等待時(shí)間內(nèi)還沒(méi)有數(shù)據(jù)庫(kù)連接被釋放出來(lái),則返回空值。

      連接池中最小連接數(shù)的檢測(cè)有動(dòng)態(tài)和靜態(tài)兩種方法,動(dòng)態(tài)方法是指每隔一定時(shí)間系統(tǒng)自行檢測(cè)連接池中連接數(shù),如果發(fā)現(xiàn)數(shù)據(jù)庫(kù)連接數(shù)低于最小連接數(shù)的設(shè)定值,則補(bǔ)充相應(yīng)數(shù)量的新連接,從而保證連接池的正常運(yùn)轉(zhuǎn)。靜態(tài)方法是指發(fā)現(xiàn)空閑連接不夠使用時(shí)系統(tǒng)再去檢測(cè)數(shù)據(jù)庫(kù)連接數(shù)并與設(shè)定的最小連接數(shù)進(jìn)行對(duì)比。

      在分配數(shù)據(jù)連接時(shí),除了使用空閑連接外,也可以復(fù)用正在使用的數(shù)據(jù)庫(kù)連接,復(fù)用正在使用的數(shù)據(jù)庫(kù)連接通常使用Reference Counting(引用記數(shù))方法。該方法會(huì)為每一個(gè)數(shù)據(jù)庫(kù)連接保留一個(gè)引用記數(shù)值,用來(lái)記錄該連接的使用者的個(gè)數(shù)。具體操作是采用兩級(jí)連接池,一個(gè)空閑池用于存放目前還沒(méi)分配出去使用的的連接,另一個(gè)使用池存放目前已被分配出去使用的連接,并且為每個(gè)數(shù)據(jù)庫(kù)連接設(shè)置相應(yīng)的引用記數(shù)值。當(dāng)所有的數(shù)據(jù)庫(kù)連接都已分配出去使用時(shí)則選擇引用記數(shù)值較小的數(shù)據(jù)庫(kù)連接進(jìn)行復(fù)用,這樣可以避免隨意選擇數(shù)據(jù)庫(kù)連接進(jìn)行復(fù)用,達(dá)到數(shù)據(jù)庫(kù)連接可管理的目的[5]。

      2 靜態(tài)連接池的配置

      連接池應(yīng)建立多少數(shù)據(jù)庫(kù)連接數(shù),才能使系統(tǒng)的性能處于最佳狀態(tài),發(fā)揮最好的性能,這個(gè)值的設(shè)置需要參考系統(tǒng)的用戶數(shù),需要開(kāi)發(fā)人員經(jīng)過(guò)反復(fù)測(cè)試,最后才能找到最佳的設(shè)置值。

      2.1 配置參數(shù)介紹

      連接池的配置方法有很多,可以在Tomcat下配置,也可以使用JSP的框架如Struts、Spring和Hibernate,還可以使用開(kāi)源提供的連接池組件。在此,只針對(duì)Tomcat下連接池的配置進(jìn)行介紹。JDBC2.0提供了javax.sql.DataSourse接口負(fù)責(zé)數(shù)據(jù)庫(kù)的建立,在應(yīng)用時(shí)無(wú)需編寫(xiě)數(shù)據(jù)庫(kù)連接代碼,就可以直接從數(shù)據(jù)源中獲得數(shù)據(jù)庫(kù)連接。在DataSourse接口中預(yù)先建立好數(shù)據(jù)庫(kù)連接并放置在連接池中,當(dāng)用戶請(qǐng)求訪問(wèn)數(shù)據(jù)庫(kù)時(shí),應(yīng)用程序直接從連接池中取出空閑的連接,訪問(wèn)結(jié)束后,再將連接返回給連接池。Tomcat服務(wù)器正是通過(guò)DataSourse接口獲取數(shù)據(jù)庫(kù)連接,雖然不能為DataSourse接口創(chuàng)建實(shí)例,但是可以通過(guò)Java命名和目錄接口(JNDI)來(lái)獲取DataSourse接口的引用,在配置數(shù)據(jù)源時(shí)需要使用的有關(guān)參數(shù)及含義如下。

      Name:設(shè)置數(shù)據(jù)源的JNDI名。

      Type:設(shè)置數(shù)據(jù)源的類(lèi)型。

      Auth:設(shè)置數(shù)據(jù)源的管理者,有兩個(gè)可選值Container和Application,Container表示由容器來(lái)創(chuàng)建和管理數(shù)據(jù)源,Application表示由Web應(yīng)用來(lái)創(chuàng)建和管理數(shù)據(jù)源。

      driverClassName:設(shè)置連接數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)程序。

      url:設(shè)置連接數(shù)據(jù)庫(kù)的路徑。

      username:設(shè)置連接數(shù)據(jù)庫(kù)的用戶名。

      password:設(shè)置連接數(shù)據(jù)庫(kù)的密碼。

      maxActive:設(shè)置連接池中處于活動(dòng)狀態(tài)的數(shù)據(jù)庫(kù)連接的最大數(shù)目,0表示不受限制。

      maxIdle:設(shè)置連接池中處于空閑狀態(tài)的數(shù)據(jù)庫(kù)連接的最大數(shù)目,0表示不受限制。

      maxWait:設(shè)置當(dāng)連接池中沒(méi)有處于空閑狀態(tài)的連接時(shí),請(qǐng)求數(shù)據(jù)庫(kù)連接的請(qǐng)求的最長(zhǎng)等待時(shí)間(單位為ms),如果超出該時(shí)間將拋出異常,-1表示無(wú)限期等待。

      2.2 數(shù)據(jù)源的配置

      以SQL Server 2008為例,介紹在Tomcat 8.0下數(shù)據(jù)庫(kù)連接池的配置。

      ⑴ 復(fù)制數(shù)據(jù)庫(kù)驅(qū)動(dòng)包。將SQL Server數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)包sqljdbc.jar或者sqljdbc4.jar復(fù)制到Tomcat安裝路徑下的lib文件夾中。

      ⑵ 配置數(shù)據(jù)源。配置數(shù)據(jù)源時(shí),可以將其配置到Tomcat安裝目錄下的conf\server.xml文件中,也可以將其配置到Web工程目錄下的META-INF\context.xml文件中,建議采用后者,因?yàn)檫@樣配置的數(shù)據(jù)源更有針對(duì)性,配置數(shù)據(jù)源的代碼如下:

      auth="Container"

      type="javax.sql.DataSource"

      username="sa"

      password="123456"

      driverClassName="com.microsoft.sqlserver.jdbc

      .SQLServerDriver"

      url="="jdbc:sqlserver://127.0.0.1:1433;

      DatabaseName=db_database"

      maxActive="6"

      maxIdle="2"/>

      3 連接池訪問(wèn)數(shù)據(jù)庫(kù)的設(shè)計(jì)實(shí)現(xiàn)

      創(chuàng)建名為JDBConnection.java類(lèi)文件,在其構(gòu)造方法中獲取DataSourse接口的引用。編寫(xiě)DBTableDisplay.jsp文件,顯示數(shù)據(jù)庫(kù)表中信息。

      JDBConnection類(lèi)文件核心代碼如下:

      ……endprint

      public class JDBConnection {

      ……

      private Context ctx=null;

      private Connection conn=null;

      private DataSourse ds;

      ……

      public JDBConnection() {

      //類(lèi)的構(gòu)造方法,為Connection對(duì)象賦值

      try {

      ctx=new InitialContext();

      ds=(DataSource)ctx.lookup("java:comp/env/jdbc/my_db"); //獲取連接池DataSource的引用

      conn=ds.getConnection(); //得到連接

      } catch(Exception e){……}

      ……

      }

      public Connection getConnection() {

      //獲取Connection連接對(duì)象

      return conn;

      }

      public ResultSet getResultSet(String sql) {

      //獲取ResultSet記錄集對(duì)象

      ResultSet rs;

      try {

      Statement stmt=conn.createStatement();

      rs=stmt.executeQuery(sql);

      } catch(Exception e){……}

      ……

      return rs

      }

      ……

      }

      在DBTableDisplay.jsp文件中創(chuàng)建JDBConnection實(shí)例,顯示數(shù)據(jù)庫(kù)表中的數(shù)據(jù)的核心代碼如下:

      ……

      public JDBConnection DBConnection=null;

      public ResultSet rs=null;

      public String sql=null;

      ……

      DBConnection=new JDBConnection();

      rs=DBConnection.getResultSet (sql);

      while(rs.next() {

      //對(duì)數(shù)據(jù)庫(kù)表中的數(shù)據(jù)進(jìn)行輸出顯示

      }

      ……

      4 結(jié)束語(yǔ)

      盡管創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)連接所耗費(fèi)的時(shí)間主要取決于網(wǎng)絡(luò)的速度,以及應(yīng)用程序與數(shù)據(jù)庫(kù)存服務(wù)器的網(wǎng)絡(luò)距離,然而這是一個(gè)比較耗時(shí)的過(guò)程。目前數(shù)據(jù)庫(kù)連接池技術(shù)已經(jīng)成為提高Java訪問(wèn)數(shù)據(jù)庫(kù)效率的首選方案之一。本文針對(duì)傳統(tǒng)訪問(wèn)數(shù)據(jù)庫(kù)方式的不足,分析了數(shù)據(jù)庫(kù)連接池技術(shù)的實(shí)現(xiàn)原理,并對(duì)連接池技術(shù)加以實(shí)現(xiàn)至應(yīng)用。采用數(shù)據(jù)庫(kù)連接池后,數(shù)據(jù)庫(kù)請(qǐng)求可以直接通過(guò)連接池獲得滿足,不需要為該請(qǐng)求建立連接以及認(rèn)證,從而為數(shù)據(jù)庫(kù)的訪問(wèn)贏得了時(shí)間。盡管連接池中可能存在多個(gè)未被使用的數(shù)據(jù)庫(kù)連接,這在一定程度上會(huì)浪費(fèi)系統(tǒng)資源,但是,開(kāi)發(fā)人員通過(guò)反復(fù)試驗(yàn)及測(cè)試,可以找到最佳的參數(shù)值從而將資源浪費(fèi)減至最低??傊褂眠B接池技術(shù)可以克服傳統(tǒng)訪問(wèn)方式的不足,明顯地提高數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的整體性能。

      參考文獻(xiàn)(References):

      [1] 張玉林.用連接池提高Servlet訪問(wèn)數(shù)據(jù)庫(kù)的效率[J].軟件技

      術(shù),2006.20:72-75

      [2] 徐全生,齊祥玲.數(shù)據(jù)庫(kù)連接池在考試系統(tǒng)中的應(yīng)用[J].沈陽(yáng)

      工業(yè)大學(xué)學(xué)報(bào),2007.5:582-584

      [3] 劉繼華.一種基于JDBC的數(shù)據(jù)庫(kù)連接池的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)

      算機(jī)工程與應(yīng)用,2003.7:183-185

      [4] 汪蔚,基于Java的數(shù)據(jù)庫(kù)連接池設(shè)計(jì)與優(yōu)化[J].交通科技與

      經(jīng)濟(jì),2009.4:108-109

      [5] 劉菲、游達(dá)章,基于Java的數(shù)據(jù)庫(kù)連接池的設(shè)計(jì)與優(yōu)化[J].微

      型電腦應(yīng)用,2008.24:7-9endprint

      猜你喜歡
      靜態(tài)動(dòng)態(tài)
      國(guó)內(nèi)動(dòng)態(tài)
      國(guó)內(nèi)動(dòng)態(tài)
      國(guó)內(nèi)動(dòng)態(tài)
      最新進(jìn)展!中老鐵路開(kāi)始靜態(tài)驗(yàn)收
      動(dòng)態(tài)
      猜猜他是誰(shuí)
      動(dòng)態(tài)
      動(dòng)態(tài)
      油罐車(chē)靜態(tài)側(cè)傾穩(wěn)定角的多體仿真計(jì)算
      機(jī)床靜態(tài)及動(dòng)態(tài)分析
      奉节县| 舒城县| 朝阳市| 仲巴县| 滁州市| 甘谷县| 广宗县| 特克斯县| 灵山县| 集安市| 崇礼县| 南雄市| 军事| 类乌齐县| 靖西县| 老河口市| 五寨县| 台安县| 鄂托克旗| 长海县| 高邮市| 滨海县| 晋宁县| 广安市| 和田市| 黎川县| 班戈县| 镇远县| 安阳市| 宝清县| 赤壁市| 建德市| 海安县| 巴彦县| 栖霞市| 正阳县| 阳城县| 延川县| 左云县| 台南县| 泽普县|