事务

    什么是事务?

        转账:

            1.给张三账户减1000元

            2.给李四账户加1000元

当给张三账户减1000元之后,抛出了异常,这样会导致张三账户减了1000元,然后李四账户没有加上1000元。

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

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

事务的特性:ACID

    *原子性:事务中的所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。

    *一致性:事务执行后,数据库状态与其他业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。

    *隔离性:隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。

    *持久性:一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。

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

    

MySQL操作事务

    1.开始事务:start transaction

    2.结束事务:commit或rollback

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

JDBC事务

    1.开始事务:conn.setAutoCommit(false);

    2.结束事务:conn.commit()或conn.rollback();

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

保存点

    保存点的是可以回滚到事务中的某个位置,而不是回滚整个事务。

    回滚到保存点不会结束事务。

    设置保存点:Savepoint sp = conn.setSavepoint();

    回滚到保存点:conn.rollback(sp);

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

事务隔离级别

    *脏读:读到未提交

    *不可重复读:两次读取不一致,读取到另一事务修改的记录

    *幻读:两次读取不一致,读取到另一事务插入的记录

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

四大隔离级别

    *SERIALIZABLE(串行化):对同一数据的访问是串行的,即非并发的,所以不会出现任何并发问题。易出现死锁,效率太低,不可用!

    *REPATABLE READ(可重复读):防止了脏读、不可重复读,但没有防止幻读。

    *READ COMMITTED(读已提交):防止了脏读,但没有防止不可重复读,以及幻读。

    *READ UNCOMMITTED(读未提交):可能出现所有并发问题,效率最高,但不可用。

MySQL默认事务隔离级别是:REPEATABLE READ

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

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

MySQL设置事务隔离级别

    *查看:SELECT @@tx_isolation

    *设置:set transaction isolation level 四选一

JDBC设置事务隔离级别

    conn.setTransactionIsolation(四选一)

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

数据库连接池

    作用:使用池来管理连接的生命周期,节省资源,提高性能。

    Java提供的连接池接口:javax.sql.DataSource,连接池厂商的连接池类需要实现这一接口。

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

DBCP

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

BasicDataSource ds = new BasicDataSoure();

    ds.setUsername("root");

    ds.setPassword("123456");

    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 conn = 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("123456");

    ds.setDriverClass("com.mysql.jdbc.Driver");

ds.setAcquireIncrement(5);

    ds.setInitialPoolSize(20);

    ds.setMinPoolSize(2);

    ds.setMaxPoolSize(50);

Connection conn = ds.getConnection();

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

C3P0配置文件

    1.通过默认配置初始化连接池

        ComboPooledDataSource ds = new ComboPooledDataSource();

        Connection conn = ds.getConnection();

<default-config>

            <property name="xxx">XXX</property>

        </default-config>

2.通过命名配置初始化连接池

        ComboPooledDataSource ds = new ComboPooledDataSource("oracle-config");

        Connection conn = ds.getConnection();

<named-config name="oracle-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 conn = 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():批处理

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



    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 CollumnListHandler("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);

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

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

装饰者模式

    对象增强的手段

        *继承

            被增强的对象固定的

            增强的内容也是固定的

        *装饰者模式

            被增强的对象是可以切换的

            增强的内容是固定的

        *动态代理(AOP)

            被增强的对象可以切换:Service

            增强的内容也可以切换:事务处理

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

继承:

        缺点:

            1.增强的内容是死的,不能动

            2.被增强的对象也是死的

使用继承会使得类增多

class 咖啡类{}

class 有糖咖啡 extends 咖啡类 {

        }

class 加奶咖啡 extends 咖啡类 {

        }

class 加盐咖啡 extends 咖啡类 {

        }

class 加糖加奶 extends 加奶 {

        }

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

装饰者模式:

        1.增强的内容是不能修改的

        2.被增强的对象可以是任意的

class 咖啡类{

        }

class 有糖咖啡 extends 咖啡类 {

        }

class 加奶咖啡 extends 咖啡类 {

        }

class 加盐咖啡 extends 咖啡类 {

        }

咖啡 a = new 加糖();

        咖啡 b = new 加盐(a);//对a进行装饰,就是给a加盐

        咖啡 c = new 加奶(b);

Java API

    IO流

四大家:

        1.字节:InputStream、OutputStream

        2.字符:Reader、Writer

InputStream:

        FileInputStream:它是节点流,就是和一个资源绑定在一起的,文件

        BufferInputStream:它是装饰流,创建我是一定要给我一个底层对象,然后不管给的是什么流,都会给他添加缓冲流。

new BufferedInputStream(任意的InputStream)

FileInputStream fis = new FileInputStream("F:/a.jpg");

    BufferedInputStream bis = new BufferedInputStream(fis);

    ObjectInputStream ois = new ObjectInputStream(bis);

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

Connection conn = ...

装饰:不知道被增强·对象的具体类型时,可以使用

1,是你还是你,一起都是你

is a

has a

use a

class MyConnection implements Connection{//是你

    //还有你

    private Connection conn;//底层对象,被增强对象

public MyConnection(Connection conn){//通过构造器传递底层对象

        this.conn = conn;

    }

//一切拜托你

    public Statement createStatement(){

        return conn.createStatement();

    }

//增强点

    public void close(){

        //把当前连接归还给池!

    }

}

Conneciton conn = 通过四大参数创建连接对象,是由Mysql提供的。

Connection conn1 = new MyConnection(conn);

conn1.createStatement();

conn.createStatment();

conn1.close();

conn.close();

        

}

