java中數(shù)據(jù)源和連接池是什么?現(xiàn)在還用得上么?
我知道的是打個比方
數(shù)據(jù)源就像是移動的客服的接線人員,連接池就是一個容器,打電話進來,從里面給你分配一個連接,系統(tǒng)給你一個名額,,使用完成釋放,其他的打進來的再用,現(xiàn)在不少的項目還用的上.Java開發(fā)常用的幾個數(shù)據(jù)庫連接池
數(shù)據(jù)庫連接池的好處是不言而喻的,現(xiàn)在大部分的
server都提供自己的數(shù)據(jù)庫連接池方案,此時,只要按照 server的文檔說明,正確配置,即可在應用中享受到數(shù)據(jù)庫連接池的好處。
但是,有些時候,我們的應用是個獨立的java
,并不是普通的WEB/J2EE應用,而且是單獨運行的,不要什么
server的配合,這種情況下,我們就需要建立自己的數(shù)據(jù)庫連接池方案了。
1、 DBCP
DBCP是Apache的一個開源項目:
commons.dbcp
DBCP依賴Apache的另外2個開源項目
commons.和commons.pool
dbcp包,目前版本是1.2.1:
code的方式來簡單介紹,所有需要我們自己寫的代碼很少,只要建立一個文件如下:
import
org.apache.commons.dbcp.;
import
org.apache.commons.dbcp.;
import
java.sql.;
import java.sql.;
import
java.util.;
public class {
private static =
null;
public () {
}
public static void init() {
if ( != null) {
try
{
.close();
} catch (Exception e)
{
}
= null;
}
try {
p = new
();
p.("",
"oracle.jdbc.driver.");
p.("url",
"jdbc:oracle:thin:@192.168.0.1:1521:testDB");
p.("password", "scott");
p.("username",
"tiger");
p.("maxActive", "30");
p.("maxIdle", "10");
p.("maxWait",
"1000");
p.("",
"false");
p.("",
"120");
p.("", "true");
p.("", "true");
= ()
.(p);
} catch (Exception e) {
}
}
public static
() throws {
if ( == null) {
init();
}
conn = null;
if ( != null) {
conn = .();
}
return conn;
}
}
接下來,在我們的應用中,只要簡單地使用.()就可以取得連接池中的數(shù)據(jù)庫連接,享受數(shù)據(jù)庫連接帶給我們的好處了。當我們使用完取得的數(shù)據(jù)庫連接后,只要簡單地使用.close()就可把此連接返回到連接池中,至于為什么不是直接關閉此連接,而是返回給連接池,這是因為dbcp使用委派模型來實現(xiàn)接口了。
在使用來創(chuàng)建時,有很多參數(shù)可以設置,比較重要的還有:
、、,他們的意思是當是取得連接、返回連接或連接空閑時是否進行有效性驗證(即是否還和數(shù)據(jù)庫連通的),默認都為false。所以當數(shù)據(jù)庫連接因為某種原因斷掉后,再從連接池中取得的連接,實際上可能是無效的連接了,所以,為了確保取得的連接是有效的,
可以把把這些屬性設為true。當進行校驗時,需要另一個參數(shù):,對oracle來說,可以是:SELECT COUNT(*) FROM
DUAL,實際上就是個簡單的SQL語句,驗證時,就是把這個SQL語句在數(shù)據(jù)庫上跑一下而已,如果連接正常的,當然就有結果返回了。
還有2個參數(shù): 和
,
他們兩個配合,可以持續(xù)更新連接池中的連接對象,當
大于0時,每過
時間,就會啟動一個線程,校驗連接池中閑置時間超過的連接對象。
還有其他的一些參數(shù),可以參考源代碼。
2、
C3P0:
C3P0是一個開放源代碼的JDBC連接池,C3PO
連接池是一個優(yōu)秀的連接池,推薦使用。C3PO實現(xiàn)了JDBC3.0規(guī)范的部分功能,因而性能更加突出,包括了實現(xiàn)jdbc3和jdbc2擴展規(guī)范說明的 和Statement 池的 對象。
下載地址:
com.systex.utils.web;
import java.beans.;
import
java.sql.;
import java.sql.;
import
javax.sql.;
import
com.mchange.v2.c3p0.;
public class {
private static
= null;
private static final String driver
= "com.mysql.jdbc.Driver";
private static final String url =
"jdbc:mysql://localhost:3306/wyd";
private static final String userName =
"root";
private static final String password = "root";
public static () {
if
( == null) {
= new ();
try
{
.(driver);
} catch (
e) {
System.out.println(" Load Driver
Exception!!");
e.();
}
.(url);
.setUser(userName);
.(password);
//
設置連接池最大連接容量
.(20);
//
設置連接池最小連接容量
.(2);
//
設置連接池最大對象容量
.(100);
}
return
;
}
public static () throws
{
return
.().();
}
}
3、 Proxool
這是一個Java SQL
Driver驅(qū)動程序,提供了對你選擇的其它類型的驅(qū)動程序的連接池封裝。可以非常簡單的移植到現(xiàn)存的代碼中。完全可配置。快速,成熟,健壯??梢酝该鞯貫槟悻F(xiàn)存的JDBC驅(qū)動程序增加連接池功能。
官方網(wǎng)站: 能詳細介紹一下么兩個都是開源數(shù)據(jù)庫連接池框架, JDBC連接你應該知道.
連接池是為了避免過多的開啟數(shù)據(jù)庫鏈接導致的資源消耗,由連接池在系統(tǒng)創(chuàng)建初始創(chuàng)建一定數(shù)量的數(shù)據(jù)庫連接放到連接池中,這些連接的數(shù)量是由最小數(shù)據(jù)庫連接數(shù)來設定的,
無論這些數(shù)據(jù)庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數(shù)量。連接池的最大數(shù)據(jù)庫連接數(shù)量限定了這個連接池能占有的最大連接數(shù),當應用程序向連接池請求的連接數(shù)超過最大連接數(shù)量時,這些請求將被加入到等待隊列中。其實就是為了節(jié)約資源
數(shù)據(jù)庫框架hibernate就都支持這兩個連接池java的3種數(shù)據(jù)庫連接池用哪個好?
1
dbcp
dbcp可能是使用最多的開源連接池,原因大概是因為配置方便,而且很多開源和tomcat應用例子都是使用的這個連接池吧。
這個連接池可以設置最大和最小連接,連接等待時間等,基本功能都有。這個連接池的配置參見附件壓縮包中的:dbcp.xml
使用評價:在具體項目應用中,發(fā)現(xiàn)此連接池的持續(xù)運行的穩(wěn)定性還是可以,不過速度稍慢,在大并發(fā)量的壓力下穩(wěn)定性
有所下降,此外不提供連接池監(jiān)控
2
c3p0
c3p0是另外一個開源的連接池,在業(yè)界也是比較有名的,這個連接池可以設置最大和最小連接,連接等待時間等,基本功能都有。
這個連接池的配置參見附件壓縮包中的:c3p0.xml。
使用評價:在具體項目應用中,發(fā)現(xiàn)此連接池的持續(xù)運行的穩(wěn)定性相當不錯,在大并發(fā)量的壓力下穩(wěn)定性也有一定保證,
此外不提供連接池監(jiān)控。
3
proxool
proxool這個連接池可能用到的人比較少,但也有一定知名度,這個連接池可以設置最大和最小連接,連接等待時間等,基本功能都有。
這個連接池的配置參見附件壓縮包中的:proxool.xml。
使用評價:在具體項目應用中,發(fā)現(xiàn)此連接池的持續(xù)運行的穩(wěn)定性有一定問題,有一個需要長時間跑批的任務場景任務,同樣的代碼java中數(shù)據(jù)庫連接池框架c3p0和dbcp的區(qū)別
C3P0是一個開源的JDBC連接池,它實現(xiàn)了數(shù)據(jù)源和JNDI綁定,支持JDBC3規(guī)范和JDBC2的標準擴展。目前使用它的開源項目有Hibernate,Spring等。
DBCP(DataBase pool),數(shù)據(jù)庫連接池。是 apache 上的一個 java 連接池項目,也是 tomcat 使用的連接池組件。
c3p0與dbcp區(qū)別:
dbcp沒有自動的去回收空閑連接的功能 c3p0有自動回收空閑連接功能
兩者主要是對數(shù)據(jù)連接的處理方式不同!C3P0提供最大空閑時間,DBCP提供最大連接數(shù)。
前者當連接超過最大空閑連接時間時,當前連接就會被斷掉。DBCP當連接數(shù)超過最大連接數(shù)時,所有連接都會被斷開。在spring開發(fā)中,c3p0.jar是什么東西,有什么作用,跟我們數(shù)據(jù)庫驅(qū)動sqljdbc4.jar有什么不同
c3p0 就是一個 數(shù)據(jù)庫連接池 ,利用 sqljdbc4 建立與數(shù)據(jù)庫的連接 , 并且管理這些連接,不用每次訪問數(shù)據(jù)庫都 重新發(fā)出數(shù)據(jù)庫連接請求,只需要在c3p0的連接池中拿一個過來就 可以了,這樣可以大大的提高性能。JNDI DBCP C3P0 JDBC ODBC 關系與區(qū)別 通俗易懂!
常用的數(shù)據(jù)庫連接池有以下幾種:
1.基于JNDI 、C3P0 、DBCP技術的數(shù)據(jù)連接池
(1)JNDI(Java Naming and Directory Interface ):是SUN公司提供的一種標準的Java命名系統(tǒng)接口,是一組在Java應用中訪問命名和目錄服務的API。命名服務是將名稱和對象聯(lián)系起來,使得我們可以用名稱訪問對象。目錄服務是一種命名服務,它提供了應用編程接口(
interface,API)和服務提供者接口(service provider interface,SPI)。這一點的真正含義是,要讓應用與命名服務或目錄服務交互,必須有這個服務的JNDI服務提供者,這正是JNDI
SPI發(fā)揮作用的地方。服務提供者基本上是一組類,這些類為各種具體的命名和目錄服務實現(xiàn)了JNDI接口—很象JDBC驅(qū)動為各種具體的數(shù)據(jù)庫系統(tǒng)實現(xiàn)了JDBC接口一樣。作為一個應用開發(fā)者,不必操心JNDI
SPI。只需要確認要使用的每一個命名或目錄服務都有服務提供者。
(2)C3P0:連接池作者是《星球大戰(zhàn)》迷,C3P0就是其中的一個機器人,并且這個名稱中包涵 和pool的單詞字母。因此叫這個名字。
(3)DBCP(DataBase pool):是 apache 上的一個 java 連接池項目,也是 tomcat
使用的連接池組件。單獨使用dbcp需要3個包:common-dbcp.jar,common-pool.jar ,common-.jar
(4)JDBC(Java DataBase
)是Java與數(shù)據(jù)庫的接口規(guī)范,JDBC定義了一個支持標準SQL功能的通用低層的應用程序編程接口(API),它由Java
語言編寫的類和接口組成,旨在讓各數(shù)據(jù)庫開發(fā)商為Java程序員提供標準的數(shù)據(jù)庫API。 JDBC
API定義了若干Java中的類,表示數(shù)據(jù)庫連接、SQL指令、結果集、數(shù)據(jù)庫元數(shù)據(jù)等。它允許Java程序員發(fā)送SQL指令并處理結果。通過驅(qū)動程序管理器,JDBC
API可利用不同的驅(qū)動程序連接不同的數(shù)據(jù)庫系統(tǒng)。
(5)ODBC(Open DataBase
)是微軟倡導的、當前被業(yè)界廣泛接受的、用于數(shù)據(jù)庫訪問的應用程序編程接口(API),它以X/Open和
ISO/IEC的調(diào)用級接口(CLI)規(guī)范為基礎,并使用結構化查詢語言(SQL)作為其數(shù)據(jù)庫訪問語言。 ODBC總體結構有四個組件:
區(qū)別和聯(lián)系:
JDBC與ODBC都是基于X/Open的SQL調(diào)用級接口,
JDBC的設計在思想上沿襲了ODBC,同時在其主要抽象和SQL
CLI實現(xiàn)上也沿襲了ODBC,這使得JDBC容易被接受。JDBC的總體結構類似于ODBC,也有四個組件:應用程序、驅(qū)動程序管理器、驅(qū)動程序和數(shù)據(jù)源。
JDBC保持了ODBC的基本特性,也獨立于特定數(shù)據(jù)庫。做Java開發(fā)的時候,是不是三大框架和設計模式用的特別頻繁啊?
JAVA編程中使用到的MVC三層結構較多,常見的有SSH(Spring + Struts +Hibernate)框架。設計模式一般用的不是太多,常見的有工廠模式(Factory )、單太模式(Singleton)、適配器(Adapter)等。并不是所有的項目使用設計模式都好,要看項目的規(guī)模,還有使用的必要性,因為在使用某些設計模式時,會在一定的程度上會消耗資源。給你個Java設計模式的PDF文檔: tomcat-dbcp.jar,但是如果用其他連接池就需要加jar包;
1.jndi是 Java 命名與目錄接口(Java Naming and Directory Interface);
你在配置數(shù)據(jù)源時,實在xml中配置的;直接使用字符信息獲取連接這種方式叫JNDI;
例如:
Context ctx=new (); Object =ctx.lookup("java:數(shù)據(jù)源名稱"); //引用數(shù)據(jù)源 ds=(); conn=ds.();
2.c3p0是一個數(shù)據(jù)庫連接池,數(shù)據(jù)庫連接池主要是控制最大連接數(shù)、最小連接數(shù)等等連接信息JAVA找工作應該掌握什么技術???
xml熟悉、 uml熟悉 、 jQuery (一種JS框架,是yahoo開發(fā)的)
還要懂 oracle \mysql \sql server 中的一兩種、 全懂更好。
現(xiàn)有這些就差不多了。
然后再了解 一下 c3p0 、 jndi 、dhcp 、
tomcat \ jboss \ weblogic 等 。
祝你成功!