當前位置:首頁 » 數據倉庫 » 資料庫連接池的好處
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

資料庫連接池的好處

發布時間: 2022-08-15 03:42:30

㈠ 簡單介紹連接池的優點和原理。

連接池運作原理在實際應用開發中,特別是在WEB應用系統中,如果JSP、Servlet或EJB使用JDBC直接訪問資料庫中的數據,每一次數據訪問請求都必須經歷建立資料庫連接、打開資料庫、存取數據和關閉資料庫連接等步驟,而連接並打開資料庫是一件既消耗資源又費時的工作,如果頻繁發生這種資料庫操作,系統的性能必然會急劇下降,甚至會導致系統崩潰。資料庫連接池技術是解決這個問題最常用的方法,在許多應用程序伺服器(例如:Weblogic,WebSphere,JBoss)中,基本都提供了這項技術,無需自己編程,但是,深入了解這項技術是非常必要的。資料庫連接池技術的思想非常簡單,將資料庫連接作為對象存儲在一個Vector對象中,一旦資料庫連接建立後,不同的資料庫訪問請求就可以共享這些連接,這樣,通過復用這些已經建立的資料庫連接,可以克服上述缺點,極大地節省系統資源和時間。資料庫連接池的主要操作如下:(1)建立資料庫連接池對象(伺服器啟動)。(2)按照事先指定的參數創建初始數量的資料庫連接(即:空閑連接數)。(3)對於一個資料庫訪問請求,直接從連接池中得到一個連接。如果資料庫連接池對象中沒有空閑的連接,且連接數沒有達到最大(即:最大活躍連接數),創建一個新的資料庫連接。(4)存取資料庫。(5)關閉資料庫,釋放所有資料庫連接(此時的關閉資料庫連接,並非真正關閉,而是將其放入空閑隊列中。如實際空閑連接數大於初始空閑連接數則釋放連接)。(6)釋放資料庫連接池對象(伺服器停止、維護期間,釋放資料庫連接池對象,並釋放所有連接)。連接池的實現1、連接池模型 本文討論的連接池包括一個連接池類(DBConnectionPool)和一個連接池管理類(DBConnetionPoolManager)。連接池類是對某一資料庫所有連接的「緩沖池」,主要實現以下功能:①從連接池獲取或創建可用連接;②使用完畢之後,把連接返還給連接池;③在系統關閉前,斷開所有連接並釋放連接佔用的系統資源;④還能夠處理無效連接(原來登記為可用的連接,由於某種原因不再可用,如超時,通訊問題),並能夠限制連接池中的連接總數不低於某個預定值和不超過某個預定值。 連接池管理類是連接池類的外覆類(wrapper),符合單例模式,即系統中只能有一個連接池管理類的實例。其主要用於對多個連接池對象的管理,具有以下功能:①裝載並注冊特定資料庫的JDBC驅動程序;②根據屬性文件給定的信息,創建連接池對象;③為方便管理多個連接池對象,為每一個連接池對象取一個名字,實現連接池名字與其實例之間的映射;④跟蹤客戶使用連接情況,以便需要是關閉連接釋放資源。連接池管理類的引入主要是為了方便對多個連接池的使用和管理,如系統需要連接不同的資料庫,或連接相同的資料庫但由於安全性問題,需要不同的用戶使用不同的名稱和密碼。 2、連接池實現 下面給出連接池類和連接池管理類的主要屬性及所要實現的基本介面: public class DBConnectionPool implements TimerListener{ private int checkedOut;//已被分配出去的連接數 private ArrayList freeConnections = new ArrayList();//容器,空閑池,根據//創建時間順序存放已創建但尚未分配出去的連接 private int minConn;//連接池裡連接的最小數量 private int maxConn;//連接池裡允許存在的最大連接數 private String name;//為這個連接池取個名字,方便管理 private String password;//連接資料庫時需要的密碼 private String url;//所要創建連接的資料庫的地址 private String user;//連接資料庫時需要的用戶名 public Timer timer;//定時器 public DBConnectionPool(String name, String URL, String user, String password, int maxConn)//公開的構造函數 public synchronized void freeConnection(Connection con) //使用完畢之後,//把連接返還給空閑池 public synchronized Connection getConnection(long timeout)//得到一個連接,//timeout是等待時間 public synchronized void release()//斷開所有連接,釋放佔用的系統資源 private Connection newConnection()//新建一個資料庫連接 public synchronized void TimerEvent() //定時器事件處理函數 } public class DBConnectionManager { static private DBConnectionManager instance;//連接池管理類的唯一實例 static private int clients;//客戶數量 private ArrayList drivers = new ArrayList();//容器,存放資料庫驅動程序 private HashMap pools = new HashMap ();//以name/value的形式存取連接池//對象的名字及連接池對象 static synchronized public DBConnectionManager getInstance()//如果唯一的//實例instance已經創建,直接返回這個實例;否則,調用私有構造函數,創//建連接池管理類的唯一實例 private DBConnectionManager()//私有構造函數,在其中調用初始化函數init() public void freeConnection(String name, Connection con)// 釋放一個連接,//name是一個連接池對象的名字 public Connection getConnection(String name)//從名字為name的連接池對象//中得到一個連接 public Connection getConnection(String name, long time)//從名字為name //的連接池對象中取得一個連接,time是等待時間 public synchronized void release()//釋放所有資源 private void createPools(Properties props)//根據屬性文件提供的信息,創建//一個或多個連接池 private void init()//初始化連接池管理類的唯一實例,由私有構造函數調用 private void loadDrivers(Properties props)//裝載資料庫驅動程序 } 3、連接池使用 上面所實現的連接池在程序開發時如何應用到系統中呢?下面以Servlet為例說明連接池的使用。 Servlet的生命周期是:在開始建立servlet時,調用其初始化(init)方法。之後每個用戶請求都導致一個調用前面建立的實例的service方法的線程。最後,當伺服器決定卸載一個servlet時,它首先調用該servlet的 destroy方法。 根據servlet的特點,我們可以在初始化函數中生成連接池管理類的唯一實例(其中包括創建一個或多個連接池)。如: public void init() throws ServletException { connMgr = DBConnectionManager.getInstance(); } 然後就可以在service方法中通過連接池名稱使用連接池,執行資料庫操作。最後在destroy方法中釋放佔用的系統資源,如: public void destroy() { connMgr.release(); super.destroy(); } 結束語在使用JDBC進行與資料庫有關的應用開發中,資料庫連接的管理是一個難點。很多時候,連接的混亂管理所造成的系統資源開銷過大成為制約大型企業級應用效率的瓶頸。對於眾多用戶訪問的Web應用,採用資料庫連接技術的系統在效率和穩定性上比採用傳統的其他方式的系統要好很多。本文闡述了使用JDBC訪問資料庫的技術?討論了基於連接池技術的資料庫連接管理的關鍵問題並給出了一個實現模型。文章所給出的是連接池管理程序的一種基本模式,為提高系統的整體性能,在此基礎上還可以進行很多有意義的擴展。 http://www.webdevelopersjournal.com/columns/connection_pool.html http://www.webdevelopersjournal.com/columns/DBConnectionManager.java

㈡ 為什麼要用Spring管理連接池,它有什麼好處

使用應用伺服器的連接池,效率較高,而且不需要在代碼中出現資料庫信息。
使用spring管理連接池的話,與伺服器無關,便於移植。

㈢ 為什麼說Druid是「最好的資料庫連接池」

1、可以監控資料庫訪問性能,Druid內置提供了一個功能強大的StatFilter插件,能夠詳細統計sql的執行性能,這對於線上分析資料庫訪問性能有幫助。

2、資料庫密碼加密。直接把資料庫密碼寫在配置文件中,這是不好的行為,容易導致安全問題。DruidDruiver和DruidDataSource都支持PasswordCallback。

3、SQL執行日誌,Druid提供了不同的LogFilter,能夠支持Common-Logging、Log4j和JdkLog,你可以按需要選擇相應的LogFilter,監控你應用的資料庫訪問情況。

4、擴展JDBC,如果你要對JDBC層有編程的需求,可以通過Druid提供的Filter機制,很方便編寫JDBC層的擴展插件。

㈣ 請解釋資料庫連接池的原理,以及作用

貼個文章給你吧
資料庫連接是一種關鍵的有限的昂貴的資源,這一點在多用戶的網頁應用程序中體現得尤為突出。對資料庫連接的管理能顯著影響到整個應用程序的伸縮性和健壯性,影響到程序的性能指標。資料庫連接池正是針對這個問題提出來的。
資料庫連接池負責分配、管理和釋放資料庫連接,它允許應用程序重復使用一個現有的資料庫連接,而再不是重新建立一個;釋放空閑時間超過最大空閑時間的資料庫連接來避免因為沒有釋放資料庫連接而引起的資料庫連接遺漏。這項技術能明顯提高對資料庫操作的性能。
資料庫連接池在初始化時將創建一定數量的資料庫連接放到連接池中,這些資料庫連接的數量是由最小資料庫連接數來設定的。無論這些資料庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數量。連接池的最大資料庫連接數量限定了這個連接池能佔有的最大連接數,當應用程序向連接池請求的連接數超過最大連接數量時,這些請求將被加入到等待隊列中。資料庫連接池的最小連接數和最大連接數的設置要考慮到下列幾個因素:
1) 最小連接數是連接池一直保持的資料庫連接,所以如果應用程序對資料庫連接的使用量不大,將會有大量的資料庫連接資源被浪費;
2) 最大連接數是連接池能申請的最大連接數,如果資料庫連接請求超過此數,後面的資料庫連接請求將被加入到等待隊列中,這會影響之後的資料庫操作。
3) 如果最小連接數與最大連接數相差太大,那麼最先的連接請求將會獲利,之後超過最小連接數量的連接請求等價於建立一個新的資料庫連接。不過,這些大於最小連接數的資料庫連接在使用完不會馬上被釋放,它將被放到連接池中等待重復使用或是空閑超時後被釋放。

