利用Thread-Specific Storage撰寫一個HibernateUtil

本文介绍了 HibernateSessionUtil 类的功能及使用方法,包括获取线程安全的 Session、开始和提交事务、回滚事务以及关闭 Session 的过程。通过示例展示了如何在实际应用中使用这些方法来确保数据库操作的一致性和安全性。

 

HibernateSessionUtil.java

import java.io.Serializable;

import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.Transaction;

public class HibernateSessionUtil implements Serializable
{
    
public static final ThreadLocal tLocalsess = new ThreadLocal();

    
public static final ThreadLocal tLocaltx = new ThreadLocal();

    
/*
     * getting the thread-safe session for using
     
*/

    
public static Session currentSession(){
        Session session 
= (Session) tLocalsess.get();

        
//open a new one, if none can be found.
        try{
            
if (session == null){
                session 
= openSession();
                tLocalsess.set(session);
            }

        }
catch (HibernateException e){
            
throw new InfrastructureException(e);
        }

        
return session;
    }


    
/*
     * closing the thread-safe session
     
*/

    
public static void closeSession(){

        Session session 
= (Session) tLocalsess.get();
        tLocalsess.set(
null);
        
try{
            
if (session != null && session.isOpen()){
                session.close();
            }


        }
catch (HibernateException e){
            
throw new InfrastructureException(e);
        }

    }


    
/*
     * begin the transaction
     
*/

    
public static void beginTransaction(){
        Transaction tx 
= (Transaction) tLocaltx.get();
        
try{
            
if (tx == null){
                tx 
= currentSession().beginTransaction();
                tLocaltx.set(tx);
            }

        }
catch (HibernateException e){
            
throw new InfrastructureException(e);
        }

    }


    
/*
     * close the transaction
     
*/

    
public static void commitTransaction(){
        Transaction tx 
= (Transaction) tLocaltx.get();
        
try{
            
if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack())
                tx.commit();
            tLocaltx.set(
null);
        }
catch (HibernateException e){
            
throw new InfrastructureException(e);
        }

    }


    
/*
     * for rollbacking
     
*/

    
public static void rollbackTransaction(){
        Transaction tx 
= (Transaction) tLocaltx.get();
        
try{
            tLocaltx.set(
null);
            
if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()){
                tx.rollback();
            }

        }
catch (HibernateException e){
            
throw new InfrastructureException(e);
        }

    }


    
private static Session openSession() throws HibernateException{
        
return getSessionFactory().openSession();
    }


    
private static SessionFactory getSessionFactory() throws HibernateException{
        
return SingletonSessionFactory.getInstance();
    }

}



filter中的程式碼如下HibernateSessionCloser.java
public class HibernateSessionCloser implements Filter{

    
protected FilterConfig filterConfig = null;

    
public void init(FilterConfig filterConfig)throws ServletException{
    
this.filterConfig = filterConfig;
    }

    
    
public void destroy(){
        
this.filterConfig = null;
    }
    

    
public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain)
    
throws IOException, ServletException {
        
try{
            chain.doFilter(request, response);
        }

        
finally{
            
try{
                HibernateSessionUtil.commitTransaction();
            }
catch (InfrastructureException e){
                HibernateSessionUtil.rollbackTransaction();
            }
finally{
                HibernateSessionUtil.closeSession();
            }
   
        }


    }

}


