事务

什么是事务? 转账: 1. 给张三账户减1000元 2. 给李四账户加1000元

当给张三账户减1000元后,抛出了异常!这会怎么样呢?我相信从此之后,张三再也不敢转账了。

使用事务就可以处理这一问题:把多个对数据库的操作绑定成一个事务,要么都成功,要么都失败!

==============

事物的特性:ACID

* 原子性:事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。 * 一致性:事务执行后,数据库状态与其它业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。 * 隔离性:隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。 * 持久性:一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。

==============

MySQL操作事务

1. 开始事务:start transaction 2. 结束事务:commit或rollback

==============

JDBC事务

1. 开始事务:con.setAutoCommit(false); 2. 结束事务;con.commit()或con.rollback();

==============

保存点

保存点的是可以回滚到事务中的某个位置,而不是回滚整个事务。 回滚到保存点不会结束事务。 设置保存点:Savepoint sp = con.setSavepoint(); 回滚到保存点:con.rollback(sp);

==============

事务隔离级别

* 脏读:读到未提交 * 不可重复读:两次读取不一致,读取到另一事务修改的记录 * 幻读:两次读取不一致,读取到另一事务插入的记录

--------------

四大隔离级别 * SERIALIZABLE(串行化):对同一数据的访问是串行的,即非并发的,所以不会出现任何并发问题。易出现死锁,效率太低!不可用! * REPEATABLE READ(可重复读):防止了脏读、不可重复读,但没有防止幻读 * READ COMMITTED(读已提交):防止了脏读,但没有防止不可重复读,以及幻读 * READ UNCOMMITTED(读未提交):可能出现所有并发问题,效率最高,但不可用!

MySQL默认事务隔离级别为:REPEATABLE READ Oracle默认事务隔离级别为:READ COMMITTED

--------------

MySQL设置事务隔离级别 * 查看:select @@tx_isolation * 设置:set transaction isolation level 四选一

JDBC设置事务隔离级别 con.setTransactionIsolation(四选一)

===============

数据库连接池

作用:使用池来管理连接的生命周期,节省资源,提高性能。 java提供的连接池接口:javax.sql.DataSource,连接池厂商的连接池类需要实现这一接口。

-------------

DBCP

jar:commons-pool.jar、commons-dbcp.jar

BasicDataSource ds = new BasicDataSource(); ds.setUsername("root"); ds.setPassword("123"); ds.setUrl("jdbc:mysql://localhost:3306/mydb1"); ds.setDriverClassName("com.mysql.jdbc.Driver");     ds.setMaxActive(20); ds.setMaxIdle(10); ds.setInitialSize(10) ; ds.setMinIdle(2) ; ds.setMaxWait(1000) ;    Connection con = ds.getConnection();

-------------

C3P0

jar:c3p0-0.9.2-pre1.jar、c3p0-oracle-thin-extras-0.9.2-pre1.jar、mchange-commons-0.2.jar

ComboPooledDataSource ds = new ComboPooledDataSource(); ds.setJdbcUrl("jdbc:mysql://localhost:3306/mydb1"); ds.setUser("root"); ds.setPassword("123"); ds.setDriverClass("com.mysql.jdbc.Driver");     ds.setAcquireIncrement(5) ; ds.setInitialPoolSize(20) ; ds.setMinPoolSize(2) ; ds.setMaxPoolSize(50) ;    Connection con = ds.getConnection();

-------------

C3P0配置文件

1. 通过默认配置初始化连接池 ComboPooledDataSource ds = new ComboPooledDataSource(); Connection con = ds.getConnection();

<default-config>   <property name="xxx">XXX</property> </defualt-config>

2. 通过命名配置初始化连接池 ComboPooledDataSource ds = new ComboPooledDataSource("oracle-config"); Connection con = ds.getConnection();

<named-config name="orcale-config">   <property name="xxx">XXX</property> </named-config>

==================

Tomcat配置连接池 在server.xml中,或在conf/catalina/localhost/下创建xml文件

<Context>    <Resource name="myc3p0"    type="com.mchange.v2.c3p0.ComboPooledDataSource"    factory="org.apache.naming.factory.BeanFactory"    user="root"    password="123"    classDriver="com.mysql.jdbc.Driver"       jdbcUrl="jdbc:mysql://127.0.0.1/mydb1"    maxPoolSize="20"    minPoolSize ="5"    initialPoolSize="10"    acquireIncrement="2"/> </Context>

-------------

获取Tomcat资源 Context cxt = new InitialContext(); DataSource ds = (DataSource)cxt.lookup("java:/comp/env/myc3p0"); Connection con = ds.getConnection();

==================

修改JdbcUtils

public class JdbcUtils {  private static DataSource dataSource = new ComboPooledDataSource();

public static DataSource getDataSource() {   return dataSource;  }

public static Connection getConnection() {   try {    return dataSource.getConnection();   } catch (Exception e) {    throw new RuntimeException(e);   }  } }

==================

DBUtils

jar:commons-dbutils.jar 核心类:QueryRunner、ResultSetHandler

QueryRunner方法: * update():DDL、DML * query():DQL * batch():批处理

-------------

增、删、改

public void fun1() throws SQLException {  QueryRunner qr = new QueryRunner();  String sql = "insert into user values(?,?,?)";  qr.update(JdbcUtils.getConnection(), sql, "u1", "zhangSan", "123"); }

-------------

查

DataSource ds = JdbcUtils.getDataSource(); QueryRunner qr = new QueryRunner(ds); String sql = "select * from tab_student";

// 把结果集转换成Bean Student stu = qr.query(sql, new BeanHandler<Student>(Student.class));

