前言
在许许多多的B/S架构系统中都涉及到了数据库的链接,那么对于数据库连接的方式有哪些?可能出现的问题是什么?
 
目录
1.普通连接方式
2.单例模式
3.连接池
 
分析
普通连接:
下面是我们一般使用的普通连接方式的代码(jsp)
  1. package com.jdbc.dao;
  2. import java.sql.*;
  3.  
  4. public class BaseDAO {
  5.         //打开数据库链接
  6.         public Connection getConn()
  7.         {
  8.                 Connection conn = null;
  9.                 try {
  10.                         //加载驱动
  11.                         Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
  12.                         //打开链接
  13.                         conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName = epetDB","sa","sa");
  14.                 } catch (ClassNotFoundException e) {
  15.                         // TODO Auto-generated catch block
  16.                         e.printStackTrace();
  17.                 } catch (SQLException e) {
  18.                         // TODO Auto-generated catch block
  19.                         e.printStackTrace();
  20.                 }
  21.                 return conn;
  22.         }
  23.         //(重写)关闭链接
  24.         public void Close(Connection conn,PreparedStatement pstmt,ResultSet rs)
  25.         {
  26.                 try {
  27.                         //关闭结果集
  28.                         if (rs != null) {
  29.                                 rs.close();
  30.                         }
  31.                         //关闭PerparedStatement对象
  32.                         if (pstmt != null) {
  33.                                 pstmt.close();
  34.                         }
  35.                         //关闭链接
  36.                         if (conn != null) {
  37.                                 conn.close();
  38.                         }
  39.                 } catch (Exception e) {
  40.                         // TODO: handle exception
  41.                 }
  42.         }
  43.         //(重写)关闭链接
  44.         public void Close(Connection conn,PreparedStatement pstmt)
  45.         {
  46.                 try {
  47.                         //关闭PerparedStatement对象
  48.                         if (pstmt != null) {
  49.                                 pstmt.close();
  50.                         }
  51.                         //关闭链接
  52.                         if (conn != null) {
  53.                                 conn.close();
  54.                         }
  55.                 } catch (Exception e) {
  56.                         // TODO: handle exception
  57.                 }
  58.         }
  59.         //增删改操作
  60.         public int Update(String sql,Object[] parm)
  61.         {
  62.                 int iRet = 0;
  63.                 Connection conn = null;
  64.                 PreparedStatement pstmt = null;
  65.                 try {
  66.                         conn = getConn();
  67.                         pstmt = conn.prepareStatement(sql);
  68.                         //循环赋值参数
  69.                         for (int i = 0; i < parm.length; i++) {
  70.                                 //为预编译sql设置参数
  71.                                 pstmt.setObject(i+1, parm);
  72.                         }
  73.                         //执行SQL语句
  74.                         iRet = pstmt.executeUpdate();
  75.                 } catch (Exception e) {
  76.                         e.printStackTrace();
  77.                 }
  78.                 finally
  79.                 {
  80.                         Close(conn,pstmt);
  81.                 }
  82.                 return iRet;
  83.         }
  84. }

普及:

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

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

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

举个例子:

左边的三个人同时对另一人喊不同的一个字,右边的一个人就会分不清,左边三个人喊了什么?(可以做真人实例)
 
总结:
从分析中,我们看到普通的连接方式中无法处理并发问题!如果你想知道解决方法那么请继续看下去。
 
单例连接:
下面一段单利模式中的数据库连接代码
  1. package dao;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.SQLException;
  6.  
  7. public class BaseDao {
  8.         private String className = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
  9.         private String url = "jdbc:sqlserver://localhost:1433;databasename=SQLTMP";
  10.         private String user = "sa";
  11.         private String pwd = "sa";
  12.         private static Connection conn = null;
  13.          
  14.         private BaseDao(){
  15.                 try {
  16.                         Class.forName(className);
  17.                         conn = DriverManager.getConnection(url,user,pwd);
  18.                 } catch (ClassNotFoundException e) {
  19.                         e.printStackTrace();
  20.                 } catch (SQLException e) {
  21.                         e.printStackTrace();
  22.                 }
  23.                  
  24.         }
  25.          
  26.         public static Connection getConn(){
  27.                 if(conn != null){
  28.                         return conn;
  29.                 }else{
  30.                         new BaseDao();
  31.                         return conn;
  32.                 }
  33.         }
  34. }
 
普及:
构造方法:访问修饰符(public|private) 类名
构造方法在实例化的时候就会调用
 
我们分析一下这一段代码中Connection在构造方法中创建用过getConn方法获取连接。
 
 
我们从图片中和代码中可以看到全程中只有一个Connection连接,那么这样就可以降低服务器的压力,解决并发问题
 
总结:
 
从分析中,我们看到单例模式,可以减轻服务器的压力,解决并发问题,如果够仔细的话大家会发现getConn方法是一个静态方法,而且其他属性和方法都是private从而大大提高了安全性。这种连接方式适合:个人开发和国家单位开发(安全性高)
 
