Javaweb学习笔记——(十八)——————事务、DBCP、C3P0、装饰者模式
事务
什么是事务?
转账:
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、装饰者模式的更多相关文章
- python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置
python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置Download JetBrains Python IDE :: PyCharmhttp://www. ...
- (C/C++学习笔记) 十八. 继承和多态
十八. 继承和多态 ● 继承的概念 继承(inheritance): 以旧类为基础创建新类, 新类包含了旧类的数据成员和成员函数(除了构造函数和析构函数), 并且可以派生类中定义新成员. 形式: cl ...
- JDBC学习笔记(8)——数据库连接池(dbcp&C3P0)
JDBC数据库连接池的必要性 一.在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 1)在主程序(如servlet/beans)中建立数据库连接 2)进行sql操作 3)断开数据库连接 ...
- 【转】JDBC学习笔记(8)——数据库连接池(dbcp&C3P0)
转自:http://www.cnblogs.com/ysw-go/ JDBC数据库连接池的必要性 一.在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 1)在主程序(如servlet/ ...
- 【JAVAWEB学习笔记】19_事务
事务 学习目标 案例-完成转账 一.事务概述 1.什么是事务 一件事情有n个组成单元 要不这n个组成单元同时成功 要不n个单元就同时失败 就是将n个组成单元放到一个事务中 2.mysql的事务 默认的 ...
- 【JAVAWEB学习笔记】19_事务概述、操作、特性和隔离级别
事务 学习目标 案例-完成转账 一.事务概述 1.什么是事务 一件事情有n个组成单元 要不这n个组成单元同时成功 要不n个单元就同时失败 就是将n个组成单元放到一个事务中 2.mysql的事务 默认的 ...
- Java基础学习笔记十八 异常处理
什么是异常?Java代码在运行时期发生的问题就是异常. 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 异常的继承体系 在 ...
- JavaWeb学习 (二十八)————文件上传和下载
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- Javaweb学习笔记——(八)——————常见系统体系结构,Tomcat,以及web的内部外部应用,http协议概述
·软件系统体系结构: 1.常见软件系统体系结构B/S.C/S C/S 1.C/S结构即客户端/服务器(Client/Server),列如QQ: 2.需要编写服务器端程序,以及客户端程序,列如我们安装的 ...
- JavaWeb学习笔记(八)—— EL表达式
一.EL表达式概述 在JSP开发中,为了获取Servlet域对象中存储的数据,经常需要书写很多Java代码,这样的做法会使JSP页面混乱,难以维护.为此,在JSP2.0规范中提供了EL表达式.EL全名 ...
随机推荐
- Expand the scale swarm 副本增减实现负载均衡
#创建好了swarm集群后,我们可以部署一个httpd应用来了解工作情况:#执行以下命令来部署应用: docker service create --name web_server httpd --n ...
- poj3926 parade (单调队列+dp)
题意:有n行路,每行路被分成m段,每一段有长度和权值,要求从最下面一行走到最上面一行某个位置,可以从相邻两行的同一列交点往上走,并且在同一行走的长度要<=K,求走过的最大权值 设f[i][j]为 ...
- [SCOI2015]国旗计划[Wf2014]Surveillance
[SCOI2015]国旗计划 A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这 项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名 ...
- SCOI2008着色方案(记忆化搜索)
有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i 种颜色的油漆足够涂ci 个木块.所有油漆刚好足够涂满所有木块,即 c1+c2+...+ck=n.相邻两个木块涂相同色显得很难 ...
- 【redis】redis常用命令及操作记录
redis-cli是Redis命令行界面,可以向Redis发送命令,并直接从终端读取服务器发送的回复. 它有两种主要模式:一种交互模式,其中有一个REPL(read eval print loop), ...
- SSH防暴力破解脚本
crontab -e 编辑添加一下内容 1 1 * * * sh /root/bin/Denyhosts.sh 脚本内容 #!/bin/bash #Denyhosts SHELL SCRIPT #20 ...
- Linux下设置VSCode为默认的文本编辑器
解决方法 执行一下命令 xdg xdg-mime default code.desktop text/plain Debian alternatives system sudo update-alte ...
- LOJ#2541 猎人杀
解:step1:猎人死了之后不下台,而是继续开枪,这样分母不变...... 然后容斥,枚举猎人集合s,钦定他们在1之后死.定义打到1的时候结束,枚举游戏在i轮时结束. 发现式子是一个1 + x + x ...
- 【洛谷P3275】糖果
题目大意:维护 M 个差分约束关系,问是否可以满足所有约束,如果满足输出一组解.\(N<=1e5\) 题解:差分约束模型可以通过构建一张有向图来求解.是否满足所有约束可以利用 spfa 进行判断 ...
- (转)多线程——继承Thread 类和实现Runnable 接口的区别
java中我们想要实现多线程常用的有两种方法,继承Thread 类和实现Runnable 接口,有经验的程序员都会选择实现Runnable接口 ,其主要原因有以下两点: 首先,java只能单继承,因此 ...