㈤ 不用Java資料庫連接池行嗎

在數據量很小的情況下,並且做好資料庫連接的釋放.是可以的.

為什麼要用連接池:
訪問資料庫時,比較費時的就是建立一條穩定的連接.
也許你查詢一次資料庫花的時間是2ms,而建立一個資料庫連接的時間是200ms.
使用資料庫連接池的好處就是將連接緩存起來,用的時候直接拿,而不需要每次都重新連接.
一定程度上提高的效率.

㈥ 資料庫連接池的作用是什麼

連接池是被j2ee伺服器打開和維護的 對應1、2、4的JDBC驅動程序 連接池一般比直接連接更有優越性 因為它提高了性能的同時還保存了 寶貴的資源。 打開資料庫連接時CPU和網路的重要 任務,因此,在整個應用程序的使用過程 當中重復的打開直接連接將導致性能的下降。 而池連接只在伺服器啟動時打開一次,從而 消除了這種性能問題。 另外,因為連接只用於很短的時間, 所以,連接可以被有效共享, 而且有關連接參數的特有信息, 只對池驅動程序有效, 如資料庫用戶名稱和密碼, 從而增強了系統的安全性和可管理性。

㈦ 簡述為什麼要使用資料庫連接池

資料庫連接是一種關鍵的有限的昂貴的資源,這一點在多用戶的網頁應用程序中體現得尤為突出。對資料庫連接的管理能顯著影響到整個應用程序的伸縮性和健壯性,影響到程序的性能指標。資料庫連接池正是針對這個問題提出來的。資料庫連接池負責分配、管理和釋放資料庫連接,它允許應用程序重復使用一個現有的資料庫連接,而不是再重新建立一個;釋放空閑時間超過最大空閑時間的資料庫連接來避免因為沒有釋放資料庫連接而引起的資料庫連接遺漏。這項技術能明顯提高對資料庫操作的性能。

