事务和连接池总结

来源:互联网 发布:价格歧视 知乎 编辑:程序博客网 时间:2024/06/02 01:58
  • 事物的概念:

    事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功。
    例如:A—-B转账,对应如下两条sql语句
    update accoutn set money=money-100 where name=’b’
    update account set money=money+10 where name=’a’

  • 数据库开启事务命令DTL

    start transaction 开启事务
    Rollback 回滚事务
    Commit 提交事务

  • JDBC关闭自动提交

    当JDBC获取一个Connection对象的时候,会默认的提交它的sql语句,使用如下语句关闭
    conn.setAutoCommit(false); //相当于begin
    conn.rollback(); //回滚
    conn.commit();//提交

事务的特性

  • 原子性

    事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

  • 一致性:

    事务必须使得数据库从一个一致性状态换到另一个一致性状态。例如转账前后的总金额不变。

  • 隔离性
    事务的隔离性是多少个用户并发访问数据库时候,数据库为每一个用户开启的事务,各个事务互不干扰,多个并发事务之间要相互隔离。
  • 持久性
    指一个事务一旦提交,它对数据库中的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

#

  • 错误的实例

    脏读:
    指一个事务读取到了另一个事务为提交的数据
    不可重复读:
    指一个事务内读取表中的某一行数据,多次读取的结果不同。可以理解为在本事务没有提交前,读取到了他人提交的数据。(update)
    虚读(幻读):是指一个事务内读取到了别人插入的数据,导致前后读取不一致。(INSERT)

  • 数据库通过设定隔离级别防止以上情况的发生

    READ UNCOMMITTED:脏读,虚读都有可能发生
    READ COMMITED:避免了脏读,不可重复读和虚读有可能发生
    REPEATABLE READ:避免脏读和不可重复读,虚读可能发生。
    SERIALIZABLE:避免了脏读和不可重复读还有虚读
    mysql设置级别:conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

连接池

  • 概念

    数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接而不是在重新创建一个;释放空闲时间

  • 编写连接池

实现接口DataSource接口

  • 出现的问题:

    原类中的close()方法不能调用,需要调用自己编写的close方法,但是在调用的时候必须是调用原类的·形式,也就是说调用原生类实现新类中的某个方法。

  • 解决方法:使用装饰设计模式

    使用目的:改写已经存在的类的某个方法或者某些方法
    过程
    1.编写一个类,实现与被包装类相同的接口(相同的行为)
    2.定义一个被包装类类型的变量
    3.定义构造方法,把被包装类的对象导入,给被包装类变量赋值
    4对于不需要该写的方法,调用自己原有的方法
    5对于需要改写的方法,写自己的代码。
    不使用继承的原因:继承的依赖性太强。
    通过参数是依赖,通过返回值是关联。

适配器模式

是装饰模式的的一中改进,可以让程序员使用的代码更加简洁。
适配器本身不改变任何父类方法。
编写过程:
1.编写一个类,实现与被包装类相同的接口(相同的行为)
2.定义一个被包装类类型的变量
3.定义构造方法,把被包装类的对象导入,给被包装类变量赋值
4对于不需要该写的方法,调用自己原有的方法

常用数据源的配置

3.1DBCP

DBCP:Apache推出的Database Connection Pool
使用步骤:
添加jar包,common-dbcp-1.4.jar commons-pool-1.5.6.jar
添加属性资源文件
编写数据源工具类

public class DBCPUtil {    private static DataSource ds = null;    static{        Properties prop = new Properties();        try {            //根据其路径加载文件            prop.load(DBCPUtil.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"));            ds = BasicDataSourceFactory.createDataSource(prop);        } catch (Exception e) {            //throw new ExceptionInInitializerError("初始化错误,请检查配置文件");/day13_01_dbcp/src/dbcpconfig.properties            e.printStackTrace();        }    }    public static Connection getConnection(){        try {            System.out.println(ds);            return ds.getConnection();        } catch (SQLException e) {            throw new RuntimeException("服务器忙。。。");        }    }    public static void release(Connection conn, Statement st, ResultSet rs){        if(rs != null){            try {                rs.close();            } catch (SQLException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            rs = null;        }        if(st != null){            try {                st.close();            } catch (SQLException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            st = null;        }        if(conn != null){            try {                conn.close();            } catch (SQLException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            conn = null;        }    }}

3.2C3P0

添加jar包
编写配置文件
c3p0-config.xml 放在classpath中或者classes目录中
编写工具类:

public class C3P0Util{    private static ComboPooledDataSource datasource = new ComboPooledDataSource();    //得到Connection对象    public static Connection getConnection(){        try{            return datasource.getConnection();        }catch(SQLException e){            throw new RutimeException("数据库连接失败");        }    }    //释放资源}

#

5、用JavaWeb服务器管理数据源:Tomcat
开发JavaWeb应用,必须使用一个JavaWeb服务器,JavaWeb服务器都内置数据源。
Tomcat:(DBCP)
数据源只需要配置服务器即可。
配置数据源的步骤:
1、拷贝数据库连接的jar到tomcatlib目录下
2、配置数据源XML文件
a)如果把配置信息写在tomcat下的conf目录的context.xml中,那么所有应用都能使用此数据源。
b)如果是在当前应用的META-INF中创建context.xml, 编写数据源,那么只有当前应用可以使用。
3、使用连接池
JNDI:java nameing directory interface
JNDI容器就是一个Map
key(String) value(Object)
path+name 对象
path+”jdbc/day16” DataSource对象

原创粉丝点击