JDBC 事物处理

JDBC 事物处理

•事务:指构成单个逻辑工作单元的操作集合

•事务处理:保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),要么整个事务回滚(rollback)到最初状态

•当一个连接对象被创建时,默认情况下是自动提交事务:每次执行一个SQL 语句时,如果执行成功,就会向数据库自动提交,而不能回滚

•为了让多个SQL 语句作为一个事务执行:

​ –调用 Connection对象的 setAutoCommit(false);以取消自动提交事务

​ –在所有的 SQL 语句都成功执行后,调用commit();方法提交事务

​ –在出现异常时,调用rollback();方法回滚事务

​ –若此时 Connection没有被关闭, 则需要恢复其自动提交状态

数据库提供的4种事务隔离级别:

这里写图片描述

在MySql中设置隔离级别

•每启动一个 mysql程序,就会获得一个单独的数据库连接.每个数据库连接都有一个全局变量@@tx_isolation,表示当前的事务隔离级别.MySQL默认的隔离级别为RepeatableRead

•查看当前的隔离级别:SELECT @@tx_isolation;

•设置当前mySQL连接的隔离级别:

​ –set transaction isolation level readcommitted;

•设置数据库系统的全局的隔离级别:

​ -set global transaction isolation level read committed;

批量处理JDBC语句提高处理速度

•当需要成批插入或者更新记录时。可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率

•JDBC的批量处理语句包括下面两个方法:

​ –addBatch(String):添加需要批量处理的SQL语句或是参数;

​ –executeBatch();执行批量处理语句;

•通常我们会遇到两种批量执行SQL语句的情况:

​ –多条SQL语句的批量处理;一个SQL语句的批量传参;

这里写图片描述

JDBC数据库连接池的必要性

•在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤:  

​ –在主程序(如servlet、beans)中建立数据库连接。

​ –进行sql操作

​ –断开数据库连接。

•这种模式开发,存在的问题:

​ –普通的JDBC数据库连接使用DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection加载到内存中,再验证用户名和密码(得花费0.05s~1s的时间)。需要数据库连接的时候,就向数据库要求一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。数据库的连接资源并没有得到很好的重复利用.若同时有几百人甚至几千人在线,频繁的进行数据库连接操作将占用很多的系统资源,严重的甚至会造成服务器的崩溃。

​ –对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将导致重启数据库。

​ –这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃。

数据库连接池(connection pool)

•为解决传统开发中的数据库连接问题,可以采用数据库连接池技术。

•数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。

•数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。

•数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。

这里写图片描述

数据库连接池技术的优点

•资源重用:

–由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增加了系统运行环境的平稳性。

•更快的系统反应速度

–数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于连接池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而减少了系统的响应时间

•新的资源分配手段

–对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接池的配置,实现某一应用最大可用数据库连接数的限制,避免某一应用独占所有的数据库资源

•统一的连接管理,避免数据库连接泄露

–在较为完善的数据库连接池实现中,可根据预先的占用超时设定,强制回收被占用连接,从而避免了常规数据库连接操作中可能出现的资源泄露

两种开源的数据库连接池

•JDBC的数据库连接池使用javax.sql.DataSource 来表示,DataSource 只是一个接口,该接口通常由服务器(Weblogic, WebSphere,Tomcat)提供实现,也有一些开源组织提供实现:

​ –DBCP 数据库连接池

​ –C3P0 数据库连接池

•DataSource 通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把DataSource 称为连接池

DBCP数据源

•DBCP 是 Apache软件基金组织下的开源连接池实现,该连接池依赖该组织下的另一个开源系统:Common-pool.如需使用该连接池实现,应在系统中增加如下两个jar 文件:

​ –Commons-dbcp.jar:连接池的实现

​ –Commons-pool.jar:连接池实现的依赖库

•Tomcat的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。

DBCP数据源使用范例

•数据源和数据库连接不同,数据源无需创建多个,它是产生数据库连接的工厂,因此整个应用只需要一个数据源即可。

•当数据库访问结束后,程序还是像以前一样关闭数据库连接:conn.close(); 但上面的代码并没有关闭数据库的物理连接,它仅仅把数据库连接释放,归还给了数据库连接池。

这里写图片描述

C3P0数据源

这里写图片描述

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

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

相关文章

centos6上安装mysql8.0版本

本博客是采用yum源的方式安装,非常的方便和快捷。(redhat 与centos7 等操作系统都可以采用此方法,步骤大体一致) mysql官网地址: https://dev.mysql.com 开始安装: 1.清理环境,查看有没有之前安装过的mysql记录,清理…

koa --- 使用koa-multer上传文件+elementUI

核心代码 const upload require(koa-multer) ({dest: ./public/images}); router.post(/upload, upload.single(file), ctx>{console.log(file, ctx.req.file);console.log(body, ctx.req.body);ctx.body 上传成功; })目录结构如下 基本思路 1.通过浏览器访问url: http:…

[bzoj4003][JLOI2015]城池攻占_左偏树

城池攻占 bzoj-4003 JLOI-2015 题目大意:一颗n个节点的有根数,m个有初始战斗力的骑士都站在节点上。每一个节点有一个standard,如果这个骑士的战斗力超过了这个门槛,他就会根据城池的奖励增加自己的战斗力。具体地:每一…

Java Web Servlet

Java Web Servlet Servlet是在服务器上运行的小程序。一个Servlet就是一个Java类,并且可以通过“请求-响应”编程模型来访问的这个驻留在服务器内存里的Servlet程序。 Servlet可完成以下功能: 读取客户端(浏览器)发送的显式的数…

