一、開頭牢騷
DriverManager是我從接觸jdbc以來盏袄,一直使用的獲取數(shù)據(jù)庫連接的類忿峻,相當(dāng)好用。
但是辕羽,在學(xué)習(xí)DataSource之前逛尚,我并沒有意識到使用DriverManager會給系統(tǒng)帶來負擔(dān)和資源浪費。
因為我并沒有意識到刁愿,使用DriverManager類來獲取的Connection連接绰寞,是無法重復(fù)利用的。要想重復(fù)利用铣口,必須重新創(chuàng)建連接滤钱。
而創(chuàng)建連接,又很耗費時間和資源脑题!
所以我喜新厭舊了件缸。
我告訴自己要開始另一段生活,要好好學(xué)習(xí)叔遂、天天向上他炊,要上得廳堂、下得廚房已艰,要當(dāng)四有青年痊末。
我找到了DataSource!
二、知識點講解
1.何為數(shù)據(jù)源哩掺?
百度的答案:數(shù)據(jù)源是指數(shù)據(jù)庫應(yīng)用程序所使用的數(shù)據(jù)庫或者數(shù)據(jù)庫服務(wù)器
我的理解:數(shù)據(jù)源就是我們在MySQL中創(chuàng)建的每一個數(shù)據(jù)庫凿叠,比如你創(chuàng)建了一個bbs的數(shù)據(jù)庫,那么數(shù)據(jù)源就是這個bbs.
2.何為數(shù)據(jù)庫連接池嚼吞?
我的理解:就是一個專門用來存放和管理數(shù)據(jù)庫連接對象的東西盒件。
3.為什么要有數(shù)據(jù)庫連接池?
用戶每一次請求都要跟數(shù)據(jù)庫建立連接誊薄,而數(shù)據(jù)庫創(chuàng)建連接需要消耗相當(dāng)大的資源,如果有十萬個用戶锰茉,意味著要建立十萬個連接呢蔫,這樣子消耗數(shù)據(jù)庫資源太大,也很容易出現(xiàn)錯誤。而利用連接池我們能夠?qū)B接進行管理片吊,在數(shù)據(jù)庫連接池中绽昏,有一定數(shù)量的數(shù)據(jù)庫連接對象。用戶每一次請求連接俏脊,都要從數(shù)據(jù)庫連接池中請求全谤,這樣子的話,一個連接對象就可以被多次使用爷贫。就能夠極大的提高數(shù)據(jù)庫資源的利用率认然。
具體的對比圖如下:
4.DataSource對象代表了什么漫萄?
DataSource對象代表了一個數(shù)據(jù)源卷员,通過DataSource對象,我們可以獲取數(shù)據(jù)庫連接腾务。
三毕骡、Tomcat7中獲取DataSource對象
1.在Tomcat7的conf/server.xml下的<GlobalNamingResources>節(jié)點里配置resource
//其中name="jdbc/bbs"可以隨意取
//maxActive是連接池中最大激活連接數(shù)
<Resource name="jdbc/bbs"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
testWhileIdle="true"
testOnBorrow="true"
testOnReturn="false"
validationInterval="30000"
timeBetweenEvictionRunsMillis="30000"
maxActive="30"
minIdle="5"
maxWait="10000"
initialSize="10"
removeAbandonedTimeout="60"
removeAbandoned="true"
logAbandoned="true"
minEvictableIdleTimeMillis="30000"
jmxEnabled="true"
jdbcInterceptors=
"org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
username="root"
password="123"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/bbs"/>
2.在context.xml文件的<Context></Context>節(jié)點中添加如下配置:
···
<ResourceLink global="jdbc/bbs" name="jdbc/bbs" type="javax.sql.DataSource"/>
···
3.具體的Java代碼
public class DBUtil {
public static Connection getConn() throws Exception{
Connection conn = null;
DataSource ds = null;
Context ctx = new InitialContext();
//java:comp/env是固定的,所有的數(shù)據(jù)庫都一樣
Context ctx1 = (Context)ctx.lookup("java:comp/env");
Context ctx2 = (Context)ctx1.lookup("jdbc");
ds = (DataSource)ctx2.lookup("bbs");
if(ds != null){
conn = ds.getConnection();
}
return conn;
}
public static void closeConn(Connection conn, PreparedStatement ps, ResultSet rs){
try {
if(conn != null){
conn.close();
}
if(rs != null){
rs.close();
}
if(ps != null){
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
不知道小魚有沒有講清楚岩瘦,如果覺得小魚的文章還不錯的話未巫,各位客官看完之后千萬不要忘記點贊和評論哦!