㈧ 系統開大量的資料庫連接池會有什麼問題

資料庫連接池,簡稱dbcp database connection pool 存在意義: 資料庫的連接是非常耗費系統資源的,一個應用通常都是需要與資料庫打交道,也就需要經常連接資料庫,這樣導致浪費大量系統資源; 連接池的原理就是:我事先創建好幾個資料庫連接放著,當我的系統需要操作資料庫時就從連接池裡直接拿連接,並將這個連接標記為 忙 ;用完後在放會池中,標記為 空閑;;; 當連接池裡的連接都在被使用,如果此時還要連接,連接池就會在創建連接放到池裡,,這些連接的數量,都是在配置文件里由你控制的

㈨ 什麼是資料庫連接池,有什麼作用

資料庫連接是一種有限的昂貴的資源,
資料庫連接影響到程序的性能指標。
資料庫連接池正是針對這個問題提出來的。資料庫連接池負責分配、
管理和釋放資料庫連接,
它允許應用程序重復使用一個現有的資料庫連接,
而再不是重新建立一個;
釋放空閑時間超過最大空閑時間的資料庫連接來避免因為沒有釋放數
據庫連接而引起的資料庫連接遺漏。
這項技術能明顯提高對資料庫操作的性能。

㈩ Java開發常用的幾個資料庫連接池