第二篇 python基础知识总结:数据、运算符

引子 我们跟任何人交流,说的每一句都是都一些文字组成,包含名词、动词、语句、标点符号等,组成我们说普通话构成的基本要素。同理我们学习python语言也要明白这些基本要素,也就是我们常说的基本语法,这是我们必须掌握的…

【BZOJ1797】[AHOI2009]最小割(网络流)

【BZOJ1797】[AHOI2009]最小割(网络流) 题面 BZOJ洛谷 题解 最小割的判定问题,这里就当做记结论吧。(源自\(lun\)的课件) 我们先跑一遍最小割,求出残量网络。然后把所有还有流量的边拿出来跑\(Tarjan\)缩\(…

koa --- 使用Sequelize连接mysql

Sequelize介绍 为了快捷开发,社区出现了一系列的ORM(Object Relational Mapping)类库ORM的字面意思为对象关系映射,它提供了概念性的、易于理解的模型化数据的方法。通过ORM,可以降低操作数据库的成本。开发者不需要通过编写SQL脚本来操作数据库,直接通过访问对象的方式来查询…

Java Web Jsp

Java Web Jsp JSP全称Java Server Pages&#xff0c;是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。 JSP是一种Java servlet&#xff0c;主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHT…

Android gravity和layout_gravity的区别

一、gravity和layout_gravity相同处 两者都是设置对齐方式的属性。内部的属性值相同。 根据英文意思也能理解其中的意思。如center_horizontal表示在水平方向上的位置为中间。 二、gravity和layout_gravity的不同处 gravity是设置自身内部元素的对齐方式。比如一个TextView&…

koa --- mongoose连接mongoDB

使用Mongoose对MongoDB进行操作 const mongoose require(mongoose); mongoose.connect(mongodb://localhost/test,{ })Mongoose中的Schema 定义Schema categorySchema const categorySchema new mongoose.Schema({name:String,description: String,createdAt:{type: Date,…

Java Web 请求转发与请求重定向

Java Web 请求转发与请求重定向 请求转发 服务器行为&#xff0c;即用户向服务器发送了一次http请求&#xff0c;该请求可能会经过多个信息资源处理以后菜返回给用户&#xff0c;各个信息资源使用请求转发机制互相转发请求&#xff0c;但是用户是感觉不到请求转发的。通过req…

05.RDD详解

05.Spark--RDD详解 RDD详解--groupByKey--reduceByKey [MapPartitionRDD单词统计] 单词统计 import org.apache.spark.{SparkConf,SparkContext} object WordCountScala{def main(args:Array[String]):Unit{//创建spark配置对象val confnew SparkConf()conf.setAppName("W…

Mininet

首先&#xff0c;我折腾了两周多的东西终于弄出一点眉目了。 有以下几个内容需要学习记忆一下。 1.虚拟机&#xff0c;弄不出来共享文件夹&#xff0c;就用U盘吧&#xff0c;贼快还不用安装配置各种东西&#xff0c;virtualbox和VMware都支持。 2.ubantu安装软件中途失败&#…

docker --- 使用docker-compose.yml生成redis,并连接redis-cli

docker.compose.yml 配置 version: 3.1 services:redis:image: redisports:- 6379:6379命令行:docker-compose up 查看: docker ps 进入redis-cli,输入以下 docker exec -it 7dc0a redis-cli -h localhost -p 6379 操作Redis数据 设置 namemarron set name marron 获取nam…

浅谈javaweb三大框架和MVC设计模式

浅谈javaweb三大框架和MVC设计模式转载自&#xff1a;http://blog.csdn.net/sunpeng19960715/article/details/50890705 小序&#xff1a;博主以前在学javaweb的时候开始总不理解javaweb三大框架和MVC框架模式&#xff0c;虽然没有把两者混为一谈&#xff0c;但是也是很晕菜。…

win下配置nginx

1.下载:http://nginx.org/en/download.html 2.在安装目录cmd: start nginx.exe 启动nginx 3.修改默认运行端口80(nginx.conf): HTTP 数据分发 修改配置文件nginx.conf相应节点: 修改完后重启服务: nginx -s reload TCP 数据分发: nginx 1.9以上版本支持tcp转发 配置文件中增加:…

在springBoot中配置web.xml中配置的servlet

第一种 web.xml (截取的需要转换的) 当拦截到 /socke t时执行该servlet <servlet><servlet-name>websocket</servlet-name><servlet-class>org.ldd.ssm.hangyu.socket.MyWebSocketServlet</servlet-class></servlet><servlet-mapping&g…

koa --- koa-bouncer验证

使用 koa-bouncer中间件对传入的数据进行验证 const bouncer require(koa-bouncer); app.use(bouncer.middleware());const val async (ctx, next) > {ctx.validateBody(name).required(要求提供用户名).isLength(6, 16, 用户名长度应该为6~16).isString().trim()next();…

static关键字的作用

//C/C程序员面试指南 杨国祥等编著 定义全局静态变量。全局静态变量有以下特点&#xff1a; 在全局数据区分配内存&#xff1b;如果没有初始化&#xff0c;其默认值为0&#xff1b;该变量在本文件内从定义开始到文件结束可见。定义局部静态变量。局部静态变量有以下特点&…

Redis 初次尝试

Redis 初次尝试 第一次接触redis&#xff0c;也不知道要写些什么。就玩了下将redis列表中的数据存入mysql数据库中。 首先有三个文件&#xff1a; redis.php 添加数据进redis&#xff1b; insert_class.php 将数据插入数据库&#xff1b; inert.php 调用insert_class.php;…