Javaweb学习笔记——(十八)——————事务、DBCP、C3P0、装饰者模式的更多相关文章

  1. python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置

    python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置Download JetBrains Python IDE :: PyCharmhttp://www. ...

  2. (C/C++学习笔记) 十八. 继承和多态

    十八. 继承和多态 ● 继承的概念 继承(inheritance): 以旧类为基础创建新类, 新类包含了旧类的数据成员和成员函数(除了构造函数和析构函数), 并且可以派生类中定义新成员. 形式: cl ...

  3. JDBC学习笔记(8)——数据库连接池(dbcp&C3P0)

    JDBC数据库连接池的必要性 一.在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 1)在主程序(如servlet/beans)中建立数据库连接 2)进行sql操作 3)断开数据库连接 ...

  4. 【转】JDBC学习笔记(8)——数据库连接池(dbcp&C3P0)

    转自:http://www.cnblogs.com/ysw-go/ JDBC数据库连接池的必要性 一.在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 1)在主程序(如servlet/ ...

  5. 【JAVAWEB学习笔记】19_事务

    事务 学习目标 案例-完成转账 一.事务概述 1.什么是事务 一件事情有n个组成单元 要不这n个组成单元同时成功 要不n个单元就同时失败 就是将n个组成单元放到一个事务中 2.mysql的事务 默认的 ...

  6. 【JAVAWEB学习笔记】19_事务概述、操作、特性和隔离级别

    事务 学习目标 案例-完成转账 一.事务概述 1.什么是事务 一件事情有n个组成单元 要不这n个组成单元同时成功 要不n个单元就同时失败 就是将n个组成单元放到一个事务中 2.mysql的事务 默认的 ...

  7. Java基础学习笔记十八 异常处理

    什么是异常?Java代码在运行时期发生的问题就是异常. 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 异常的继承体系 在 ...

  8. JavaWeb学习 (二十八)————文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  9. Javaweb学习笔记——(八)——————常见系统体系结构,Tomcat,以及web的内部外部应用,http协议概述

    ·软件系统体系结构: 1.常见软件系统体系结构B/S.C/S C/S 1.C/S结构即客户端/服务器(Client/Server),列如QQ: 2.需要编写服务器端程序,以及客户端程序,列如我们安装的 ...

  10. JavaWeb学习笔记(八)—— EL表达式

    一.EL表达式概述 在JSP开发中,为了获取Servlet域对象中存储的数据,经常需要书写很多Java代码,这样的做法会使JSP页面混乱,难以维护.为此,在JSP2.0规范中提供了EL表达式.EL全名 ...

随机推荐

  1. 这些保护Spring Boot 应用的方法,你都用了吗?

    这些保护Spring Boot 应用的方法,你都用了吗? 生如夏花 SpringForAll社区 今天 Spring Boot大大简化了Spring应用程序的开发.它的自动配置和启动依赖大大减少了开始 ...

  2. Java 帝国之建造者模式

    Java 帝国之建造者模式 原创: 王钦誉 码农翻身 今天 本文来自王钦誉的投稿,老刘做了较大修改. 原文地址: https://xiaoqinyu0000.github.io/2018/06/11/ ...

  3. 【洛谷P2868】Sightseeing Cows

    题目大意:给定一个 N 个点,M 条边的有向图,点有点权,边有边权,求该有向图中的一个环,使得环上点权和与环上边权和之比最大. 题解:0/1 分数规划思想,每次二分一个 mid,在新图上跑 spfa, ...

  4. Linux命令模拟Http的get或post请求

    Http请求指的是客户端向服务器的请求消息,Http请求主要分为get或post两种,在Linux系统下可以用curl和wget命令来模拟Http的请求. get请求: 1.使用curl命令: cur ...

  5. sublime安装说明

    安装Install package https://www.cnblogs.com/lixuwu/p/5693624.html 常用配置 Perference → Settings – User,用下 ...

  6. mac java_home等系统参数配置

    JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/HomeCLASSPAHT=.:$JAVA_HOME/lib ...

  7. goto语句

    让程序直接跳到自定义标签位置 public static void Main(string[] args) { ; goto myLabel;AppDomainInitializer//直接跳到标签m ...

  8. Go-day06

    今日内容概要: 1.interface接口 2.反射 一.接口 接口定义 1.Interface类型可以定义一组方法,当时不需要实现,并且interface不能包含任何变量 2.接口定义 type e ...

  9. bzoj1497 最小割

    题意: 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项,就需要完成前 ...

  10. 使用yum源的方式单机部署MySQL8.0.13

    使用yum源的方式单机部署MySQL8.0.13 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 基本上开源的软件都支持三种安装方式,即rmp方式安装,源码安装和二进制方式安装.在 ...