// 把结果集转换成Bean的List List<Student> list = qr.query(sql, new BeanListHandler<Student>(Student.class));

// 把结果集转换成Map Map<String,Object> map = qr.query(sql, new MapHandler());

// 把结果集转换成List<Map> List<Map<String,Object>> list = qr.query(sql, new MapListHandler() );

// 把结果集转换成一列的List List<Object> list = qr.query(sql, new ColumnListHandler("name")) ;

// 把结果转换成单行单列的值 Number number = (Number)qr.query(sql, new ScalarHandler());

================

批处理

DataSource ds = JdbcUtils.getDataSource();  QueryRunner qr = new QueryRunner(ds);  String sql = "insert into tab_student values(?,?,?,?)";  Object[][] params = new Object[10][]; //表示 要插入10行记录  for(int i = 0; i < params.length; i++) {   params[i] = new Object[]{"S_300" + i, "name" + i, 30 + i, i%2==0?"男":"女"};  }  qr.batch (sql, params);

jdbc第三天的更多相关文章

  1. jdbc基础 (三) 大文本、二进制数据处理

    LOB (Large Objects)   分为:CLOB和BLOB,即大文本和大二进制数据 CLOB:用于存储大文本 BLOB:用于存储二进制数据,例如图像.声音.二进制文件 在mysql中,只有B ...

  2. JDBC第三次学习

    这是我的JDBC第三次学习了,在学习的过程中,老是会忘掉一些知识,不记下笔记实在不行啊! 使用JDBC调用存储过程 (1)关于如何使用Navicat(11.1.13) for MySQL如何创建存储过 ...

  3. java加载jdbc驱动三种方式的比较

    一.引言 平时连接数据库的时候首先要加载jdbc驱动,这一步骤其实有三种方式,他们的区别?优劣? 二.快速了解三种加载方式 Class.forName(“com.mysql.jdbc.Driver”) ...

  4. JDBC(三)数据库连接池(DBCP、C3P0)

    前言 这段时间状态有一点浮躁,希望自己静下心来.还有特别多的东西还没有学懂.需要学习的东西非常的多,加油! 一.JDBC复习 Java Data Base Connectivity,java数据库连接 ...

  5. jdbc(1)(三)DBCP、C3P0、Proxool 、 BoneCP开源连接池的简介

     简介          使用评价  项目主页  DBCP DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序用使用 可以设置最大和最小连 ...

  6. jdbc连接数据库三种方式

    ---恢复内容开始--- 第一种: public class Demo1 { //连接数据库的URL private String url = "jdbc:mysql://localhost ...

  7. SoapUI接口测试之JDBC(三)

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用java语言编写的类和接口 ...

  8. JDBC第三篇--【事务、元数据、改造JDBC工具类】

    这是我JDBC的第一篇 http://blog.csdn.net/hon_3y/article/details/53535798 这是我JDBC的第二篇 http://blog.csdn.net/ho ...

  9. JDBC (三)

    1 数据库连接池的原理 应用程序直接获取Connection的缺点: 缺点:用户每次请求都需要向数据库获取连接,而数据库创建连接通常需要消耗相对较大的资源,创建的时间较长.如果一个网站一天访问量是10 ...

随机推荐

  1. 解决Xilinx ISE在Win8下打开崩溃闪退的方法

    http://www.121down.com/article/article_13651.html 坑爹的ISE对win8无法完美支持(包括目前最新的14.6),在使用64位ISE时点击OPEN之类的 ...

  2. DU 4609 3-idiots FFT

    题意还是比较好懂. 给出若干个木棍的长度,问这些木棍构成三角形的可能性. 那么公式很容易知道 就是这些木棍组成三角形的所有情况个数 除以 从n个木棍中取3个木棍的情况数量C(n, 3) 即可 但是很显 ...

  3. IOS学习笔记41--图片的缩放(一)

    图片的缩放 一:Pinch手势对图片进行缩放.即用两根手指往不同方向拖拉照片,照片会被缩小或放大. 我理解的原理:等比缩放 先看如下关键代码: 1.初始化参数 - (void)viewDidLoad ...

  4. 【Nginx】ngx_event_core_module模块

    ngx_event_core_module模块属于事件模块,它是其他事件类模块的基础.它主要完毕下面任务: 创建连接池 决定使用哪些事件驱动机制 初始化将要使用的事件模块 以下分析该模块的代码. ng ...

  5. linux系统负载相关的概念和度量

    系统负载有 CPU利用率 和 LoadAverage这2个概念. cpu利用率:cpu utilization,是进程(task)被内核调度进程实际分配了CPU资源后,在时间片内使用CPU进行工作运算 ...

  6. jQuery制作水平多级下拉菜单

    本篇体验使用jQuery制作水平的.多级的.下拉菜单. 下拉菜单的html部分如下. <body> <nav class="main-nav"> <u ...

  7. TIF、JPG图片手动添加地理坐标的方法

    题目:为TIF.JPG图片添加地理坐标/平面直角坐标. 图片来源:GOOGLE EARTH.(当然也可以是其他知道四角点坐标的图片) 截图工具:GEtscreen(此软件截图时可以自动生成图片四角点坐 ...

  8. CAShapeLayer的path动画

    CAShapeLayer的path动画 效果 源码 https://github.com/YouXianMing/Animations // // CAShapeLayerPathController ...

  9. Ladda 应用提交表单的时候显示loading载入中 包含不同位置,不同效果

    Ladda 应用提交表单的时候显示loading载入中 包含不同位置,不同效果 不同大小.位置,效果,进度条等 演示 XML/HTML Code <article class="exa ...

  10. C预编译, 预处理, C/C++头文件, 编译控制,

    在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的 ...