浅析B/S架构数据库连接方式

2016-07-28  本文已影响70人  池寒

前言

在许许多多的B/S架构系统中都涉及到了数据库的链接,那么对于数据库连接的方式有哪些?可能出现的问题是什么?

目录

1.普通连接方式

2.单例模式

3.连接池

分析

普通连接:

下面是我们一般使用的普通连接方式的代码(jsp)

[Java]纯文本查看复制代码

?

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 {

//打开数据库链接

publicConnection getConn()

{

Connection conn =null;

try{

//加载驱动

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;

}

//(重写)关闭链接

publicvoidClose(Connection conn,PreparedStatement pstmt,ResultSet rs)

{

try{

//关闭结果集

if(rs !=null) {

rs.close();

}

//关闭PerparedStatement对象

if(pstmt !=null) {

pstmt.close();

}

//关闭链接

if(conn !=null) {

conn.close();

}

}catch(Exception e) {

// TODO: handle exception

}

}

//(重写)关闭链接

publicvoidClose(Connection conn,PreparedStatement pstmt)

{

try{

//关闭PerparedStatement对象

if(pstmt !=null) {

pstmt.close();

}

//关闭链接

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);

//循环赋值参数

for(inti =0; i < parm.length; i++) {

//为预编译sql设置参数

pstmt.setObject(i+1, parm);

}

//执行SQL语句

iRet = pstmt.executeUpdate();

}catch(Exception e) {

e.printStackTrace();

}

finally

{

Close(conn,pstmt);

}

returniRet;

}

}

普及:

[Java]纯文本查看复制代码

?

1

2

3

4

5

6

7try{

//可能出现异常的代码

}catch(Execption e){

//如果发生异常处理的代码

}finally{

//无论是否异常都会执行的代码

trycatchfinallyjava中异常处理机制

我们来分析一下写一段代码,其中Update方法是用来更新数据的,其中我们可以看到try中包含了getConn()方法用来获取Connection连接对象,到最后我们可以在finally代码块中看到Close()方法用来关闭创建的Connection对象以及PreparedStatement对象,这么消耗我们很大的内存空间。

如果用户同时点注册按钮那么服务器首先执行打开数据库连接Connection多个用户注册就会打开多个Connection那么并且同时添加到数据库,服务器就会在执行添加的时候就会发生异常。分不清楚用户注册的信息。举个例子:

左边的三个人同时对另一人喊不同的一个字,右边的一个人就会分不清,左边三个人喊了什么?(可以做真人实例)

总结:

从分析中,我们看到普通的连接方式中无法处理并发问题!如果你想知道解决方法那么请继续看下去。

单例连接:

下面一段单利模式中的数据库连接代码

[Java]纯文本查看复制代码

?

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;

}

}

}

普及:

构造方法:访问修饰符(public|private) 类名

构造方法在实例化的时候就会调用

我们分析一下这一段代码中Connection在构造方法中创建用过getConn方法获取连接。

我们从图片中和代码中可以看到全程中只有一个Connection连接,那么这样就可以降低服务器的压力,解决并发问题

总结:

从分析中,我们看到单例模式,可以减轻服务器的压力,解决并发问题,如果够仔细的话大家会发现getConn方法是一个静态方法,而且其他属性和方法都是private从而大大提高了安全性。这种连接方式适合:个人开发和国家单位开发(安全性高)

连接池:

下面一段连接池数据库连接代码

[Java]纯文本查看复制代码

?

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 {

/**

* 创建连接池

* */

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;

}

}

普及:

连接池:连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要他们的线程使用。

我们可以直接使用getConn方法获得Connection并且执行数据操作,执行完成之后连接池会回收Connection这样就解决了普通模式中的并发问题.

总结:

从分析中,我们看到Connection不需要创建,这样就简化编程模式,这样减少了连接的创建时间,连接池能够使性能最大化,同事还能将资源利用控制在一定的水平之下,如果超过该水平,应用程序将崩溃而不仅仅是变慢。

写在最后

清楚的了解B/S架构中的数据库连接方式,在合适的情况下使用合适的连接方式感觉还是棒棒哒 ~ ~!

本文原创作者:0nise,转载须注明来自i春秋社区bbs.ichunqiu.com

来源:http://bbs.ichunqiu.com/thread-8784-1-1.html?from=ch

上一篇下一篇

猜你喜欢

热点阅读