浅谈JDBC(二)
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(二)的更多相关文章
- Android开发-浅谈架构(二)
写在前面的话 我记得有一期罗胖的<罗辑思维>中他提到 我们在这个碎片化 充满焦虑的时代该怎么学习--用30%的时间 了解70%该领域的知识然后迅速转移芳草鲜美的地方 像游牧民族那样.原话应 ...
- 浅谈JDBC编程
一.概述 1.为什么要用JDBC 数据库是程序不可或缺的一部分,每一个网站和服务器的建设都需要数据库.对于大多数应用程序员(此处不包含数据库开发人员)来说,我们更多的不是在DBMS中对数据库进行操纵, ...
- 浅谈JDBC(一)
一.JDBC技术引言 1.什么是JDBC技术 提供了一套接口规范,利用java代码进行数据库操作. 2.JDBC技术的核心思想 对于程序员来说,代码访问数据库分为三个步骤:1.通过数据库的账号密码.2 ...
- 浅谈JDBC访问MySQL数据库
经过我自己的总结后,其实很简单,只需要记住四个步骤,JDBC这部分的学习就可以掌握差不多了,请多多指教. 加载注册JDBC驱动: 打开数据库: 创建向数据库发送sql语句的statement: Res ...
- Qt浅谈之二十七进程间通信之QtDBus
一.简介 DBus的出现,使得Linux进程间通信更加便捷,不仅可以和用户空间应用程序进行通信,而且还可以和内核的程序进行通信,DBus使得Linux变得更加智能,更加具有交互性. DB ...
- Qt浅谈之二十App自动重启及关闭子窗口
一.简介 最近因项目需求,Qt程序一旦检测到错误,要重新启动,自己是每次关闭主窗口的所有子窗口但有些模态框会出现问题,因此从网上总结了一些知识点,以备以后的应用. 二.详解 1.Qt结构 int ma ...
- Qt浅谈之二十App自动重启及关闭子窗口(六种方法)
一.简介 最近因项目需求,Qt程序一旦检测到错误,要重新启动,自己是每次关闭主窗口的所有子窗口但有些模态框会出现问题,因此从网上总结了一些知识点,以备以后的应用. 二.详解 1.Qt结构 int ma ...
- 浅谈Struts2(二)
一.struts2的跳转 1.action跳转JSP a.默认为forward <action name="action1" class="com.liquidxu ...
- 浅谈JSP(二)
一.EL表达式 作用:从作用域(pageContext,request,session,application)中取值,并显示在页面中. 本质:用于替换输出脚本(<%= %>). 1.从作 ...
随机推荐
- poj2636---Electrical Outlets(插线板)
#include <stdio.h> #include <stdlib.h> int main() { int n,nc,i; scanf("%d",&am ...
- poj2196---Specialized Four-Digit Numbers
#include <stdio.h> #include <stdlib.h> int main() { int i,sum,sumOfH,sumOfd,tmp1,tmp2,tm ...
- NET-A-PORTER为何难以模仿?_全文显示_生活福布斯中文网
NET-A-PORTER为何难以模仿?_全文显示_生活福布斯中文网 NET-A-PORTER为何难以模仿?
- 桂林电子科技大学出校流量控制器Android版1.0.0
每次玩游戏的时候,总是要开着电脑挂着出校控制器,真是浪费国家资源啊,,, 突然想起学校有个开放流量的网页,无奈UC等浏览器真是尝试优化js脚本啊,挂在后台,不到几分钟就掉线了,悲剧啊~~~ 还好And ...
- MyDatePicker拆分日期显示到不同TextBox
如图所示效果:年—月—日 时—分—秒 <tr> <td align="center" style="background- ...
- CSS中的 REM PX EM
px像素(Pixel).相对长度单位.像素px是相对于显示器屏幕分辨率而言的 em是相对长度单位.相对于当前对象内文本的字体尺寸.如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸. ...
- 使用window.postMessage实现跨域通信
JavaScript由于同源策略的限制,跨域通信一直是棘手的问题.当然解决方案也有很多: document.domain+iframe的设置,应用于主域相同而子域不同: 利用iframe和locati ...
- SQL server 2008无法连接Local服务器的解决办法
SQL的有些服务总是在关机的时候自动关闭,然后你可以打开 控制面板——管理工具——服务,然后找到SQL相关的服务,右键——属性,里面有设置,可以设成自动启动
- (转)ios限制控制器旋转
iOS屏幕旋转控制 iOS屏幕旋转控制(iOS6之后) iOS6之前,子控制器只要覆盖父类的shouldAutorotateToInterfaceOrientation:方法就能单独控制某 ...
- linq中的cast<T>()及OfType<T>()
DataTable dt=...........//获取从数据库中取出的数据(假设只有一条记录) //Cast<T>()用来将非泛型的序列转换为泛型的序列 DataRow row=dt.R ...