資料庫連接池的好處是不言而喻的,現在大部分的application
server都提供自己的資料庫連接池方案,此時,只要按照application server的文檔說明,正確配置,即可在應用中享受到資料庫連接池的好處。

但是,有些時候,我們的應用是個獨立的java
application,並不是普通的WEB/J2EE應用,而且是單獨運行的,不要什麼application
server的配合,這種情況下,我們就需要建立自己的資料庫連接池方案了。

1、 DBCP

DBCP是Apache的一個開源項目:
commons.dbcp

DBCP依賴Apache的另外2個開源項目
commons.collections和commons.pool

dbcp包,目前版本是1.2.1:http://jakarta.apache.org/commons/dbcp/

pool包,目前版本是1.3:http://jakarta.apache.org/commons/pool/,

common-collections包:http://jakarta.apache.org/commons/collections/

下載這些包並將這些包的路徑添加到classpath中就可以使用dbcp做為項目中的資料庫連接池使用了。

在建立我們自己的資料庫連接池時,可以使用xml文件來傳入需要的參數,這里只使用hard
code的方式來簡單介紹,所有需要我們自己寫的代碼很少,只要建立一個文件如下:
import
org.apache.commons.dbcp.BasicDataSource;
import
org.apache.commons.dbcp.BasicDataSourceFactory;
import
java.sql.SQLException;
import java.sql.Connection;
import
java.util.Properties;

public class ConnectionSource {

private static BasicDataSource dataSource =
null;

public ConnectionSource() {
}

public static void init() {

if (dataSource != null) {
try
{
dataSource.close();
} catch (Exception e)
{
}

dataSource = null;
}

try {
Properties p = new
Properties();

p.setProperty("driverClassName",
"oracle.jdbc.driver.OracleDriver");
p.setProperty("url",
"jdbc:oracle:thin:@192.168.0.1:1521:testDB");

p.setProperty("password", "scott");
p.setProperty("username",
"tiger");
p.setProperty("maxActive", "30");

p.setProperty("maxIdle", "10");
p.setProperty("maxWait",
"1000");
p.setProperty("removeAbandoned",
"false");
p.setProperty("removeAbandonedTimeout",
"120");
p.setProperty("testOnBorrow", "true");

p.setProperty("logAbandoned", "true");

dataSource = (BasicDataSource)
BasicDataSourceFactory.createDataSource(p);

} catch (Exception e) {
}

}

public static synchronized Connection
getConnection() throws SQLException {

if (dataSource == null) {

init();
}

Connection conn = null;

if (dataSource != null) {

conn = dataSource.getConnection();
}

return conn;
}
}

