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

浅析B/S架构数据库连接方式相关推荐

  1. ADO.net 中数据库连接方式

    ADO.net 中数据库连接方式 在MSDN中,.net的数据库连接字符串都有详细的说明,我这里以代码范例的方式罗列一些,具体的每一项代表的意义可以参看MSDN. ADO.net 中数据库连接方式(微 ...

  2. .net 启动mysql数据库连接_[ASP.net教程]mysql数据库连接方式(.net)

    [ASP.net教程]mysql数据库连接方式(.net) 0 2014-07-17 18:01:00 1.通过ado.net连接(数据库连接串中为中文貌似无法使用) 需要添加MySql.Data.d ...

  3. ASP数据库连接方式大全

    ASP数据库连接方式大全http://www.jiejingwang.com  2003-3-10  捷径网 <% '#######以下是一个类文件,下面的注解是调用类的方法########## ...

  4. ASP.Net 中常用的数据库连接方式

    ASP.Net 中常用的数据库连接方式 在ASP.Net中,连接数据库有以下四种方式: 1.System.Data.OleDb.OleDbConnection 2.System.Data.SqlCl ...

  5. 一个更好的可视化微服务架构的方式

    本文讲的是一个更好的可视化微服务架构的方式[编者的话]如何快速地可视化一个微服务架构,本文作者有一个很酷的办法,赶紧来看看吧! [3 天烧脑式容器存储网络训练营 | 深圳站]本次培训以容器存储和网络为 ...

  6. Kettle之数据库连接方式

    Kettle软件主要提供了4种数据库连接方式,分别是JDBC.ODBC.OCI.JNDI,其中 OCI 只适用于Oracle.本文重点对使用比较普遍的 JDBC 和 JNDI 连接方式进行探讨,后面会 ...

  7. 浅析 RISC-V 生态架构

    RISC-V 生态架构浅析 前言 RISC-V最近越来越多的出现在科技新闻中,大量的公司加入到RISC-V研究和生产中.在越来越多的RISC-V研究热下,毋容置疑的是RISC-V的时代即将到来.让我们 ...

  8. 数据中台浅析——概念、架构以及未来

    数据中台浅析 1. 引言 在当今的数字化时代,数据被誉为"新的石油",越来越多的企业和组织开始深度挖掘数据的价值.在这个过程中,数据中台逐渐成为了数据管理和分析的核心架构,让我们来 ...

  9. [JDBC] 获取数据库连接方式

    方式一:将数据库连接需要的4个基本信息声明在配置文件中,通过读取配置文件的方式,获取连接 此种方式的好处? 1.实现了数据与代码的分离.实现了解耦 2.如果需要修改配置文件信息,可以避免程序重新打包. ...

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

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

最新文章

  1. python随机产生10个不同的两位数_python解决两位数加减法快速出题问题
  2. runtime运行时编程一些相关知识
  3. lambda表达式_在Java 7或更早版本中使用Java 8 Lambda表达式
  4. 跟我一起学docker(五)--仓库
  5. java linkedlist 用法_Java LinkedList addLast()用法及代码示例
  6. I begin to keep a daily
  7. 算法提高 合并石子【动态规划】
  8. 透析 | 卷积神经网络CNN究竟是怎样一步一步工作的?
  9. Python机器学习:KNN算法04f分类准确度
  10. Linux中设置tab4个空格,linux下vim中tab设置为4个空格例子
  11. MEF董事、中国电信云计算中心主任赵慧玲:MEF第三类网络
  12. Python 基础 —— 文件
  13. 安装JDK和tomcat
  14. 邵阳市计算机学校2021,邵阳市计算机中等专业学校在2021年邵阳市中等职业学校班主任基本功比赛中荣获市一等奖...
  15. Thinkphp twig
  16. 渠道下沉 阿里争食社区经济最后一公里
  17. smith圆图重要性_(完整版)smith史密斯圆图(个人总结),推荐文档
  18. java: 找不到符号
  19. java中美元符号的作用_$美元符号在配置文件中的意义
  20. 月影无终的伤感日志最新推荐:搁浅的回忆,谁来承受

热门文章

  1. 19【推荐系统17】MMoE: 多任务学习
  2. numpy教程:随机数模块numpy.random
  3. lstm 做多分类loss完全不下降_使用Induction Network做Few-Shot Text分类
  4. python内置函数分类_注意 Python 内置函数并不是万能的!
  5. python虚拟环境搭建learning_log_vscode Python 虚拟环境搭建
  6. vrrp 的mac是怎么算出来的_宇宙总质量约10^55kg,与大家掰一掰是怎么算出来的
  7. Java 重载、重写(Override、Overload)
  8. Dart基础第1篇:Dart环境搭建、Dart开发工具
  9. 7-2 温度转换 (5 分)
  10. 7-9 一元多项式的乘法与加法运算 (20 分)