JDBC中对事务的支持

【前端HTML生成条形码——MQ】 本文将展示前端HTML如何根据用户输入内容生成对应的条形码,附HTML和JS代码。代码如下(示例): 阅读详情

事务的管理原则

  • 原子性:
  • 一致性:
  • 隔离性:


JDBC中对事物的支持

JDBC默认是每执行一条 sql 语句都会提交事务。

这对于批处理数据来说性能开销过大。而且不满足事务本该管理的原则-上述三点


1:阻止事务自动提交

     conn.setAutoCommit(false); // 不自动提交

2: conn.commit(); // 提交事务

3:conn.rollback();//回滚 



批处理 sql

Statement的一个方法addBatch(String sql)方法。

该方法了几将给定的sql存入Statement的命令列表中缓存。

当执行executeBatch() 方法时,Statement会将命令列表中缓存的所有sql语句一次性提交给数据库。这可以有效的减少网络通信带来的性能消耗。

clearBath()用于清空命令表中缓存的所有sql语句。


preparedStatement 也支持批处理。原理相同

addBatch()不带参数  。想命令列表中添加一条sql语句



封装事务

 Java提供了一个类ThreadLocal

该类的作用是, 在同一个线程中的不同模块间共享数据。

数据共享是根据线程区分的。不同线程间不共享数据。


 举例:刷卡消费

每个人就是一个线程,他们在不同商店消费时,数据会互相影响

但是不同人之间的数据不会产生影响  就是不同线之间的数据不会共享

package day02.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.*;

/**
 * DAO父类
 * 
 * 基础类
 * 提供所有的DAO 都需要兼备的特性
 * 
 * @author ssd
 *
 */
