前言
在許許多多的B/S架構(gòu)系統(tǒng)中都涉及到了數(shù)據(jù)庫的鏈接布疙,那么對于數(shù)據(jù)庫連接的方式有哪些?可能出現(xiàn)的問題是什么剑梳?
目錄
1.普通連接方式
2.單例模式
3.連接池
分析
普通連接:
下面是我們一般使用的普通連接方式的代碼(jsp)
[Java]純文本查看復(fù)制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84packagecom.jdbc.dao;
importjava.sql.*;
publicclassBaseDAO {
//打開數(shù)據(jù)庫鏈接
publicConnection getConn()
{
Connection conn =null;
try{
//加載驅(qū)動
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//打開鏈接
conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName= epetDB","sa","sa");
}catch(ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch(SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
returnconn;
}
//(重寫)關(guān)閉鏈接
publicvoidClose(Connection conn,PreparedStatement pstmt,ResultSet rs)
{
try{
//關(guān)閉結(jié)果集
if(rs !=null) {
rs.close();
}
//關(guān)閉PerparedStatement對象
if(pstmt !=null) {
pstmt.close();
}
//關(guān)閉鏈接
if(conn !=null) {
conn.close();
}
}catch(Exception e) {
// TODO: handle exception
}
}
//(重寫)關(guān)閉鏈接
publicvoidClose(Connection conn,PreparedStatement pstmt)
{
try{
//關(guān)閉PerparedStatement對象
if(pstmt !=null) {
pstmt.close();
}
//關(guān)閉鏈接
if(conn !=null) {
conn.close();
}
}catch(Exception e) {
// TODO: handle exception
}
}
//增刪改操作
publicintUpdate(String sql,Object[] parm)
{
intiRet =0;
Connection conn =null;
PreparedStatement pstmt =null;
try{
conn = getConn();
pstmt = conn.prepareStatement(sql);
//循環(huán)賦值參數(shù)
for(inti =0; i < parm.length; i++) {
//為預(yù)編譯sql設(shè)置參數(shù)
pstmt.setObject(i+1, parm);
}
//執(zhí)行SQL語句
iRet = pstmt.executeUpdate();
}catch(Exception e) {
e.printStackTrace();
}
finally
{
Close(conn,pstmt);
}
returniRet;
}
}
普及:
[Java]純文本查看復(fù)制代碼
1
2
3
4
5
6
7try{
//可能出現(xiàn)異常的代碼
}catch(Execption e){
//如果發(fā)生異常處理的代碼
}finally{
//無論是否異常都會執(zhí)行的代碼
trycatchfinallyjava中異常處理機(jī)制
我們來分析一下寫一段代碼,其中Update方法是用來更新數(shù)據(jù)的,其中我們可以看到try中包含了getConn()方法用來獲取Connection連接對象,到最后我們可以在finally代碼塊中看到Close()方法用來關(guān)閉創(chuàng)建的Connection對象以及PreparedStatement對象,這么消耗我們很大的內(nèi)存空間管引。
如果用戶同時點注冊按鈕那么服務(wù)器首先執(zhí)行打開數(shù)據(jù)庫連接Connection多個用戶注冊就會打開多個Connection那么并且同時添加到數(shù)據(jù)庫,服務(wù)器就會在執(zhí)行添加的時候就會發(fā)生異常。分不清楚用戶注冊的信息淌喻。舉個例子:
左邊的三個人同時對另一人喊不同的一個字,右邊的一個人就會分不清,左邊三個人喊了什么?(可以做真人實例)
總結(jié):
從分析中,我們看到普通的連接方式中無法處理并發(fā)問題!如果你想知道解決方法那么請繼續(xù)看下去妓柜。
單例連接:
下面一段單利模式中的數(shù)據(jù)庫連接代碼
[Java]純文本查看復(fù)制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34packagedao;
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.SQLException;
publicclassBaseDao {
privateString className ="com.microsoft.sqlserver.jdbc.SQLServerDriver";
privateString url ="jdbc:sqlserver://localhost:1433;databasename=SQLTMP";
privateString user ="sa";
privateString pwd ="sa";
privatestaticConnection conn =null;
privateBaseDao(){
try{
Class.forName(className);
conn = DriverManager.getConnection(url,user,pwd);
}catch(ClassNotFoundException e) {
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();
}
}
publicstaticConnection getConn(){
if(conn !=null){
returnconn;
}else{
newBaseDao();
returnconn;
}
}
}
普及:
構(gòu)造方法:訪問修飾符(public|private) 類名
構(gòu)造方法在實例化的時候就會調(diào)用
我們分析一下這一段代碼中Connection在構(gòu)造方法中創(chuàng)建用過getConn方法獲取連接。
我們從圖片中和代碼中可以看到全程中只有一個Connection連接,那么這樣就可以降低服務(wù)器的壓力,解決并發(fā)問題
總結(jié):
從分析中,我們看到單例模式,可以減輕服務(wù)器的壓力,解決并發(fā)問題,如果夠仔細(xì)的話大家會發(fā)現(xiàn)getConn方法是一個靜態(tài)方法,而且其他屬性和方法都是private從而大大提高了安全性涯穷。這種連接方式適合:個人開發(fā)和國家單位開發(fā)(安全性高)
連接池:
下面一段連接池數(shù)據(jù)庫連接代碼
[Java]純文本查看復(fù)制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45context.xml
name="news"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="1000"
username="sa"
password="sa"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://localhost:1433;DatabaseName=NewsManagerSystem"
/>
Web.xml
news DataSource
news
javax.sql.DataSource
Container
packagecom.news.dao;
importjava.sql.*;
importjavax.naming.*;
importjavax.sql.DataSource;
publicclassBaseDao {
/**
* 創(chuàng)建連接池
* */
publicConnection getConn(){
Connection conn =null;
try{
Context ctx =newInitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/news");
conn = ds.getConnection();
}catch(NamingException e) {
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();
}
returnconn;
}
}
普及:
連接池:連接池是創(chuàng)建和管理一個連接的緩沖池的技術(shù),這些連接準(zhǔn)備好被任何需要他們的線程使用棍掐。
我們可以直接使用getConn方法獲得Connection并且執(zhí)行數(shù)據(jù)操作,執(zhí)行完成之后連接池會回收Connection這樣就解決了普通模式中的并發(fā)問題.
總結(jié):
從分析中,我們看到Connection不需要創(chuàng)建拷况,這樣就簡化編程模式作煌,這樣減少了連接的創(chuàng)建時間,連接池能夠使性能最大化赚瘦,同事還能將資源利用控制在一定的水平之下粟誓,如果超過該水平,應(yīng)用程序?qū)⒈罎⒍粌H僅是變慢起意。
寫在最后
清楚的了解B/S架構(gòu)中的數(shù)據(jù)庫連接方式鹰服,在合適的情況下使用合適的連接方式感覺還是棒棒噠 ~ ~!
本文原創(chuàng)作者:0nise,轉(zhuǎn)載須注明來自i春秋社區(qū)(bbs.ichunqiu.com)
來源:http://bbs.ichunqiu.com/thread-8784-1-1.html?from=ch