然後在操作資料庫之前加上
HibernateSessionUtil.beginTransaction();
HibernateSessionUtil.currentSession();
//取得Session
传送带损坏与对象检测数据集 一、基础信息 • 数据集名称:传送带损坏与对象检测数据集 • 图片数量: 训练集:645张图片 验证集:185张图片 测试集:92张图片 总计:922张工业监控图片 • 训练集:645张图片 • 验证集:185张图片 • 测试集:92张图片 • 总计:922张工业监控图片 • 分类类别: Hole(孔洞):传送带表面的孔洞损坏。 Human(人类):工作区域中的人类,用于安全监控。 Other Objects(其他对象):非预期对象,可能引起故障。 Puncture(刺穿):传送带被刺穿的损坏。 Roller(滚筒):传送带滚筒部件。 Tear(撕裂):传送带撕裂损坏。 impact damage(冲击损坏):由于冲击导致的损坏。 patch work(修补工作):已修补的区域。 • Hole(孔洞):传送带表面的孔洞损坏。 • Human(人类):工作区域中的人类,用于安全监控。 • Other Objects(其他对象):非预期对象,可能引起故障。 • Puncture(刺穿):传送带被刺穿的损坏。 • Roller(滚筒):传送带滚筒部件。 • Tear(撕裂):传送带撕裂损坏。 • impact damage(冲击损坏):由于冲击导致的损坏。 • patch work(修补工作):已修补的区域。 • 标注格式:YOLO格式,包含边界框和类别标签,适用于目标检测任务。 • 数据格式:图像数据来源于工业监控系统,适用于计算机视觉分析。 二、适用场景 • 工业自动化检测系统开发:用于构建自动检测传送带损坏和异物的AI模型,实现实时监控和预防性维护,减少停机时间。 • 安全监控应用:识别人类和其他对象,提升工业环境的安全性,避免事故和人员伤害。 • 学术研究与创新:支持计算机视觉在制造业、物流和自动化领域的应用研究,促进AI技术与工业实践的融合。 • 教育与培训:可用于培训AI模型或作为工业工程和自动化教育的案例数据,帮助学习者理解实际应用场景。 三、数据集优势 • 多样化的类别覆盖:包含8个关键类别,涵盖多种损坏类型和对象,确保模型能够处理各种实际工业场景,提升泛化能力。 • 精准的标注质量:采用YOLO格式,边界框标注准确,由专业标注人员完成,保证数据可靠性和模型训练效果。 • 强大的任务适配性:兼容主流深度学习框架(如YOLO、TensorFlow、PyTorch),可直接用于目标检测任务,并支持扩展至其他视觉任务需求。 • 突出的工业价值:专注于工业传送带系统的实际需求,帮助提升生产效率、降低维护成本,并增强工作场所安全,具有较高的实际应用价值。
一、基础信息 • 数据集名称:垃圾废弃物目标检测数据集 • 图片数量: 训练集:1124张图片 验证集:375张图片 总计:1499张图片 • 训练集:1124张图片 • 验证集:375张图片 • 总计:1499张图片 • 分类类别:包含60多个垃圾和废弃物类别,如气溶胶、铝泡罩包装、电池、破碎玻璃、卡片泡罩包装、香烟、透明塑料瓶、瓦楞纸箱、薯片袋、一次性食品容器、一次性塑料杯、饮料罐、饮料纸盒、鸡蛋盒、泡沫杯、泡沫食品容器、食品罐、食物垃圾、垃圾袋、玻璃瓶、玻璃杯、玻璃罐、杂志纸、餐盒、金属瓶盖、金属盖、普通纸、其他纸箱、其他塑料、其他塑料瓶、其他塑料容器、其他塑料杯、其他塑料包装、纸袋、纸杯、纸吸管、披萨盒、塑料瓶盖、塑料薄膜、塑料手套、塑料盖、塑料吸管、塑料餐具、聚丙烯袋、拉环、绳子、废金属、鞋子、一次性购物袋、六罐环、涂抹管、可挤压管、泡沫塑料片、纸巾、厕纸管、特百惠、未标记垃圾、包装纸等。 • 标注格式:YOLO格式,包含边界框和类别标签,适用于目标检测任务。 • 数据格式:图片来源于实际场景,细节清晰。 二、适用场景 • 垃圾自动分类系统开发:数据集支持目标检测任务,帮助构建能够自动识别和分类垃圾物品的AI模型,用于智能垃圾桶或回收系统,提升废弃物管理效率。 • 环保应用研发:集成至环保和废弃物管理应用,提供实时垃圾识别功能,促进回收和环境保护,支持可持续发展倡议。 • 学术研究与创新:支持计算机视觉与环保领域的交叉研究,助力发表垃圾识别和AI技术相关学术论文,推动技术创新。 • 教育与培训:可用于学校或培训机构,作为垃圾分类和AI目标检测教学的重要资源,培养环保意识和技术能力。 三、数据集优势 • 精准标注与多样性:每张图片经过准确标注,确保边界框定位精确;包含多种垃圾类别,覆盖常见废弃物,提升模型的泛化能力和鲁棒性。 • 任务适配性强:标注兼容主流深度学习框架(如YOLO等),可直接用于目标检测任务,并支持扩展到其他视觉任务,如分类或分割。 • 实际应用价值:专注于垃圾识别,为环保、废弃物管理和回收提供重要数据支撑,有助于减少污染和促进循环经济。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值