Hibernate简易BaseDao演示单例模式和线程池
2014-02-28 17:05
337 查看
package com.dao; import java.util.List; import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration; import com.IConst.IConst; public class BaseDao { private static Configuration cf; private static SessionFactory sf; /* 实例化线程池 */ private ThreadLocal<Session> thread = new ThreadLocal<Session>(); static { init(); } /* * 单例模式 * */ private static synchronized void init() { try { if (null == cf || null == sf) { cf = new Configuration().configure(); sf = cf.buildSessionFactory(); } } catch (HibernateException e) { e.printStackTrace(); } } /* * open方法 * */ private void open() throws Exception { /* 先从线程池中取 */ Session session = thread.get(); /* 取不到,利用工厂新建 */ if (null == session) { session = sf.openSession(); /* 将新建的session放入线程池 */ thread.set(session); } } /* * close方法 * */ private void close() { try { /* 从线程池中取 */ Session session = thread.get(); /* 取到,关闭 */ if (null != session) { session.close(); /* 清空线程池 */ thread.set(null); } } catch (HibernateException e) { e.printStackTrace(); } } /* * 执行增\删\改 * */ public boolean update(Object obj, int type) { Session session = null; Transaction tran = null; try { open(); /* 取出session */ session = thread.get(); /* 打开事务 */ tran = session.beginTransaction(); switch (type) { case IConst.DELETE: session.delete(obj); break; case IConst.INSERT: session.save(obj); break; case IConst.UPDATE: session.update(obj); break; } /* Hibernate的事务机制是先将其保存在缓存中 */ /* 只有commit以后,才将事务提交 */ /* 提交事务 */ tran.commit(); return true; } catch (Exception e) { if (null != tran) { tran.rollback(); } e.printStackTrace(); } finally { close(); } return false; } /* * 查询方法 * */ public List select(String sql) { Session session = null; try { open(); session = thread.get(); return session.createQuery(sql).list(); } catch (Exception e) { e.printStackTrace(); } finally { close(); } return null; }}
相关文章推荐
- Project pages
- undo表空间管理测试1-----手动修改undo_management
- 使用报表控件NCReport集成NCReport到Qt应用程序
- 图论:回路判断和拓扑排序(DFS)
- 年月日级联js
- Ubuntu root登陆
- 重定向问题
- C#多线程学习(一) 多线程的相关概念
- IOS外部变量(Extern)的用法
- slim错误"failed to execute login command"
- MySQL 存储过程 触发器 函数 入门
- Loading Resources In The Background With A Loading Screen
- Java java.lang.NoClassDefFoundError 的解决办法
- java creat ios progress
- DSC配置
- .net基础问题
- apache+tomcat+mod_jk整合
- C#学习笔记(5)
- iOS6兼容iOS7界面(界面上移,navigationbar 颜色)
- C++ 折半查找