JDBC中的事务

  简单来说,事务就是要保证一组DAO方法的操作,要么一起成功要么一起失败。

  1、事务控制的位置

    在Service中的业务方法内进行事务控制。

  2、事务控制的代码

    a、注意:JDBC会自动把一条增、删、改的操作加入事务。(这样非常不好,因为有些情况是不需要添加事务的,容易产生问题)。

    b、推荐:手工控制事务:

      

 connection.setAutoCommit(false);    //将JDBC的自动事务关闭
 connection.commit();    //手工提交事务
 connection.rollback();    //手工回滚事务

    仅仅在Service层中写入这些代码是完全不行的,因为JDBC事物的控制代码依托于Connection对象,而Connectoin对象有JDBCUtil工具类获取,每次调用JDBCUtil.getConnection()方法的时候,JDBC都会返回一个新的Connection对象。而我们在DAO层和Service层需要用同一个Connection对象,单纯的用JDBCUtil工具类来获得Connection对象是不可取的。因为我们每次都是通过JDBCUtil来获取connection对象的,所以我们应该想办法,让在DAO和Service层利用JDBCUtil获取到同一个Connection对象。JDBCUtil代码如下:

    

public class JDBCUtil{
    static{    private static ThreadLocal tl = new ThreadLocal();    Class.forName("com.mysql.jdbc.Driver");
  }    //创建连接
    public static Connection getConnection(){
        Connection conn = tl.get();
        //加载驱动
        if(conn==null){

            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","12345678");
        }
        return conn;
    }

    //关闭资源
    public static void close(Conection conn,PreparedStatement pstmt,ResultSet rs){
        if(rs!=null){
            rs.close();
        }
        if(pstmt!null){
            pstmt.close();
        }
        if(conn!=null){
            conn.close();
        }
}

    ThreadLocal对象实现对象的线程绑定,tl.get()获得该线程中存的对象,tl.set()是将该对象存入该线程中。由此可以看出,通过ThreadLocal进行线程绑定的对象,只要是同一个线程,便能获得同一个对象。而之前我们需要在DAO和Service中使用同一个Connection对象,所以我们可以将Connection对象进行线程绑定。这样,代码在run的过程中,同一功能层面的DAO和Service调用的便是同一个Connection对象。

    ps、启用事务之后,JDBC的Connection资源应该在Service层关闭,其他资源在DAO中关闭。

浅谈JDBC(二)的更多相关文章

  1. Android开发-浅谈架构(二)

    写在前面的话 我记得有一期罗胖的<罗辑思维>中他提到 我们在这个碎片化 充满焦虑的时代该怎么学习--用30%的时间 了解70%该领域的知识然后迅速转移芳草鲜美的地方 像游牧民族那样.原话应 ...

  2. 浅谈JDBC编程

    一.概述 1.为什么要用JDBC 数据库是程序不可或缺的一部分,每一个网站和服务器的建设都需要数据库.对于大多数应用程序员(此处不包含数据库开发人员)来说,我们更多的不是在DBMS中对数据库进行操纵, ...

  3. 浅谈JDBC(一)

    一.JDBC技术引言 1.什么是JDBC技术 提供了一套接口规范,利用java代码进行数据库操作. 2.JDBC技术的核心思想 对于程序员来说,代码访问数据库分为三个步骤:1.通过数据库的账号密码.2 ...

  4. 浅谈JDBC访问MySQL数据库

    经过我自己的总结后,其实很简单,只需要记住四个步骤,JDBC这部分的学习就可以掌握差不多了,请多多指教. 加载注册JDBC驱动: 打开数据库: 创建向数据库发送sql语句的statement: Res ...

  5. Qt浅谈之二十七进程间通信之QtDBus

    一.简介 DBus的出现,使得Linux进程间通信更加便捷,不仅可以和用户空间应用程序进行通信,而且还可以和内核的程序进行通信,DBus使得Linux变得更加智能,更加具有交互性.        DB ...

  6. Qt浅谈之二十App自动重启及关闭子窗口

    一.简介 最近因项目需求,Qt程序一旦检测到错误,要重新启动,自己是每次关闭主窗口的所有子窗口但有些模态框会出现问题,因此从网上总结了一些知识点,以备以后的应用. 二.详解 1.Qt结构 int ma ...

  7. Qt浅谈之二十App自动重启及关闭子窗口(六种方法)

    一.简介 最近因项目需求,Qt程序一旦检测到错误,要重新启动,自己是每次关闭主窗口的所有子窗口但有些模态框会出现问题,因此从网上总结了一些知识点,以备以后的应用. 二.详解 1.Qt结构 int ma ...

  8. 浅谈Struts2(二)

    一.struts2的跳转 1.action跳转JSP a.默认为forward <action name="action1" class="com.liquidxu ...

  9. 浅谈JSP(二)

    一.EL表达式 作用:从作用域(pageContext,request,session,application)中取值,并显示在页面中. 本质:用于替换输出脚本(<%= %>). 1.从作 ...

随机推荐

  1. c++ 关于类构造函数的初始化列表

    除了性能问题之外,有些时场合初始化列表是不可或缺的,以下几种情况时必须使用初始化列表 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面 引用类型,引用必须在定义的时候初始化,并且不能重 ...

  2. mongodb的 或 查询,实践总结

    PostcardRecord.findOne({user:userid, $or : [ { at:{$gte:start.valueOf(), $lte:end.valueOf()} } , { i ...

  3. Hotel(线段树合并)

    Hotel Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 14958   Accepted: 6450 Descriptio ...

  4. 关于 FPGA 和 外部芯片接口时序设计

    在看这篇文章之前, 建议先好好读下这篇文章.http://download.csdn.net/detail/angelbosj/8013827. 因为我不太会用 VISio.要是哪位网友能告诉我.怎么 ...

  5. Java中Lambda表达式的使用

    简介(译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能.本人建议不要乱用,因 ...

  6. 关于消息推送和service的一些调查-清理内存通知栏点击无响应

    起因:做了两个带推送的app:HiApp和WeApp,前者个推,后者百度推送,但前者有一个小缺陷. 现象:两部手机 1.htcD820t手机,运行中的app利用自带的关闭最近程序后,通知栏不清理该ap ...

  7. JavaEE学习之设计模式

    转自:http://mp.weixin.qq.com/s?__biz=MjM5OTMxMzA4NQ==&mid=221913387&idx=2&sn=d5d006300722f ...

  8. Labview中引用,属性节点,局部变量之间的区别

    Labview中引用,属性节点,局部变量之间的区别        在Labview中我们经常会碰到这样几个概念,那就是控件的引用,属性节点以及局部变量,他们之间到底有哪些区别呢?        首先谈 ...

  9. R与数据分析旧笔记(十一)数据挖掘初步

    PART 1 PART 1 传统回归模型的困难 1.为什么一定是线性的?或某种非线性模型? 2.过分依赖于分析者的经验 3.对于非连续的离散数据难以处理 网格方法 <Science>上的文 ...

  10. 【转】CentOS图形界面的开启与关闭

    源自:http://blog.sina.com.cn/s/blog_4a1f76860100zpus.html 安装CentOS 5.6系统的时候我没有先装任何组件,现在用X Window,需要再安装 ...