mysql多线程使用一个链接_探索多线程使用同一个数据库connection的后果

在项目中看到有用到数据库的连接池,心里就思考着为什么需要数据库连接池,只用一个连接会造成什么影响?(只用一个connection)?

1  猜想:jdbc的事务是基于connection的,如果多线程共用一个connection,会造成多线程之间的事务相互干扰。(connection.setAutoCommit(false);//connection.commit())

2  于是就模仿以下场景来做一个测试:

在多用户请求的情况下,只用一个数据库connection。

1)获取connection工具类:

package jdbcPool.util;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

public class ConnectorUtil {

public static final String user="root";

public static final String pwd="123456";

public static final String driver="com.mysql.jdbc.Driver";

public static final String url ="jdbc:mysql://localhost:3306/test";

private static Connection conn;

private static int connectCount=0;

static {

try {

Class.forName(driver);

} catch (ClassNotFoundException e) {

System.out.println("找不到数据库驱动..");

e.printStackTrace();

}

}

/**

* 获取数据库连接实例

* @return

*/

public synchronized static Connection getInstance(){

if(conn==null){

try {

conn=DriverManager.getConnection(url,user, pwd);

conn.setAutoCommit(false);//设置为不自动提交。。。

connectCount++;

System.out.println("连接数据库次数:"+connectCount);

} catch (SQLException e) {

System.out.println("连接数据库失败....");

e.printStackTrace();

}

}

return conn;

}

}

2) 业务接口实现类:

package jdbcPool.business;

import java.sql.Connection;

import java.sql.SQLException;

import java.sql.Statement;

import jdbcPool.util.ConnectorUtil;

public class StudentService {

private Connection conn;

private static StudentService studentService;

private StudentService(){

conn=ConnectorUtil.getInstance();

}

public static synchronized  StudentService getInstance(){

if(studentService==null){

studentService=new StudentService();

}

return studentService;

}

public void insert(String id,String name,String no) throws Exception {

String addStr ="insert into student(id,name,no) values('"+id+"','"+name+"','"+no+"')";

Statement statement=null;

try {

statement = conn.createStatement();

statement.execute(addStr);

if("1350".equals(id)){//模仿某个线程执行service某个方法中某个步骤出现异常

Thread.sleep(3000);//模仿当前线程执行时间较长。。。。。

System.out.println("发生异常。。。。。");

System.out.println("记录"+id+"插入失败。。。。");

conn.rollback();  //出现异常事务回滚。。。

throw new Exception();

}else{

conn.commit();

System.out.println("记录"+id+"插入成功。。。。");

}

} catch (SQLException e) {

System.out.println("创建statement失败");

e.printStackTrace();

}finally{

if(statement!=null){

try {

statement.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

}

}

3)模拟用户请求的线程类:

package jdbcPool.thread;

import jdbcPool.business.StudentService;

public class Request implements Runnable{

private String id;

public Request(String id) {

this.id=id;

}

@Override

public void run() {

//模仿service的单例模式

try {

StudentService.getInstance().insert(this.id, "name"+id, "no"+id);

} catch (Exception e) {

e.printStackTrace();

}

}

}

4) 测试类:

package jdbcPool.test;

import jdbcPool.thread.Request;

public class Main {

//两百个线程并发访问同一个connection

public static void main(String[] args){

for(int i=1300;i<1500;i++){

Thread th=new Thread(new Request(String.valueOf(i)));

th.start();

}

}

}

5)结果分析:

打印台出现的结果:

记录1489插入成功。。。。

记录1490插入成功。。。。

记录1491插入成功。。。。

记录1495插入成功。。。。

记录1492插入成功。。。。

记录1493插入成功。。。。

记录1494插入成功。。。。

记录1496插入成功。。。。

记录1497插入成功。。。。

记录1498插入成功。。。。

记录1499插入成功。。。。

记录1300插入成功。。。。

发生异常。。。。。

记录1350插入失败。。。。

java.lang.Exception

at jdbcPool.business.StudentService.insert(StudentService.java:38)

at jdbcPool.thread.Request.run(Request.java:18)

at java.lang.Thread.run(Unknown Source)

数据库中的表数据:

787f78290665a6f94125a58567cf423a.png

id为1350的记录竟然成功的添加进数据库了,造成这一现象的原因显然是

在添加id为1350的记录的线程遇到异常还没有来得及数据回滚时,

