前言
在许许多多的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