基本思想
- 為數(shù)據(jù)庫連接建立一個(gè)“緩沖池”。預(yù)先在緩沖池中放入一定數(shù)量的連接,當(dāng)需要建立數(shù)據(jù)庫連接時(shí),只需從“緩沖池”中取出一個(gè),使用完畢之后再放回去。
- 數(shù)據(jù)庫連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫連接,而不是重新建立一個(gè)。
- 最小數(shù)據(jù)庫連接數(shù):數(shù)據(jù)庫連接池在初始化時(shí)將創(chuàng)建一定數(shù)量的數(shù)據(jù)庫連接放到連接池中,無論這些數(shù)據(jù)庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數(shù)量。
- 最大數(shù)據(jù)庫連接數(shù):限定了這個(gè)連接池能占有的最大連接數(shù),當(dāng)應(yīng)用程序向連接池請(qǐng)求的連接數(shù)超過最大連接數(shù)量時(shí),這些請(qǐng)求將被加入到等待隊(duì)列中。

數(shù)據(jù)庫連接池工作原理
優(yōu)點(diǎn)
- 資源重用
由于數(shù)據(jù)庫連接得以重用,避免了頻繁創(chuàng)建,釋放連接引起的大量性能開銷。在減少系統(tǒng)消耗的基礎(chǔ)上,另一方面也增加了系統(tǒng)運(yùn)行環(huán)境的平穩(wěn)性。 - 更快的系統(tǒng)反應(yīng)速度
數(shù)據(jù)庫連接池在初始化過程中,往往已經(jīng)創(chuàng)建了若干數(shù)據(jù)庫連接置于連接池中備用。此時(shí)連接的初始化工作均已完成。對(duì)于業(yè)務(wù)請(qǐng)求處理而言,直接利用現(xiàn)有可用連接,避免了數(shù)據(jù)庫連接初始化和釋放過程的時(shí)間開銷,從而減少了系統(tǒng)的響應(yīng)時(shí)間 - 新的資源分配手段
對(duì)于多應(yīng)用共享同一數(shù)據(jù)庫的系統(tǒng)而言,可在應(yīng)用層通過數(shù)據(jù)庫連接池的配置,實(shí)現(xiàn)某一應(yīng)用最大可用數(shù)據(jù)庫連接數(shù)的限制,避免某一應(yīng)用獨(dú)占所有的數(shù)據(jù)庫資源 - 統(tǒng)一的連接管理,避免數(shù)據(jù)庫連接泄露
在較為完善的數(shù)據(jù)庫連接池實(shí)現(xiàn)中,可根據(jù)預(yù)先的占用超時(shí)設(shè)定,強(qiáng)制回收被占用連接,從而避免了常規(guī)數(shù)據(jù)庫連接操作中可能出現(xiàn)的資源泄露
使用DBCP連接池
1.直接連接
// 1.創(chuàng)建DBPC數(shù)據(jù)源實(shí)例
BasicDataSource bds = null;
bds = new BasicDataSource();
// 2.設(shè)置數(shù)據(jù)庫連接使用
bds.setUsername("root");
bds.setPassword("root");
bds.setUrl("jdbc:mysql://127.0.0.1:3306/test1");
bds.setDriverClassName("com.mysql.jdbc.Driver");
// 3.指定數(shù)據(jù)庫連接池屬性
// 3.1.設(shè)置初始連接數(shù)
bds.setInitialSize(10);
// 3.2.指定最大連接數(shù),同一時(shí)刻向數(shù)據(jù)庫申請(qǐng)的鏈接數(shù)和空閑的最大數(shù)
bds.setMaxTotal(50);
// 3.3.指定最小鏈接數(shù):在數(shù)據(jù)庫連接池中保存的最小的空閑連接的數(shù)量
bds.setMinIdle(5);
// 3.4.等待分配連接的最長時(shí)間,單位毫秒,超出則報(bào)異常
bds.setMaxWaitMillis(1000 * 5);
//4.從數(shù)據(jù)庫獲取連接
Connection conn = bds.getConnection();
2.工廠方式連接
String fileName = "dbcp.properties";
Properties properties = new Properties();
InputStream is = JDBCtest.class.getClassLoader().getResourceAsStream(fileName);
properties.load(is);
BasicDataSource bds = BasicDataSourceFactory.createDataSource(properties);
Connection conn = bds.getConnection();
注:數(shù)據(jù)庫連接池初始化一次
private static DataSource dataSource = null;
static { dataSource = BasicDataSourceFactory.createDataSource(properties);}
conn關(guān)閉時(shí)并不是真的關(guān)閉,而是歸還給數(shù)據(jù)庫連接池