美文网首页
浅析B/S架构数据库连接方式

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

作者: 池寒 | 来源:发表于2016-07-28 09:54 被阅读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

    相关文章

      网友评论

          本文标题:浅析B/S架构数据库连接方式

          本文链接:https://www.haomeiwen.com/subject/yxlajttx.html