public class BaseDAO {
	/**
	 * java.util.Properties类
	 * 用于读取properties文本文件类
	 * properties文件是一个纯文本的文件,里面的内容的定义有格式的要求
	 *        必须是key=value的形式,且以行为单位一行只记录一条数据
	 *properties类可以方便的读取properties文件,并将内容
	 *以类似HashMap的形式进行读取。注意!读取的都是字符串
	 *
	 *properties通常都是当做配置文件进行使用的。
	 */
	//共享同一个线程中数据的threadLocal
	/**
	 * ThreadLocal 是在同一个线程中不同模块中共享数据使用过的
	 * ThreadLocal内部很简单
	 * 就是维护者一个HashMap
	 * 其中一个Key存放的是每一个线程
	 * value就是存放在不同模块之间要共享的数据
	 * 每个ThreadLocal实例,只能保存一个共享数据
	 * 不同的线程看到的是应该是同一个ThreadLocal实例,但是获取的
	 * 是不同的数据,因为在线程间不共享。每个线程在不同模块中共享数据
	 * 
	 * 如果要想保存两个数据我们可以再建立一个ThreadLocal实例
	 * 
	 */
	private static ThreadLocal<Connection> localConn = new ThreadLocal<Connection>();
	private static Properties properties = new Properties();
	private static String driver = "oracle.jdbc.driver.OracleDriver";
	private static String url = "jdbc:oracle:thin:@localhost:1521:orcl";
	private static String user = "scott";
	private static String pwd = "Shen2014";
	/**
	 * 在静态初始化中注册驱动
	 * 驱动不需要重复注册,所以静态初始化最适合注册驱动
	 * @return
	 */
	static {
		try{
			/**
			 * 加载配置文件,读取配置信息
			 */
			
			properties.load(BaseDAO.class.getClassLoader().getResourceAsStream("" +
			"day02/dao/db.properties" ));
			properties.load(BaseDAO.class.getClassLoader().getResourceAsStream("" +
					"day02/dao/db.properties" ));
			
			System.out.println(properties.getProperty("jdbc.driver"));
			/**
			 * 通过Properties的方法getProperty(String key)
			 * 方法可以将properties文件中
			 * jdbc.driver=oracle.jdbc.driver.OracleDriver
			 * 数据获取。获得的方法就是将jdbc.driver作为参数调用方法
			 * 返回的就是等号右边的oracle.jdbc.driver.OracleDriver
			 */
			driver = properties.getProperty("jdbc.driver");
			url = properties.getProperty("jdbc.url");
			pwd = properties.getProperty("jdbc.pwd");
			user = properties.getProperty("jdbc.user");
			
//			加载驱动
			Class.forName(driver);
			/**
			 * oracle.jdbc.driver.OracleDriver类
			 * 在Class.froName()的时候被载入JVM
			 * OracleDriver 是JDBC中的Driver 的子类
			 * 他被要求在静态初始化的时候要将自身驱动的信息
			 * 通过DriverManager 的静态方法注册进去,这样DriverManager就
			 * 知道应该如何通过OracleDriver去连接数据库了。
			 * 所以之后就可以公国DriverManager 的另一个静态方法:
			 *   getConnection()来根据之前的注册的驱动信息来获取连接了。
			 */
			
		}catch (Exception e){
			e.printStackTrace();
			//若注册失败,我们要通知调用者
			throw new RuntimeException(e);
			
			
		}
	}
	/**
	 *提交事务
	 */
	protected void commit(){
		/**
		 * 先去线程共享中看看当前调用搞该方法的线程是否共享过
		 * Connection,若有,就提交事务
		 */
		Connection conn = localConn.get();
		if(conn != null){
			try{
				conn.commit();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	}
	/**
	 * 事务回滚
	 */
	protected void rollback(){
		Connection conn = localConn.get();
		if(conn !=null){
			try{
				conn.rollback();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	}
	/**
	 * 获取数据库连接对象Connection
	 * @return
	 * @throws SQLException  当连接失败时抛出异常
	 */
	protected static Connection getConnection() throws SQLException{
		/**
		 * 当一个线程调用该方法要获取连接的时候,我们要先检查之前这个线程是否已经获取过一个连接了,若有,就不再
		 * 创建了
		 */
		Connection conn = localConn.get();
		//若为空,说明这个线程第一次获取连接。
		if(conn == null){
			//穿件数据库的连接
			conn = DriverManager.getConnection(url,user,pwd);
			//将创建出来的连接放到线程共享中
			localConn.set(conn);
		}
		return conn;
		
	}
	protected static void closeConnection (Connection conn){
		if(conn != null){
			try{
				conn.close();
				
			}catch(SQLException e){
				e.printStackTrace();
			}
		}
	}
}


package day02.entities;

import java.io.Serializable;

/**
 * UserInfo实体类
 * 对应数据库中的UserInfo表
 * @author ssd
 *
 */

public class UserInfo implements Serializable {
	private static final long serialVersionUID = 1L;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	private String id;
	private String name;
	private String password;
	private int age;
	private String sex;
	private String email;
	

}


package day02.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;


import day02.entities.UserInfo;

/**
 * 针对用户进行操作的DAO
 * @author ssd
 *
 */

public class UserInfoDAO extends BaseDAO {
	/**
	 * SQL 语句常量定义
	 * @param userInfo
	 * @return
	 */
	private static final String INSERT = "INSERT INTO userinfo(" +
			"id,name,password,age,sex,email" +
			") VALUES(" +
			"sys_guid(),?,?,?,?,?" +
			")";
	public boolean save(UserInfo userInfo){
		return false;
		
	}
	
	public boolean save(List<UserInfo> userInfos){
		Connection conn = null;
		try {
			conn = getConnection();
			conn.setAutoCommit(false);
			PreparedStatement state = conn.prepareStatement(INSERT);
			long start = System.currentTimeMillis();
			for(UserInfo userInfo:userInfos){
				state.setString(1, userInfo.getName());
				state.setString(2,userInfo.getPassword());
				state.setInt(3, userInfo.getAge());
				state.setString(4,userInfo.getSex());
				state.setString(5,userInfo.getEmail());
				state.addBatch();
			}
			state.executeBatch();//批处理执行之前缓存的所有的sql
			conn.commit();//手动提交
			long end = System.currentTimeMillis();
			System.out.println("操作完成,耗时:" +(end - start) +
					"毫秒");
			return true ;//正常结束 返回一个true		
		}catch (Exception e){
			e.printStackTrace();
			//这个是在执行中间捕获的异常,就是在执行中间出现错误的时候我们要回滚
			if(conn !=null){
				try{
				conn.rollback();
				}catch(SQLException e1){
					e1.printStackTrace();
				}
				
			}
		}finally{
			if(conn !=null){
				try{
					closeConnection(conn);
				   }catch(Exception e){
					e.printStackTrace();
				}
			}
			
		}
		return false;
		
	}
	
	//创建表
	public void createTable(){
		Connection conn = null;
		try{
			conn = getConnection();
			Statement state = conn.createStatement();
			String sql = "CREATE TABLE userinfo(" +
					"id varchar2(36) PRIMARY KEY," +
					"name varchar2(30)," +
					"password varchar2(50)," +
					"age NUMBER (2)," +
					"sex varchar2(2)," +
					"email varchar2(50)" +
					")";
			if(!state.execute(sql)){
				System.out.println("创建完毕");
			}
			
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(conn !=null){
			closeConnection(conn);
			}
			
		}
	}
	public static void main(String[] args){
		UserInfoDAO dao = new UserInfoDAO();
		dao.createTable();
	}

}





如何使用freesurfer对T1w结构像进行分区指标的提取?——皮层面积,灰质体积,平均厚度,厚度标准差,平均曲率、高斯曲率、曲率指数、折叠指数 阅读详情

相关推荐

Windows下的Geant4安装教程

本教程将从0开始展示在Windows下如何安装Geant4,包括各种辅助工具(QT、Cmake、Visual Studio)的下载安装,环境变量的配置,以及example的生成等。

weixin_49065278的博客 4104

JDBC事务和数据

JDBC相关: 1、创建一个工具类,完成加载驱动,建立连接和释放资源;2、日期格式的处理;3、元数据的获取;4、事务的操作;5、批处理

forrest_ou的博客 347

ComfyUI的G-Dino模型加载器报错解决方案:从崩溃到重生

遇到G-Dino模型加载器报错不要慌,按照本文的步骤操作,99%的问题都能解决。模型文件正确下载到指定位置segment_anything节点安装完整且无冲突需要补充更多细节或故障排除方法吗?可以随时告诉我。

2301_78150483的博客 4022

JDBC操作事务

1.点击侧边栏‘Database’中的‘+’号如果没有此侧边栏的话,可以点击左下角类窗口图标,查看是否进行了折叠2.在‘Data Source’中选择需要的数据库类型,这里以MySQL为例3.输入用户名密码,可测试是否连接成功4.选择连接至哪个库直接勾选需连接的对象即可5.选中一个表双击便可显示其内容6.调出console执行SQL语句。......

qq_61727355的博客 2238

Verilog数字钟

使用Verilog语言进行的数字钟的编写,FPGA开发板亲测正常 大学生一个,第一次自己做的东西,写出来分享在这里插入代码片一下,有不对的地方请大家批评指正。 这次的做的题是:设计一个数字钟,该数字钟能进行正常的时,分计时功能,且能对数字钟的时间进行调整。 该数字钟有3个按键,按键1为功能键,用于数字钟在“正常计时”,“时调整”,“分调整”这三个功能之间切换;按键2,3用于调整时间,仅当数字钟处于...

bin_bin_bun的博客 6149

计算机组成原理(二)—— 数据的表示与运算

本章目录引言一、数制与编码1.1 进位计数制1.1.1 进制及转换1.1.2 真值、机器数1.2 BCD码1.3 ASCII 码1.4 校验码1.4.1 奇偶校验码1.4.2 海明码1.4.3 CRC循环冗余码二、定点数的表示和运算2.1 定点数的表示2.1.1 无符号2.1.2 有符号(原码、反码、补码、移码)2.2 定点数的运算2.2.1 移位运算2.2.2 加减运算(溢出判断)2.2.3 乘法运算2.2.4 除法运算2.3 强制类型转换2.4 数据的存储和排列三、浮点数的表示和运算3.1 浮点数的表示

S mile0804的博客 7473

JDBC:JDBC的事务支持

与事务相关的理论 1.事务(Transaction)的四个属性(ACID) 原子性(Atomic) 对数据的修改要么全部执行,要么全部不执行。 一致性(Consistent) 在事务执行前后,数据状态保持一致性。 隔离性(Isolated) 一个事务的处理不能影响另一个事务的处理。 持续性(Durable) 事务处理结束,其效果在数据库中持久化。 2.事务并发处理可能引起的问题

samjustin的博客 478

汇川机器人与PLC通信-ModbusTCP超详细案例

通过汇川机器人与PLC的ModbusTCP通信项目案例,我们可以了解通讯配置的过程,地址映射的方式,对接信号的转换,运行时序的逻辑等注意事项,帮助我们快速应用到项目中。

weixin_44166380的博客 1万+

02-JDBC事务支持

1. 数据库事务 1.1 是什么 什么是事务,可以阅读我写的有关数据库 事务 这篇文章。从事务的四大特性来说,事务机制是为了保证数据的一致性,事务是最小的执行单元,要么全部成功要么全部不成功。 1.2 为什么 众所周知,SQL语言是一种操作数据库的非过程化语言,无疑它的功能是很强大的。比如一个小小的select语法结构就可以查询到我们想要的任何数据,多么简洁方便。 然而业务是复杂的,一条SQL并不能满足我们的需求,往往一个业务的执行需要多条SQL语句的配合使用来完成。一个写操作会改变数据库的数据,多个写操

天天向上 2099

ESP32-S3双屏AI吊坠:微型边缘智能终端设计实践

边缘智能终端是指在设备端完成数据感知、处理与响应的嵌入式系统,其核心在于低延迟、高隐私与弱网适应性。基于ESP32-S3等轻量级主控,通过语音唤醒、本地AI推理与双屏异步渲染等关键技术,可构建资源受限场景下的实用化人机交互节点。这类设计显著降低对云端依赖,提升实时性与数据安全性,广泛应用于智能穿戴、IoT交互面板及便携式语音设备。本文以‘璀璨·AI吊坠’为实例,深入解析双面圆形屏驱动、ES8311音频链路优化、VAD+Porcupine本地语音流水线,以及亚微安级低功耗状态机实现,为微型AI终端的软硬协同开

weixin_42348783的博客 632

selenium绕过检测,规避检测

现在不少大网站有对selenium采取了监测机制。比如正常情况下我们用浏览器访问淘宝等网站的 window.navigator.webdriver的值为 undefined或者为false。而使用selenium访问则该值为true。那么如何解决这个问题呢?我们正常浏览器登录查看,window.navigator.webdriver的值为false我们通过selenium打开的网页,测试,可见window.navigator.webdriver的值为true。

景天科技苑 1万+

Java技术回顾之JDBC:JDBC的事务支持

与事务相关的理论 1.事务(Transaction)的四个属性(ACID) 原子性(Atomic) 对数据的修改要么全部执行,要么全部不执行。 一致性(Consistent) 在事务执行前后,数据状态保持一致性。 隔离性(Isolated) 一个事务的处理不能影响另一个事务的处理。 持续性(Durable) 事务处理结束,其效果在数据库中持久化。 2.事务并发处理可能引起的问题

caomiao2006的专栏 475

后仿真中《SDF反标必懂连载篇》之 Negative Delay (理论篇)

今天,学习一下SDF文件中的负数延时问题。比如下面的图片中的SETUPHOLD 中的hold time 为负数。

那么菜的博客 2572

JDBC对事务的支持

转自:http://my.oschina.net/mushui/blog/161452 并不是所有的数据库都支持事务,即使支持事务的数据库也并非支持所有的事务隔离级别,用户可以通过Connection的getMetaData()方法获取DatabaseMetaData对象,并通过该对象的supportsTransactions()、supportsTransactionIsolationLe

jjavaboy的专栏 1475

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

JDBC的事务支持

1.事务(Transaction)的四个属性(ACID)原子性(Atomic) 对数据的修改要么全部执行,要么全部不执行。一致性(Consistent) 在事务执行前后,数据状态保持一致性。隔离性(Isolated) 一个事务的处理不能影响另一个事务的处理。持续性(Durable) 事务处理结束,其效果在数据库中持久化。2.事务并发处理可能引起的问题脏读(dirty read) 一个事务读取了另一...

weixin_30920513的博客 57

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

JDBC事务支持及try-with-resources

JDBC事务支持 JDBC连接的事务支持由Connection对象提供,且默认自动提交,即默认事务是关闭的状态。也就是说,SQL语句执行将会立即提交至数据库,永久生效。 JDBC中关于事务的操作: conn.setAutoCommit(false); //关闭自动提交,开启事务 /*下面俩需要在开启事务之后才能使用*/ conn.commit(); //提交事务 conn.rollback...

天乔巴夏丶 1013

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

mysql查看jta支持_JDBC事务和JTA (XA)事务区别

Java事务的类型有三种:JDBC事务、JTA(Java Transaction API)事务、容器事务。普通事务只支持一个数据库连接,不能跨越多个数据库。默认的情况为自动提交事务,也就是说,每一条对数据库的更新的sql语句代表一项事务,操作成功后,系统自动调用 commit() 来提交,否则将调用 rollback() 来撤消事务。而XA事务支持在两个或多个网络计算机资源上访问并且更新数据,这些...

weixin_39822629的博客 249

8.Spring对JDBC的支持和事务

1.Spring对JDBC的支持 DAO : Spring中对数据访问对象(DAO)的支持旨在简化Spring与数据访问技术的操作,使JDBC、Hibernate、JPA和JDO等采用统一的方式访问 Spring提供了@Repository注解,这一注解同样允许组件扫描来发现和配置自定义DAO而DAO的实现依赖于某个持久化源,比如一个基于JDBC的DAO需要一个数据源DataSource Jd...

WeiWeiWqq的博客 127

jdbc 对事务的支持

每个SQL语句都会自动开启一个事务并提交更好地控制事务的边界和粒度一个事务多个操作自动提交可能导致并发问题一个事务内执行多个SQL语句都没有出现错误时关闭事务组成一个逻辑操作要么全部成功,要么全部回滚一致性每一条 SQL 语句都被视为一个独立的事物完整性一致性多个操作在同一个事务中执行。

小丁的博客 337

14.分库分表(二)-Sharding-JDBC对分布式事务的支持

1.本地事务(弱事务): 功能 完全支持非跨库事务,例如:仅分表,或分库但是路由的结果在单库中。 完全支持因逻辑异常导致的跨库事务。例如:同一事务中,跨两个库更新。更新完毕后,抛出空指针,则两个库的内容都能回滚。 不支持因网络、硬件异常导致的跨库事务。例如:同一事务中,跨两个库更新,更新完毕后、未提交之前,第一个库宕机,则只有第二个库数据提交。 支持情况 Sh...

insider_way 4066

26、JDBC对事务的支持

学习目标: 1、巩固事务的知识 2、JDBC对事务的支持和语法使用 学习过程: 一、jdbc中使用事务 我们先回顾一下什么是事务,事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作,这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行。事务是一个不可分割的工作逻辑单元  那么在jdbc中如何可以实现是事务呢?我们平时使用jdbc时,并不需要显示的提交数据,因为...

JavaDayUp 292

sharding-jdbc 事务支持部分观后感

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34281477的博客 504
上一篇: java.sql.SQLException: 无效的列索引
下一篇: The type java.util.Map$Entry cannot be resolved.
cssdl
博客等级 码龄15年 5粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值