连接池:
下面一段连接池数据库连接代码
  1. context.xml
  2.         <Resource 
  3.                 name="news"
  4.                 auth="Container"
  5.                 type="javax.sql.DataSource"
  6.                 maxActive="100"
  7.                 maxIdle="30"
  8.                 maxWait="1000"
  9.                 username="sa"
  10.                 password="sa"
  11.                 driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
  12.                 url="jdbc:sqlserver://localhost:1433;DatabaseName=NewsManagerSystem"
  13.                 />
  14. Web.xml
  15. <resource-ref>
  16.     <description>news DataSource</description>
  17.     <res-ref-name>news</res-ref-name>
  18.     <res-type>javax.sql.DataSource</res-type>
  19.     <res-auth>Container</res-auth>
  20.   </resource-ref>  
  21.  
  22. package com.news.dao;
  23. import java.sql.*;
  24.  
  25. import javax.naming.*;
  26. import javax.sql.DataSource;
  27.  
  28. public class BaseDao {
  29.         /**
  30.          * 创建连接池
  31.          * */
  32.         public Connection getConn(){
  33.                 Connection conn = null;
  34.                 try {
  35.                         Context ctx = new InitialContext();
  36.                         DataSource ds = (DataSource)ctx.lookup("java:comp/env/news");
  37.                         conn = ds.getConnection();
  38.                 } catch (NamingException e) {
  39.                         e.printStackTrace();
  40.                 } catch (SQLException e) {
  41.                         e.printStackTrace();
  42.                 }
  43.                 return conn;
  44.         }
  45. }

普及:

连接池:连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要他们的线程使用。
 
我们可以直接使用getConn方法获得Connection并且执行数据操作,执行完成之后连接池会回收Connection这样就解决了普通模式中的并发问题.
 
总结:
从分析中,我们看到Connection不需要创建,这样就简化编程模式,这样减少了连接的创建时间,连接池能够使性能最大化,同事还能将资源利用控制在一定的水平之下,如果超过该水平,应用程序将崩溃而不仅仅是变慢。
 
写在最后
清楚的了解B/S架构中的数据库连接方式,在合适的情况下使用合适的连接方式感觉还是棒棒哒 ~ ~!
 

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

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

欢迎热心园友补充!

作者:0nise

 

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

  1. SQL server 数据库连接方式分析

    SQL server 数据库连接方式图示: ODBC和OLEDB连接的区别 ODBC(开放数据库互连):是Microsoft引进的一种早期数据库接口技术.它实际上是ADO的前身.早期的数据库连接是非常 ...

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

    一.简单控件 1.Label(作用:显示文字) Web中: <asp:Label ID="Label1" runat="server" Text=&quo ...

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

    1.通过ado.net连接(数据库连接串中库名称为中文无法使用) 需要添加MySql.Data.dll(可通过安装mysql-connector-net-6.8.3.mis获得) 引用MySql.Da ...

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

    包括JDBC.JPA.MyBatis.多数据源和事务. 一.JDBC 连接数据库 1.属性配置文件(application.properties) spring.datasource.url=jdbc ...

  5. 浅析 jQuery 内部架构设计

    jQuery 对于大家而言并不陌生,因此关于它是什么以及它的作用,在这里我就不多言了,而本篇文章的目的是想通过对源码简单的分析来讨论 jQuery 的内部架构设计,以及 jQuery 是如何利用Jav ...

  6. beego中各类数据库连接方式

    beego 框架是优秀得go REST API开发框架.下面针对beego中各类数据库连接操作做一个总结. 1. orm连接方式 beego中的orm操作支持三种数据库:mysql,sqlite3,p ...

  7. sql server 数据库连接方式分析、详解

    本文链接:https://blog.csdn.net/wang379275614/article/details/7859398 一.OLEDB方式连接Sql身份验证模式:Provider=" ...

  8. Access数据库连接方式

    网络连接:Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\server\share\folder\myAccessFile.accdb;标准安全:Pro ...

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

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

随机推荐

  1. [原创]自定义参数静默方式安装JDK1.8

    摘要:当Java桌面程序开发完成做产品的时候,面对未知的安装环境,通常是编写一些预安装检测脚本/程序,让程序傻瓜化安装以便减少分发出去的产品带来 的未知工作量(安装答疑,操作系统问题引起安装失败等), ...

  2. python3 经典排序方法

    1.插入排序: def nsert_sort(list): for i in range(len(list)): for j in range(i): if list[i] < list[j]: ...

  3. java程序员经常使用的Intellij Idea插件

    大概从去年年初开始慢慢抛弃习惯多年的eclipse,开始使用Intellij Idea,以下是我使用过的一些Intellij Idea插件: 1.lombok https://plugins.jetb ...

  4. touch.js 手机端的操作手势

    使用原生的touchstart总是单击.长按有冒泡冲突事件,发现百度在几年开源的touch.js库,放在现在来解决手机端的操作手势,仍然很好用.

  5. POS VB

    PPSM06S70:  Add  moddate EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, 'yyyy/mm/dd/HH24:MI AM')) ACTUAL_ ...

  6. JQUERY-事件-动画-类数组对象-添加自定义API

    正课: 1. 事件: 2. 动画: 3. 类数组对象操作: 4. 添加自定义API: 1. 事件: 1. 页面加载后执行: 2个时机 1. DOM内容加载完成: 仅包括html, js DOMCont ...

  7. k8s初始化搭建方法

    http://www.cnblogs.com/cocowool/p/kubeadm_install_kubernetes.html https://www.kubernetes.org.cn/doc- ...

  8. ubuntu18.04修改ssh登录欢迎信息

    1.编辑文件 ll /etc/update-motd.d/* 2.修改文件 3.查询效果 run-parts /etc/update-motd.d

  9. (PMP)第1章-----引论

    1.指南概述和目的: 2.基本要素: 项目:创造独特的产品,服务或成果而进行的临时性工作.特点:1.临时性   临时性并不一定意味着项目时间短.2.独特性   3.渐进明细性 项目管理:就是将知识,技 ...

  10. python pandas.DataFrame.append

    1.使用append首先要注意的是,你要合并两个DataFrame的columns即列名是否是相同的,不相同的就会报错. 2.我们会发现DataFrame的列名是不能够重复的,而行名(index)是可 ...