接下來,在我們的應用中,只要簡單地使用ConnectionSource.getConnection()就可以取得連接池中的資料庫連接,享受資料庫連接帶給我們的好處了。當我們使用完取得的資料庫連接後,只要簡單地使用connection.close()就可把此連接返回到連接池中,至於為什麼不是直接關閉此連接,而是返回給連接池,這是因為dbcp使用委派模型來實現Connection介面了。

在使用Properties來創建BasicDataSource時,有很多參數可以設置,比較重要的還有:

testOnBorrow、testOnReturn、testWhileIdle,他們的意思是當是取得連接、返回連接或連接空閑時是否進行有效性驗證(即是否還和資料庫連通的),默認都為false。所以當資料庫連接因為某種原因斷掉後,再從連接池中取得的連接,實際上可能是無效的連接了,所以,為了確保取得的連接是有效的,
可以把把這些屬性設為true。當進行校驗時,需要另一個參數:validationQuery,對oracle來說,可以是:SELECT COUNT(*) FROM
DUAL,實際上就是個簡單的SQL語句,驗證時,就是把這個SQL語句在資料庫上跑一下而已,如果連接正常的,當然就有結果返回了。

還有2個參數:timeBetweenEvictionRunsMillis 和
minEvictableIdleTimeMillis,
他們兩個配合,可以持續更新連接池中的連接對象,當timeBetweenEvictionRunsMillis
大於0時,每過timeBetweenEvictionRunsMillis
時間,就會啟動一個線程,校驗連接池中閑置時間超過minEvictableIdleTimeMillis的連接對象。

還有其他的一些參數,可以參考源代碼。

2、
C3P0:

C3P0是一個開放源代碼的JDBC連接池,C3PO
連接池是一個優秀的連接池,推薦使用。C3PO實現了JDBC3.0規范的部分功能,因而性能更加突出,包括了實現jdbc3和jdbc2擴展規范說明的Connection 和Statement 池的DataSources 對象。
下載地址:http://sourceforge.net/projects/c3p0

package
com.systex.utils.web;

import java.beans.PropertyVetoException;
import
java.sql.Connection;
import java.sql.SQLException;
import
javax.sql.DataSource;
import
com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3PODataSource {
private static
ComboPooledDataSource dataSource = 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 DataSource getDataSource() {
if
(dataSource == null) {
dataSource = new ComboPooledDataSource();
try
{
dataSource.setDriverClass(driver);
} catch (PropertyVetoException
e) {
System.out.println("DataSource Load Driver
Exception!!");
e.printStackTrace();
}
dataSource.setJdbcUrl(url);
dataSource.setUser(userName);
dataSource.setPassword(password);
//
設置連接池最大連接容量
dataSource.setMaxPoolSize(20);
//
設置連接池最小連接容量
dataSource.setMinPoolSize(2);
//
設置連接池最大statements對象容量
dataSource.setMaxStatements(100);
}
return
dataSource;
}

public static Connection getConnection() throws
SQLException {
return
C3PODataSource.getDataSource().getConnection();
}
}

3、 Proxool

這是一個Java SQL
Driver驅動程序,提供了對你選擇的其它類型的驅動程序的連接池封裝。可以非常簡單的移植到現存的代碼中。完全可配置。快速,成熟,健壯。可以透明地為你現存的JDBC驅動程序增加連接池功能。

官方網站: http://proxool.sourceforge.net/

下載地址:http://proxool.sourceforge.net/download.html