您的位置:首页 > 编程语言 > Java开发

JavaWeb系列之十三(jdbc事务与连接池)

2015-06-20 12:01 232 查看

1.事务:表示一组操作要么都成功,有一个失败,所有操作都会失败。
在mysql要使用事务,就要先开启事务,语句start transaction,提交事务:commit 回滚事务:rollback。
转账:
2.jdbc事务的操作
(1)操作事务的方法
setAutoCommit(boolean autoCommit) 设置事务的提交方式,默认自动提交,设置为fals不会提交
提交事务commit()
回滚事务rollback()
使用jdbc来完成转账
小金跟小李接一千
(2)设置事务的回滚点
回滚的时候还要提交,commit(sq);会回到设置回滚点的地方
3.事务的特性:
四个特性:1.原子性:在事务里面操作,要么成功,要么都失败
2.一致性:在事务操作过程中,数据要保持一致性,比如钱不会多,也不会少
3.隔离性:多个事务同时对一张表操作,多个事务不会互相影响
4.持久性:提交事务到数据库,是真正生效
4.事务的隔离性
不考虑事务的隔离性,产生一些问题,五个问题
三个读对的问题:第一个问题:脏读,一个事务获取到另外事务的没有提交的事务
第二个问题:不可重复读,一个事务里面查询到已经提交的事务,另外一个事务里面是update,导致两个事务查询到的数据是不一样的。
第三个问题:虚读:一个事务里面查询到另外一个事务里面insert操作
解决方式:通过隔离级别解决这些读的问题
Serializable:串行的.避免脏读、不可重复读和虚读发生
Repeatable read:重复读. 避免脏读、不可重复读.但是虚读还是有可能发生的,默认是这个,两个事务都需要提交了,才能查询到
Read committed:已提交读.避免脏读.但是不可重复读和虚读有可能发生,提交的时候,才能查询到钱,避免了损失。导致两个事务查询到的数据是不一样的
Read uncommitted:未提交读.脏读、不可重复读、虚读都可能发生 没有提交就可以查询到内容,如果回滚的话,就会查不到钱。

select @@tx_isolation; 查询当前事务隔离级别
set session transaction isolation level 设置事务隔离级别
(1)演示脏读
第一步:打开两个cmd窗口
第二步:设置隔离级别
第三步:开启事务
第四步:在左边查看数据
Read committed:在左边窗口通过食物查看数据,这两次看得结果不一样,
多个事务之间互相印象,不可重复读
5.mysql数据库的备份和还原
第一种:使用可视化工具进行备份
第二种:使用sql语句
mysqldump -u root -p 要备份的数据名称>要放的磁盘
通过这个语句备份的数据库语句里面,没有创建数据库的语句
注意1:不能连接数据库
注意2:没有创建数据库的语句
注意3:备份文件要以.sql为后缀名
注意4:备份路径不能有中文
mysqldump -u root -p day16 >d:\day17.sql
还原数据库
mysql -u root -p 要还原的数据库<备份的文件路径
注意1:执行的语句后面不能写分号
注意2:不要登录
6.连接池的概述
之前得到数据库连接DriverManager.getConnection();
每个用户连接都需要执行一次,运用连接池来解决
预先创建一些连接,放到内存中的一个空间,每次访问的时候,从内存空间里面获取一个链接,用完之后不进行关闭,放回内存空间里面,供其它用户使用。避免频繁的创建和关闭在内存空间理解为,一个容器,容器里面放着数据库的连接。
自定义连接池(了解)

创建一个类实现一个接口DataSource
在内存中分配一个空间List集合,把创建的多个连接放到集合里面
把创建的连接放到集合里面去 add()
把链接取出来,remove(0)

开源的连接池
DBCP连接池
C3P0连接池(一般企业中的都使用这个连接池)
Tomcat内置的连接池

如何增强一个类的方法
第一种继承
public class TestMethod {
public static void main(String[] args) {
Man m=new SuperMan();
m.run1();
}
}
class Man{
public void run1(){
System.out.println("nam run");
}
}
class SuperMan extends Man {
public void run1(){
//super.run1();
System.out.println("supernam run");
}
}
第二种装饰者模式
首先创建一个接口,在接口里面定义一个方法
写两个类,这两个类分别实现这个接口
在增强的方法所在类里面,得到增强方法所在类的引用
public class TestMethod2 {
public static void main(String[] args) {
Diao d=new Diao(new Ying());
d.fly();
}
}
interface Bird{
public void fly();
}
class Ying implements Bird{
public void fly() {
// TODO Auto-generated method stub
System.out.println(1000);
}
}
class Diao implements Bird{
private Bird bird;
public Diao(Bird bird){
this.bird=bird;
}
public void fly() {
// TODO Auto-generated method stub
bird.fly();
System.out.println(0);
}
}
第三种动态代理
9.开源连接池
DBCP连接池:Apache软件组织,开源的连接池,首先导入jar包
BasicDataSource :手动配置文件方式
BasicDataSourceFactory:自动配置文件,配置文件的名称是固定的不能改变
C3p0连接池
想要使用c3p0连接池,的jar包
ComboPooledDataSource 完成连接池的连接
第一种手动进行配置,创建类
combo.setDriverClass("com.mysql.jdbc.Driver");
combo.setJdbcUrl("jdbc:mysql:///day18");
combo.setUser("root");
combo.setPassword("root");
第二种配置
创建一个配置文件,不是properties格式,是xml配置文件
注意1:xml的名称是固定c3p0-config.xml.,注意2:配置文件要放在src下面,不能放在其他下面,
在new ComboPooledDataSource("")不写或则写错,找默认读取defalut-config
里面的信息,
tomcat内置连接池
使用的jndi技术,需要在tomcat里面进行
有一个类,想要调用这个类,给类起一个名称,通过起这个名字访问类
* 步骤
第一步: 创建一个配置文件,名字固定context.xml
这个文件需要创建在可以有三个地方
第一个可以把文件创建在conf目录下面: 在tomcat里面所有的虚拟主机都可以使用
第二个可以把文件创建\conf\Catalina\localhost:只能在当前的虚拟主机里面使用
第三个可以把文件创建在META-INF:只能在当前的项目里面使用(一般都使用这种方式)
第二步:创建servlet实现连接池
由于tomcat内置的连接池,必须要运行在tomcat里面才可以使用这个连接池
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: