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

前言

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

目录

1.普通连接方式

2.单例模式

3.连接池

分析

普通连接:

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

package com.jdbc.dao;
import java.sql.*;
 
public class BaseDAO {
        //打开数据库链接
        public Connection 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();
                }
                return conn;
        }
        //(重写)关闭链接
        public void Close(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
                }
        }
        //(重写)关闭链接
        public void Close(Connection conn,PreparedStatement pstmt)
        {
                try {
                        //关闭PerparedStatement对象
                        if (pstmt != null) {
                                pstmt.close();
                        }
                        //关闭链接
                        if (conn != null) {
                                conn.close();
                        }
                } catch (Exception e) {
                        // TODO: handle exception
                }
        }
        //增删改操作
        public int Update(String sql,Object[] parm)
        {
                int iRet = 0;
                Connection conn = null;
                PreparedStatement pstmt = null;
                try {
                        conn = getConn();
                        pstmt = conn.prepareStatement(sql);
                        //循环赋值参数
                        for (int i = 0; i < parm.length; i++) {
                                //为预编译sql设置参数
                                pstmt.setObject(i+1, parm);
                        }
                        //执行SQL语句
                        iRet = pstmt.executeUpdate();
                } catch (Exception e) {
                        e.printStackTrace();
                }
                finally
                {
                        Close(conn,pstmt);
                }
                return iRet;
        }
}

普及:

try{
//可能出现异常的代码
}catch(Execption e){
//如果发生异常处理的代码
}finally{
//无论是否异常都会执行的代码
try catch finally java中异常处理机制

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

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

举个例子:

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

总结:

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

单例连接:

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

package dao;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
 
public class BaseDao {
        private String className = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
        private String url = "jdbc:sqlserver://localhost:1433;databasename=SQLTMP";
        private String user = "sa";
        private String pwd = "sa";
        private static Connection conn = null;
         
        private BaseDao(){
                try {
                        Class.forName(className);
                        conn = DriverManager.getConnection(url,user,pwd);
                } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                } catch (SQLException e) {
                        e.printStackTrace();
                }
                 
        }
         
        public static Connection getConn(){
                if(conn != null){
                        return conn;
                }else{
                        new BaseDao();
                        return conn;
                }
        }
}

普及:

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

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

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

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

总结:

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

连接池:

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

context.xml
        <Resource 
                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
<resource-ref>
    <description>news DataSource</description>
    <res-ref-name>news</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>  
 
package com.news.dao;
import java.sql.*;
 
import javax.naming.*;
import javax.sql.DataSource;
 
public class BaseDao {
        /**
         * 创建连接池
         * */
        public Connection getConn(){
                Connection conn = null;
                try {
                        Context ctx = new InitialContext();
                        DataSource ds = (DataSource)ctx.lookup("java:comp/env/news");
                        conn = ds.getConnection();
                } catch (NamingException e) {
                        e.printStackTrace();
                } catch (SQLException e) {
                        e.printStackTrace();
                }
                return conn;
        }
}

普及:

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

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

总结:

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

写在最后

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

文章首链:http://bbs.ichunqiu.com/thread-8784-1-1.html

感谢您的阅读,如果您学到了,请点赞(码字不易)!

欢迎热心园友补充!

作者:0nise

时间: 2024-10-10 22:58:16

浅析B/S架构数据库连接方式的相关文章

mysql数据库连接方式(.net)

1.通过ado.net连接(数据库连接串中为中文貌似无法使用) 需要添加MySql.Data.dll(可通过安装mysql-connector-net-6.8.3.mis获得) 引用MySql.Data.dll 调用方式 string connectionString= “server=localhost;port=3306;database=dbtest;uid=root;pwd=111;” MySqlConnection conn = new MySqlConnection(connecti

数据库连接方式汇总

今天小编给大家分享一则汇总帖:数据库连接方式.希望大家都能收藏起来.并学以致用 1.Access数据库的DSN-less连接方法: set adocon=Server.Createobject("adodb.connection") adoconn.Open"Driver={Microsoft Access Driver(*.mdb)};DBQ="& _ Server.MapPath("数据库所在路径") 2.Access OLE DB连

WebForm(二)——控件和数据库连接方式

一.简单控件 1.Label(作用:显示文字) Web中: <asp:Label ID="Label1" runat="server" Text="Label" BorderColor="Black" BorderStyle="Solid" BorderWidth="5px"></asp:Label> 编译完成后的元素时span(html) <span id

spring Boot构建的Web应用中,基于MySQL数据库的几种数据库连接方式进行介绍

包括JDBC.JPA.MyBatis.多数据源和事务. 一.JDBC 连接数据库 1.属性配置文件(application.properties) spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driv

beego中各类数据库连接方式

beego 框架是优秀得go REST API开发框架.下面针对beego中各类数据库连接操作做一个总结. 1. orm连接方式 beego中的orm操作支持三种数据库:mysql,sqlite3,postgersql.三种数据库的驱动如下: import ( _ "github.com/go-sql-driver/mysql" _ "github.com/lib/pq" _ "github.com/mattn/go-sqlite3" ) 对于以

数据库连接方式比较

Oracle连接方式 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DBConnection { public DBConnection(){ driver="oracle.jdbc.driver.OracleDriver"

通达OA 新旧两种数据库连接方式

老的连接方式: include_once("/inc/conn.php"); $cursor = exequery($connection,$query); 新的连接方式: include_once("/inc/utility_all.php"); $cursor = exequery(TD::conn(),$query);

浅析linux进程通信的方式

求职笔试中,考察进程通信方式是一个老生长谈的问题,每次都让我答得一头雾水,于是我总结了一下 这些必须了解的知识点. 实现linux进程通信的方式有6种: --内存共享 --信号(Singal) --管道(Pipe) --消息队列(Message) --信号量(Semaphore) --socket 消息队列通信 请关注:http://blog.csdn.net/ljianhui/article/details/10287879 内存共享通信 请关注:http://blog.csdn.net/lj

Android PackageManager源码浅析以及静默安装实现方式

http://blog.csdn.net/sk719887916/article/details/50314017 Aandroid应用管理 http://blog.csdn.net/sk719887916/article/details/50314017 skay整理. 2016了 本篇成了我的开年之博文,距上次做静默安装和辅助服务已经半年多了,最近一直在做项目中的插件功能,也一直没时间整理平时接触的东西,甚至年终总结,今天就从经常用到的知识来开始2016的道路吧. Aandroid的应用管理