淺析B/S架構(gòu)數(shù)據(jù)庫連接方式

前言

在許許多多的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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悲酷,一起剝皮案震驚了整個濱河市套菜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌设易,老刑警劉巖逗柴,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異顿肺,居然都是意外死亡戏溺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進(jìn)店門屠尊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來于购,“玉大人,你說我怎么就攤上這事知染±呱” “怎么了?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵控淡,是天一觀的道長嫌吠。 經(jīng)常有香客問我,道長掺炭,這世上最難降的妖魔是什么辫诅? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮涧狮,結(jié)果婚禮上炕矮,老公的妹妹穿的比我還像新娘。我一直安慰自己者冤,他們只是感情好肤视,可當(dāng)我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著涉枫,像睡著了一般邢滑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上愿汰,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天困后,我揣著相機(jī)與錄音,去河邊找鬼衬廷。 笑死摇予,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吗跋。 我是一名探鬼主播侧戴,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了救鲤?” 一聲冷哼從身側(cè)響起久窟,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎本缠,沒想到半個月后斥扛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡丹锹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年稀颁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片楣黍。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡匾灶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出租漂,到底是詐尸還是另有隱情阶女,我是刑警寧澤,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布哩治,位于F島的核電站秃踩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏业筏。R本人自食惡果不足惜憔杨,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蒜胖。 院中可真熱鬧消别,春花似錦、人聲如沸台谢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽对碌。三九已至荆虱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間朽们,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工诉位, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留骑脱,地道東北人。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓苍糠,卻偏偏與公主長得像叁丧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,930評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法拥娄,類相關(guān)的語法蚊锹,內(nèi)部類的語法,繼承相關(guān)的語法稚瘾,異常的語法牡昆,線程的語...
    子非魚_t_閱讀 31,668評論 18 399
  • JDBC簡介 SUN公司為了簡化、統(tǒng)一對數(shù)據(jù)庫的操作摊欠,定義了一套Java操作數(shù)據(jù)庫的規(guī)范丢烘,稱之為JDBC。JDBC...
    奮斗的老王閱讀 1,520評論 0 51
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,815評論 0 11
  • 預(yù)編譯sql處理(防止sql注入) Statement : 執(zhí)行SQL命令CallableStatement : ...
    奮斗的老王閱讀 1,149評論 2 52
  • runtime作用: 1.獲取一個類的所有變量 2.獲取一個類的所有方法 3.改變一個類的私有變量的值 4.為一個...
    YH的練手記閱讀 215評論 0 0