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

来源:互联网 发布:昭大网络教育 编辑:程序博客网 时间:2024/06/06 16:56

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里面才可以使用这个连接池










0 0