一、事务部分

1.事务的简介

做一件事情,这个一件事情中有多个组成单元,这个多个组成单元要不同时成功,要不同时失败。A账户转给B账户钱,将A账户转出钱的操作与B账户转入钱的操作绑定到一个事务中,要不这两个动作同时成功,代表这次转账成功,要不就两个动作同时失败,代表这次转账失败。

2.mysql的事务控制

mysql默认事务是自动提交的,一条sql是一个事务

手动开启事务:start transaction

当手动开启事务后,数据库默认的事务的自动提交暂时失效

提交事务:commit

提交事务到开启事务之间的所有的sql语句都生效

回滚事务:rollback

从回滚事务到开启事务之间的所有的sql操作都无效

3.jdbc的API的事务控制

通过Connection对象可以控制事务

jdbc中想控制事务其实是控制jdbc的更新数据库的API方法---executeUpdate

开启事务:connection.setAutoCommit(false);

提交事务:connection.commit();

回滚事务:connection.rollback();

4.事务的四大特性ACID

原子性:数据库的操作的最小的单位就是事务

一致性:一个事务中的多个操作的结果数据是一致的,同时成功和同时失败

隔离性:多个事务之间的操作互不影响

持久性:当一个事务提交后,更新操作才持久化到磁盘上

在不考虑隔离性的前提下会产生哪些影响?

模拟两个事务A事务  B事务

脏读:B事务读到了A事务尚未提交的事务

不可重复读:A事务中两次读取的数据的内容不一致

虚读/幻读:A事务中两次读取的数据的数量不一致

5.事务的隔离级别

通过设置数据库的隔离级别 解决上述的问题:

read uncommitted:读取尚未提交的事务,什么都不能解决

read committed:读取已经提交的内容,可以解决脏读

repeatable read:重复读,可以解决脏读和不可重复读

serializable:串行化,可以解决所有

数据库默认的隔离级别

mysql的默认隔离级别:repeatable read

oracle的默认的隔离级别:read committed

查询数据库的隔离级别:select @@tx_isolation

手动的修改数据库默认的隔离级别:

set session transaction isolation level 设置事务隔离级别

模拟脏读步骤:

1)开启两个客户端 分别进入数据库

2)设置两个客户端数据库隔离级别为read uncommitted

3)两个客户端分别开启事务

4)A客户端修改数据但是尚未提交

5)B客户端查询数据 发现数据已经修改

6)A客户端回滚

隔离级别性能问题:serializable<repeatable read<read committed<read uncommitted

隔离级别安全问题:serializable>repeatable read>read committed>read uncommitted

注意:事务控制必须在service层

ThreadLocal:代表是专门存放当前线程的数据的map

获取当前线程的数据:get();

设置当前线程上绑定的数据:set(value)

删除当前线程上绑定的数据:remove()

二、连接池部分

1.连接池的简介

(1)什么是连接池

存放数据库连接资源(Connection)的池子

(2)为什么需要连接池

1)节约连接资源 提高程序的性能

2)防止数据库服务器连接资源溢出

(3)连接池内部的原理

1)连接池一创建就初始化一些Connection资源

2)当使用Connection时不是创建而是从池子中获取一个资源

3)当资源使用完毕 不是将该资源销毁 而是将资源在归还给池子

(4)自定义连接池

 public class MyDataSource {
//1、创建一个池子
private static LinkedList<Connection> datasource = new LinkedList<Connection>();
//2、在创建DataSource时 就为池子初始化一些连接资源
public MyDataSource(int count){
for(int i=0;i<count;i++){
try {
//conn 是mysql驱动包提供的对象
Connection conn = JDBCUtils.getConnection();
//怎样对一个对象中的方法进行加强
//BufferedReader reader = new BufferedReader(new FileReader(""));
ConnectionWrapper wrapper = new ConnectionWrapper(conn);
//在将connnection资源放置到池子中之前 对conn进行一些加强(主要加强是close方法)
datasource.add(wrapper);
} catch (Exception e) {
e.printStackTrace();
}
}
}
//获取connection的方法
public static Connection getConnection(){
return datasource.removeFirst();
}
//将使用完毕的资源放回池子中
public static void giveBack(Connection conn){
System.out.println("归还前的数量:"+datasource.size());
datasource.addLast(conn);
System.out.println("归还后的数量:"+datasource.size());
}
public static void main(String[] args) throws SQLException {
MyDataSource dataSource = new MyDataSource(10);
Connection conn = dataSource.getConnection();
System.out.println(conn);
//调用PreparedStatement对象
PreparedStatement pstmt = conn.prepareStatement("select * from account");
System.out.println(pstmt);
///dataSource.giveBack(conn);
//问题:想要做的是当conn在调用close方法时 不是销毁 而是将conn放回池子中
conn.close();
}
}

装饰者模式:

1)加强的类与被加强的类必须实现同一个接口

2)要将被加强的类作为构造器的参数传入

3)要加强的方法重写逻辑,不需要加强的方法调用被加强的

2.常用的开源的连接池技术

DBCP:Apache基金会的开源的连接池技术 Commons项目中子项目

C3P0:开源的连接池技术

(1)DBCP连接池技术

下载jar包

导入jar包

 public class DBCPDemo {
@Test
public void test1() throws SQLException{
//1、获得一个连接池
BasicDataSource dataSource = new BasicDataSource();
//设置数据库的信息
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///database");
dataSource.setUsername("root");
dataSource.setPassword("root");
//2、获得一个连接资源
Connection conn = dataSource.getConnection();
System.out.println(conn);
//3、将资源归还
conn.close();
}
@Test
public void test2() throws Exception{
InputStream in = DBCPDemo.class.getClassLoader().getResourceAsStream("dbcp.properties");
Properties pro = new Properties();
pro.load(in);
DataSource dataSource = BasicDataSourceFactory.createDataSource(pro);
Connection conn = dataSource.getConnection();
System.out.println(conn);
conn.close();
}
}

(2)C3P0连接池

下载jar包

导入jar包

 public class C3P0Demo {
@Test
public void test1() throws Exception{
//创建连接池
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//设置四个基本参数
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql:///database");
dataSource.setUser("root");
dataSource.setPassword("root");
//获取连接
Connection conn = dataSource.getConnection();
System.out.println(conn);
conn.close();
}
@Test
public void test2() throws SQLException{
//创建连接池
//ComboPooledDataSource dataSource = new ComboPooledDataSource("haohao");
ComboPooledDataSource dataSource = new ComboPooledDataSource();
Connection conn = dataSource.getConnection();
System.out.println(conn);
conn.close();
}
}