别的线程先调用了 connection.commit()方法,以至于把不该提交的数据提交到数据库了。

6)  总结:在多线程的环境中,在不对connection做线程安全处理的情况下,使用单个connection会引起事务的混乱....影响jdbc事务的使用。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533644.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vs中四点画矩形的算法_中考热点,初高中衔接之倒角利器四点共圆

初中数学课程标准修改后&#xff0c;教材中四点共圆知识已经删除掉了&#xff0c;但这样一件强悍且使用简单的武器&#xff0c;我们还是有必要去了解的&#xff0c;近年来对于压轴题以几何为核心的考区来说&#xff0c;有时用到解题更为简洁方便&#xff0c;由此应该理解掌握。…

phpnow mysql字符集_使用PHPnow搭建本地PHP环境+创建MySQL数据库

要想学习WordPress建站&#xff0c;在本地搭建PHP环境是十分必要的&#xff0c;在以后的建站日子里&#xff0c;你可以使用这个环境来进行wordpress的程序学习、调试等工作&#xff0c;等你熟悉了wordpress以后&#xff0c;再购买域名和空间&#xff0c;真正开始你的建站之旅。…

wps如何保存最终状态_如何使得打开word文件显示最终的修改状态

展开全部 在日常工作中,经常为了保护文档而将其设置成最e68a84e8a2ad3231313335323631343130323136353331333363376366终状态,设置文档为最终状态,则是表示已完成这篇文档的编辑,这是文档的最终版本。如果文档被标记为最终状态,则状态属性将设置为“最终状态”,并且将禁用…

python整数反转_敲代码学Python:力扣简单算法之整数反转

学习重点&#xff1a;整数逆序算法力扣&#xff08;LeetCode&#xff09;原题​leetcode-cn.com 功能&#xff1a;整数反转 来源&#xff1a;https://leetcode-cn.com/explore/featured/card/top-interview-questions-easy/5/strings/33/ 重点&#xff1a;整数逆序算法 作者&am…

前端累加nan怎么解决_前端面试,你有必要知道的一些JavaScript 面试题(上)

1.使用 typeof bar “object” 判断 bar 是不是一个对象有神马潜在的弊端&#xff1f;如何避免这种弊端&#xff1f;使用 typeof 的弊端是显而易见的(这种弊端同使用 instanceof)&#xff1a;let obj {};let arr [];console.log(typeof obj object); //trueconsole.log(typ…

tidb 配置mysql数据源_安装tidb数据库

1.下载压缩包安装tar包路径命令&#xff1a;wget http://download.pingcap.org/tidb-latest-linux-amd64.tar.gz命令&#xff1a;wget http://download.pingcap.org/tidb-latest-linux-amd64.sha2562.检查文件完整性命令&#xff1a;sha256sum -c tidb-latest-linux-amd64.sha2…

linuxos或sv独立客户端不支持应用程序打开方式_搞不明白为什么大家都在学习 k8s

