Java程式資料庫連接,資料來源配置,資料庫連接池
Java程式,用到的資料庫一定要配置資料來源嗎?
一般寫小程式直接在程式裡設定串連就可以了,而大的系統一般要配置資料來源
資料來源是要配置到中介軟體伺服器中的(比如:Tomcat,JBoss,WebLogic一類的),配置後可以提高資料庫查詢效能,避免重複的開啟和關閉資料庫。因此開發java的B/S項目時(就是J2EE的項目,通過瀏覽器訪問的項目),都會配置資料來源串連。如果你寫的管理軟體是B/S結構,那麼只需要在搭建環境的伺服器上配置資料來源就可以了,使用者訪問時是通過瀏覽器訪問,不需要做其他設定。如果是C/S(就是使用者需要單獨安裝用戶端程式,比如QQ),也不需要在使用者那裡設定資料來源,只需要在你的伺服器端程式上手工配置好資料來源即可。java實現資料庫操作,現在多數流行的都是JDBC,採用配置資料來源的方式多數是用了架構的原因,比如Hibernate、EJB、Struts、Spring。但是所有的資料來源配置原理都是基於JDBC的操作。
1.直接編碼串連資料庫
JDBC (Java Database Connectivity)
JDBC以一種統一的方式來對各種各樣的資料庫進行存取,JDBC為開發人員隱藏了不同資料庫的不同特性。程式員開發時,知道要開發訪問資料庫的應用,於是將一個對應資料庫的JDBC驅動程式類的引用進行了編碼,並通過使用適當的JDBC URL 串連到資料庫。
程式碼範例:
或者通過配置屬性檔案的方式:
以上都是傳統的做法,這種做法一般在小規模的開發過程中不會產生問題,只要程式員熟悉Java語言、瞭解JDBC技術和各種資料庫,可以很快開發出相應的應用程式。
這種方式帶來的問題:
1、資料庫伺服器名稱、使用者名稱和口令都可能需要改變,由此引發JDBC URL需要修改;
2、資料庫可能改用別的產品,如改用DB2或者Oracle,引發JDBC驅動程式套件和類名需要修改;
3、隨著實際使用終端的增加,原配置的串連池參數可能需要調整;
解決辦法:
程式員應該不需要關心“具體的資料庫後台是什嗎?JDBC驅動程式是什嗎?JDBC URL格式是什嗎?訪問資料庫的使用者名稱和口令是什嗎?”等等這些問題,程式員編寫的程式應該沒有對 JDBC 驅動程式的引用,沒有伺服器名稱,沒有使用者名稱稱或口令 —— 甚至沒有資料庫池或串連管理。而是把這些問題交給J2EE容器來配置和管理,程式員只需要對這些配置和管理進行引用即可。由此,就有了JNDI,配置資料來源。
2.配置資料來源
JNDI(Java Naming and Directory Interface)
JNDI API被用於執行名字和目錄服務。它提供了一致的模型來存取和操作企業級的資源如DNS和LDAP,本地檔案系統,後者在應用伺服器中的對象。在JNDI中,在目錄結構中的每一個結點稱為context。每一個JNDI名字都是相對於context的。應用可以通過這個初始化的context經由這個分類樹來定位它所需要的資源或對象。
在Tomcat中配置資料來源獲得串連
在tomcat中通過JNDI服務獲得DataSource引用,通過DataSource獲得資料庫連接,步驟如下:
1.配置資料來源JNDI服務
2.在應用中通過JNDI使用javax.naming.Context的lookup方法來檢索DataSource引用
3. DataSource的getConnection方法獲得串連
配置JNDI服務的代碼:
設定檔內容:
在應用中通過JNDI使用javax.naming.Context的lookup方法來檢索DataSource引用,由DataSource獲得資料庫連接:
直接使用JDBC或者通過JNDI引用資料來源的編程代碼量相差無幾,但是現在的程式可以不用關心具體JDBC參數了。在系統部署後,如果資料庫的相關參數變更,只需要修改設定檔中的JDBC參數,只要保證資料來源的名稱不變,那麼程式原始碼就無需修改。由此可見,JNDI避免了程式與資料庫之間的緊耦合,使應用更加易於配置、易於部署。JNDI在滿足了資料來源配置的要求的基礎上,還進一步擴充了作用:所有與系統外部的資源的引用,都可以通過JNDI定義和引用。所以,在J2EE規範中,J2EE
中的資源並不局限於 JDBC 資料來源。引用的類型有很多,其中包括資源引用、環境實體和 EJB 引用。特別是 EJB 引用,它暴露了 JNDI 在 J2EE 中的另外一項關鍵角色:尋找其他應用程式組件。EJB 的 JNDI 引用非常類似於 JDBC 資源的引用。在服務趨於轉換的環境中,這是一種很有效方法。可以對應用程式架構中所得到的所有組件進行這類組態管理,從 EJB 組件到 JMS 隊列和主題,再到簡單配置字串或其他對象,這可以降低隨時間的推移服務變更所產生的維護成本,同時還可以簡化部署,減少整合工作。
J2EE 規範要求所有 J2EE 容器都要提供 JNDI 規範的實現。JNDI 在 J2EE 中的角色就是“交換器” —— J2EE 組件在運行時,間接地尋找其他組件、資源或服務的通用機制。在多數情況下,提供 JNDI 供應者的容器可以充當有限的資料存放區,這樣管理員就可以設定應用程式的執行屬性,並讓其他應用程式引用這些屬性(Java 管理擴充(Java Management Extensions,JMX)也可以用作這個目的)。JNDI 在 J2EE
應用程式中的主要角色就是提供間接層,這樣組件就可以發現所需要的資源,而不用瞭解這些間接性。在 J2EE 中,JNDI 是把 J2EE 應用程式合在一起的粘合劑,JNDI 提供的間接定址允許跨企業交付可伸縮的、功能強大且很靈活的應用程式。
3.資料庫連接池
串連池是建立和管理多個串連的一種技術,這些串連可被需要使用它們的任何線程使用。串連池技術基於下述事實:對於大多數應用程式,當它們正在處理通常需要數毫秒完成的事務時,僅需要能夠訪問JDBC串連的1個線程。未處理事務時,串連處於閑置狀態。使用串連池,允許其他線程使用閑置串連來執行有用的任務。事實上,當某一線程需要用JDBC在MySQL或其他資料庫上執行操作時,需要用到由串連池提供的串連。使用串連完成線程後,線程會將串連返回給串連池,以便該串連能夠被其他需要使用串連的線程使用。從串連池“借出”串連時,該串連僅供請求它的線程使用。從編程觀點看,其效果等同於每次需要JDBC串連時調用DriverManager.getConnection(),但是,採用串連池技術,可通過使用新的或已有的串連結束線程。串連池技術能顯著增加Java應用程式的效能,同時還能降低資源使用率。
串連池技術的主要優點包括:
(1) 縮短了串連建立時間
建立新的JDBC串連會導致連網操作和一定的JDBC驅動開銷,如果這類串連是“迴圈”使用的,使用該方式,可避免這類不利因素。
(2)簡化的編程模型
使用串連池技術時,每個單獨線程能夠像建立了自己的JDBC串連那樣進行操作,從而允許使用直接的JDBC編程技術。
(3)受控的資源使用
如果不使用串連池技術,而是在每次需要時為線程建立新的串連,那麼應用程式的資源使用將十分浪費,而且在負載較重的情況下會導致無法預期的結果。
注意,與資料庫的每個串連均會在用戶端和伺服器端造成一定的開銷(CPU、關聯轉換等)。每個串連均會對應用程式和資料庫伺服器的可用資源帶來一定的限制。無論串連是否執行任何有用的任務,仍將使用這些資源中的相當一部分。
串連池能夠使效能最大化,同時還能將資源利用控制在一定的水平之下,如果超過該水平,應用程式將崩潰而不僅僅是變慢。
幸運的是,Sun公司通過JDBC-2.0“可選”介面,完成了JDBC中串連池概念的標準化實施,所有主要應用伺服器均實施了能夠與MySQL Connector/J一起良好工作的這類API。
通常,你可以在應用伺服器的設定檔中配置串連池,並通過Java命名和目錄介面(JNDI)訪問它。使用串連池時需要牢記的最重要事項是,無論在代碼中出現了什麼(異常、控制流程等),串連以及由串連建立的任何部分(語句、結果集等)均應被關閉,以便能再次使用它們。如不然,它們將糾纏在一起,在最好的情況下,意味著它們所代表的資料庫伺服器資源(緩衝區、鎖定、通訊端等)可能會捆綁一段時間,在最壞的情況下,可能會導致永久捆綁。
串連池的最佳大小是什嗎?
取決於具體情況。儘管最佳大小取決與預期的負載和平均的資料庫事務時間,最佳的串連池大小小於你的預期。例如,如果使用的是Sun公司的Java Petstore Blueprint應用程式,對於包含15~20個串連的串連池,使用MySQL和Tomcat,在可接受的相應時間下,可服務於中等程度的負載(600個並發使用者)。要想確定用於應用程式的串連池大小,應使用諸如Apache Jmeter或The Grinder等工具建立負載測試指令碼,並對應用程式進行負載測試。確定出發點的一種簡單方法是,將串連池的最大串連數配置為“無限”,運行負載測試,並測量最大的並發串連數。隨後,應進行反向操作,確定出使應用程式具有最佳效能的串連池的最小和最大值。
串連池與資料來源區別?
資料庫連接池是在應用程式啟動時建立足夠的資料庫連接,並將這些串連組成一個串連池,由應用程式動態地對池中的串連進行申請、使用和釋放。對於多於串連池中串連數的並發請求,應在請求隊列中排隊等待。並且應用程式可根據池中串連的使用率,動態增加或減少池中的串連數。當關閉串連操作時,串連並不真正的關閉,而是返回到串連池中作為空白閑串連在後面繼續使用,串連池技術解決了資料庫連接頻繁開啟關閉所帶來的效能問題。
有了串連池,我們沒必要直接找資料來源打交道了,串連池在你的程式所在的機器記憶體,資料來源不一定,並且資料來源和串連池會保持一定數量的串連,這樣我們訪問資料庫的時候就不需要找資料來源要串連,直接在本地記憶體中取得串連,可以提高程式的效能。連結池的存在是為了效率,因為執行個體化一個串連很耗費資源,而串連又有可重用的特徵,所以可以把一定數量的串連放在串連池裡面以提高效率。
Tomcat內建的資料庫連接池管理
C3p0資料庫連接池
資料庫連接池配置代碼:
設定檔:
【參考資料綜合】
http://hi.baidu.com/sunkangle/blog/item/55a9db7cb076a3330dd7dadb.html
JDBC與JNDI應用比較
http://13243356.javaeye.com/blog/402961
資料庫連接與資料來源配置
http://hi.baidu.com/yaoming159/blog/item/5c4efe33e2122df31a4cfff5.html
JDBC與JNDI區別
http://wenwen.soso.com/z/q155303937.htm?pid=wenwen.autologin
java資料庫一定要配置資料來源嗎?
http://hi.baidu.com/begin_think/blog/item/b959f9f45b67092ebd310973.htmlJNDI
與JDBC比較以及串連池的技術
http://topic.csdn.net/u/20090311/10/f6ee00c1-34ed-42ef-b5aa-77d2c7a8e775.html
串連池與資料來源 分別起什麼作用呢?
整理
By willowind