Java实战之04JavaWeb-05事务和连接池的更多相关文章

  1. 十三、事务、连接池 、ThreadLocal 、BaseServlet自定义Servlet父类 、 DBUtils à commons-dbutils

    l 事务 l 连接池 l ThreadLocal l BaseServlet自定义Servlet父类(只要求会用,不要求会写) l DBUtils à commons-dbutils 事务 l 事务的 ...

  2. 一、DAO设计模式 二、DAO设计模式的优化 三、JDBC中的事务,连接池的使用

    一.DAO设计模式概述###<1>概念 DAO,Data Access Object ,用于访问数据库的对象. 位于业务逻辑和数据持久化层之间,实现对数据持久化层的访问![](1.png) ...

  3. 03 事务,连接池DBCP,C3P0,DBUtils

    事务 Transaction  其实指的一组操作,里面包含许多个单一的逻辑.只要有一个逻辑没有执行成功,那么都算失败. 所有的数据都回归到最初的状态(回滚) 事务的作用:为了确保逻辑的成功. 例子: ...

  4. HttpClient实战二:单线程和多线程连接池实例

    为什么使用HTTP连接池? 随着系统架构风格逐渐向前后端分离架构,微服务架构转变,RestFul风格API的开发与设计,同时SpringMVC也很好的支持了REST风格接口.各个系统之间服务的调用大多 ...

  5. JDBC、事务和连接池

    一:JDBC 1.什么是JDBC JDBC(Java Data Base Connectivity)SUN公司提供的一套操作数据库的标准规范.具体来讲是一种用于执行SQL语句的Java API,为多种 ...

  6. HttpClient实战三:Spring整合HttpClient连接池

    简介 在微服务架构或者REST API项目中,使用Spring管理Bean是很常见的,在项目中HttpClient使用的一种最常见方式就是:使用Spring容器XML配置方式代替Java编码方式进行H ...

  7. jdbc事务、连接池概念、c3p0、Driud、JDBC Template、DBUtils

    JDBC 事务控制 什么是事务:一个包含多个步骤或者业务操作.如果这个业务或者多个步骤被事务管理,则这多个步骤要么同时成功,要么回滚(多个步骤同时执行失败),这多个步骤是一个整体,不可分割的. 操作: ...

  8. Java代码生成器加入postgresql数据库、HikariCP连接池、swagger2支持!

    目录 前言 PostgreSql VS MySql HikariCP VS Druid Swagger2 自定义参数配置一览 结语 前言   最近几天又抽时间给代码生成器增加了几个新功能(预计今晚发布 ...

  9. java基础之JDBC八:Druid连接池的使用

    基本使用代码: /** * Druid连接池及简单工具类的使用 */ public class Test{ public static void main(String[] args) { Conne ...

随机推荐

  1. Datatable的Select()方法简介

    DataTable是我们在进行开发时经常用到的一个类,并且经常需要对DataTable中的数据进行筛选等操作,下面就介绍一下Datatable中经常用到的一个方法——Select,微软提供了四个函数的 ...

  2. (Map)利用Map,完成下面的功能:  从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。  附:世界杯冠军以及对应的夺冠年份,请参考本章附录。 附录 (Map)在原有世界杯Map 的基础上,增加如下功能: 读入一支球队的名字,输出该球队夺冠的年份列表。 例如,读入“巴西”,应当输出 1958 1962 1970 1

    package homework001; import java.util.HashMap; import java.util.Scanner; public class Map { public s ...

  3. iOS开发笔记系列-基础1(数据类型与表达式)

    学习iOS开发快两年了,去年完成MagViewer之后就因为公司的其他业务繁重,除了维护这个应用之外,只是断断续续地自己做一些实验开发,没有再发布新的应用,这里想整理一下学习过程中的笔记,以便加深印象 ...

  4. TQ210裸机编程(2)——LED流水灯

    两个文件start.S和led.c start.S .global _start                @声明一个全局的标号 _start:     bl main               ...

  5. iOS音频篇:AVPlayer的缓存实现

    授权转载,作者:明仔Su(简书) 在上一篇文章<使用AVPlayer播放网络音乐>介绍了AVPlayer的基本使用,下面介绍如何通过AVAssetResourceLoader实现AVPla ...

  6. sql server char nchar nvarchar varchar之間的區別

    char存储固定长度的字符串,最大长度为8000个字节. varchar存储可变长度的字符串.最大长度为8000个字节. nchar存储固定长度的Unicode字符串,最大长度为4000个字符. nv ...

  7. 【linux c learn 之stat】获取文件的属性

    NAME stat 获取文件属性 这个函数位于<sys/stat.h>头文件里 函数原型: int stat(const char *path, struct stat *buf); 參数 ...

  8. tcp_tw_recycle和tcp_timestamps的文章汇总

        临近年关,人会变得浮躁,期间写的代码可谓乱七八糟.不过出来混始终是要还的,这不最近就发现一个PHP脚本时常连不上服务器. 遇到这类问题,我习惯于先用strace命令跟踪了一下看看: shell ...

  9. com.classpath.www

    package com.classpath.www; import java.io.File; import java.net.URL; import javax.servlet.ServletCon ...

  10. c++ (P49—P68)

    1 c++语言并没有明确规定调用这个函数时实参的求值顺序,而是让编译器根据对代码进行优化的需要自行决定实参的求职顺序.这样就带来了二义性. function(a++,a*); //存在二义性 a++; ...