作者 | 小明菜市场来源 | 小明菜市场(ID&#xff1a;fileGeek)头图 | CSDN 下载自东方IC前言都2020年了&#xff0c;你还不知道kubernetes就真的真的真的out啦。(贩卖焦虑体) 什么是k8s&#xff0c;k8s这个词来自于希腊语&#xff0c;有主管&#xff0c;舵手&#xff0c;船长的…

react 图片放在src里面还是public_手写Webpack从0编译Vue/React项目

当前前端开发&#xff0c;90%的项目都是Vue和React&#xff0c;然而70%的同学都基于脚手架创建项目&#xff0c;因为脚手架会包含项目基本框架、webpack配置、scss/sass/less解析、babel配置、DevServer、JSX/Vue文件解析、CSS前缀等&#xff0c;我们要做的就是开发功能模块&am…

python 在线预览文件_用Python PyQt写一个在线预览图片的GUI

在爬完网上一篇帖子&#xff0c;并得到其中的所有图片链接后&#xff0c;写一个GUI来实现在线预览是一个很自然的想法&#xff0c; 相当于实现一个python版的图片浏览器&#xff0c; 通过这个练习&#xff0c;可以让我们更熟悉PyQt这个库。这里我用的是PyQt4。以下是我的写的程…

google 确定某点海拔高_一份“高投资回报率”的用户体验度量方法指南

本文核心就是介绍体验度量方法&#xff0c;以及如何在商业项目中如何发起一个具有高ROI(投资回报率)的用户体验量化流程。 下面文章将分为解读高投资回报和拆解体验度量、实际案例讲解三部分。一、解读高投资回报率高ROI(投资回报率)来定义体验度量流程的原因&#xff1f;3-5年…

md5 java代码_JAVA简单实现MD5注册登录加密实例代码

开发环境&#xff1a;jdk1.7&#xff0c;eclipse框架&#xff1a;springmvc&#xff0c;mybatis工具&#xff1a;maven以下代码复制即可实现MD5加密创建一个mave项目&#xff0c;加web。不懂得可以搜索一下就有了。注册用户的JSP页面代码如下。pageEncoding"utf-8"%&…

一维卷积神经网络_序列特征的处理方法之二:基于卷积神经网络方法

前言上一篇文章介绍了基本的基于注意力机制方法对序列特征的处理&#xff0c;这篇主要介绍一下基本的基于卷积神经网络方法对序列特征的处理&#xff0c;也就是TextCNN方法。序列特征的介绍&#xff0c;背景以及应用可以参考上一篇的详细介绍&#xff0c;这里简单回顾一下定义&…

macos降级_iOS12.3 beta2更新了什么 iOS12.3测试版2新特性与升降级方法

4月0日凌晨&#xff0c;苹果发布了iOS12.3 beta2&#xff0c;作为iOS12.3第二个测试版&#xff0c;相比前一个版本&#xff0c;发布时间间隔近2周&#xff0c;这次依然是小版本更新&#xff0c;不过相对良心一些&#xff0c;主要是多了一些与国内用户相关的东西。iOS12.3 beta …

linux配置usb主从_杂集:浅谈关于Mongodb数据库主从复制

Linux下Mongodb数据库主从复制配置Mongodb的三种集群搭建的方式&#xff1a;Master-Slaver&#xff1a;主从[目前被副本集取代]。Replica Set&#xff1a;副本集。Sharding&#xff1a;切片。Mongodb单实例缺点&#xff1a;适合简易开发时使用&#xff0c;生产使用不行&#xf…

java sax xml文件解析_java解析xml文件-DOM/SAX

java解析xml文件的两种方式1&#xff1a;DOM原理&#xff1a;把整个文档加载到内存&#xff0c;转化成dom树&#xff0c;之后应用程序可以随机的访问dom树的任何数据&#xff0c;灵活 快&#xff0c;但消耗内存一个简单的xml使用java解析//builder工厂DocumentBuilderFactory f…

python 远程控制_用 Python 远程控制你的电脑

用 Python 远程控制你的电脑一、前言很多时候我们有这种需求&#xff0c;因为程序运行比较耗时&#xff0c;但是我们没有足够的时间等待。这个时候我们就可以用 Python 做一个远程控制电脑的小工具&#xff0c;实现远程控制电脑。当然&#xff0c;我们能做的操作十分有限&#…

摄像头图像分析目标物体大小位置_一文读懂图像定位及跟踪技术

文 | 传感器技术在科学技术日新月异的今天&#xff0c;人们对机器设备的智能性、自主性要求也越来越高&#xff0c;希望其完全替代人的角色&#xff0c;把人们从繁重、危险的工作任务中解脱出来&#xff0c;而能否像人一样具有感知周围环境的能力已成为设备实现智能化自主化的关…

pat乙级相当于什么水平_雅思6.5是什么水平?相当于托福多少分?

雅思和托福是当前社会中非母语人士的主流英语水平测试。准备出国留学的学生对这两项考试并不陌生。对于一些学生来说&#xff0c;仅靠雅思成绩并不足以申请他们最喜欢的学校。特别是对于申请北美院校的学生&#xff0c;托福成绩是申请时提交语言成绩的优先考虑事项。那么&#…

java时间方法_JAVA处理日期时间常用方法

转载JAVA处理日期时间常用方法&#xff1a;1.java.util.CalendarCalendar 类是一个抽象类&#xff0c;它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法&#xff0c;并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可…

双飞翼布局内容不换行_web前端入门到实战:圣杯布局和双飞翼布局

稍微了解前端的人都知道&#xff0c;圣杯布局和双飞翼布局是前端面试时必问的问题&#xff0c;因为它既能体现你懂HTML结构又能体现出你对&#xff24;IVCSS布局的掌握&#xff0c;毕竟我们学习CSS主要就是为了更好地布局带来最好的用户体验嘛~事实上&#xff0c;圣杯布局其实和…