ThreadLocal封装connection--隔离了相关资源,防止线程安全问题
来源:互联网 发布:工商银行博士后 知乎 编辑:程序博客网 时间:2024/05/17 03:33
package com.qdsx.drp.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
publicclass ConnectionManager {
//ThreadLocal
privatestatic ThreadLocal<Connection>connectionHolder =new ThreadLocal<Connection>();
/**
* 得到Connection
* @return
*/
publicstatic Connection getConnection(){
//ThreadLocal
Connection conn = connectionHolder.get();
//ThreadLocal,如果在当前线程中没有绑定相应的Connection
if(conn ==null){
//取得jdbc配置信息
try {
JdbcInfo jdbcInfo = ConfigReader.getInstance().getJdbcInfo();
Class.forName(jdbcInfo.getDriverName()).newInstance();
conn = DriverManager.getConnection(jdbcInfo.getUrl(), jdbcInfo.getUsername(), jdbcInfo.getPassword());
//ThreadLocal,将Connection设置(set)到线程变量(connectionHolder)中
connectionHolder.set(conn);
} catch (InstantiationException e) {
e.printStackTrace();
thrownew ApplicationException("系统错误,请联系系统管理员,qq:472989050");
} catch (IllegalAccessException e) {
e.printStackTrace();
thrownew ApplicationException("系统错误,请联系系统管理员,qq:472989050");
} catch (ClassNotFoundException e) {
e.printStackTrace();
thrownew ApplicationException("系统错误,请联系系统管理员,qq:472989050");
} catch (SQLException e) {
e.printStackTrace();
thrownew ApplicationException("系统错误,请联系系统管理员,qq:472989050");
}
}
return conn;
}
publicstaticvoid closeConnection(){
Connection conn = connectionHolder.get();
if(conn !=null){
try {
conn.close();
//从ThreadLocal中清除Connection(如果不清楚,下次拿到的还是已经close的Connection,用不了)
connectionHolder.remove();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//以下是事务处理的封装
publicstaticvoid beginTransaction(Connection conn) {
try {
if(conn !=null){
if(conn.getAutoCommit()){
conn.setAutoCommit(false);//手动提交
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
publicstaticvoid commitTransaction(Connection conn) {
try {
if(conn !=null){
if(!conn.getAutoCommit()){
conn.commit();
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
publicstaticvoid rollbackTransaction(Connection conn) {
try {
if (conn !=null) {
if(!conn.getAutoCommit()){
conn.rollback();
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
publicstaticvoid resetConnection(Connection conn) {
try {
if(conn !=null){
if(conn.getAutoCommit()){
conn.setAutoCommit(false);
}else{
conn.setAutoCommit(true);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
publicstaticvoid setAutoCommit(Connection conn,boolean autoCommit) {
if (conn !=null) {
try {
conn.setAutoCommit(autoCommit);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
publicvoid addFlowCard(FlowCard flowCard)throws ApplicationException {
Connection conn = null;
try {
//取得
conn = ConnectionManager.getConnection();
//开启事务
ConnectionManager.beginTransaction(conn);
//生成流向单单号
String flowCardVouNo = flowCardDao.generateVouNo();
//添加流向单主信息
flowCardDao.addFlowCardMaster(flowCardVouNo, flowCard);
//添加流向单明细信息
flowCardDao.addFlowCardDetail(flowCardVouNo, flowCard.getFlowCardDetailList());
//提交事务
ConnectionManager.commitTransaction(conn);
} catch (DaoException e) {
//异常,回滚事务
ConnectionManager.rollbackTransaction(conn);
e.printStackTrace();
thrownew ApplicationException("添加流向单失败!");
}finally{
//关闭Connection,并从ThreadLocal中清除Connection
ConnectionManager.closeConnection();
}
}
在dao层使用:
public StringgenerateVouNo() throws DaoException {
Connection conn = ConnectionManager.getConnection();
returnnull;
}
publicvoid addFlowCardMaster(String flowCardVouNo, FlowCard flowCard)
throws DaoException {
Connection conn = ConnectionManager.getConnection();
}
publicvoid addFlowCardDetail(String flowCardVouNo,
List<FlowCardDetail> flowCardDetailList) throws DaoException {
Connection conn = ConnectionManager.getConnection();
}
- ThreadLocal封装connection--隔离了相关资源,防止线程安全问题
- ThreadLocal防止并发线程安全 线程隔离-ThreadLocalMap
- 【java项目实战】ThreadLocal封装Connection,实现同一线程共享资源
- 【java项目实战】ThreadLocal封装Connection,实现同一线程共享资源
- ThreadLocal实现线程隔离
- ThreadLocal线程隔离
- Java ThreadLocal解决线程安全问题
- ThreadLocal解决SimpleDateFormat线程安全问题
- ThreadLocal封装Connection--事务统一管理
- ThreadLocal封装Connection--事务统一管理
- ThreadLocal封装Connection--事务统一管理
- ThreadLocal封装Connection--事务统一管理
- ThreadLocal封装Connection--事务统一管理
- 【Java基础】采用ThreadLocal封装Connection控制事务,保证线程安全
- 【java项目实战】ThreadLocal封装Connection,实现同一线程共享资源 synchronized
- servlet线程安全问题——ThreadLocal模式
- Spring使用ThreadLocal解决线程安全问题
- java-ThreadLocal是解决线程安全问题
- 让Ubuntu和Android同时运行(Ubuntu on Android)
- QQ屏幕坐标获取器
- SVN服务器安装
- 记录服务器登录用户的历史命令
- android4.0编译 error: ‘ptrdiff_t’ does not name a type
- ThreadLocal封装connection--隔离了相关资源,防止线程安全问题
- AVPlayerLayer
- 安卓巴士Android开发神贴整理
- Excel 宏 VBA
- Oracle根据表名获得其主键的字段名
- Android 反编译apk
- 最少硬币问题
- Android开发网上的一些重要知识点
- asp.net页面指定控件导出为Word 或excel 文档