l932 2011-09-18 20:39
浏览 195
已采纳

Hibernate3里面的Dao层是否可以用单例?

不使用Spring。

我有一个RootDao的父类,里面有一个执行HQL语句的方法

RootDao代码片段:
//通过传入的HQL查询语句,返回List
public List getList(String hql) {
//创建session
Session session = HibernateSessionFactory.getSession();
List list = new ArrayList();
Query query = null;
try {
//执行传入的hql语句。from User之类
query = session.createQuery(hql);
list = query.list();
//关闭session
session.close();
} catch (HibernateException he) {
logger.error(he);
} finally {
try {
if (session != null && session.isOpen()) {
session.close();
}
} catch (Exception e) {
logger.error(e);
}
}
return list;
}

有一个UserDao,继承了RootDao,有一个getUserList()方法,拼一个HQL语句,使用父类的getList()方法获取List
public class UserDao extends RootDao{
//查询username等于传入的值的List
public List getUserList(String username){
List userlist = new ArrayList();
userlist = this.getList("from User where username = '"+username+"'");
retrun userlist;
}
}

一般来说service层new一个UserDao即可调用getUserList("admin")方法
即UserDao udao = new UserDao();
udao.getUserList("admin");
后来一个朋友说UserDao可以写成单例
udao用getInstance()方式来获取,保证UserDao只有一个实例

问题:
1、UserDao用单例,调用比较频繁的时候,会不会对传入的username产生影响?
2、调用频繁的时候,RootDao的getList方法里的session.close()会不会对别的产生影响?

  • 写回答

3条回答 默认 最新

  • DreamZhong 2011-09-19 09:17
    关注

    1。Dao是对数据库中数据进行CRUD操作的,如果传入的username没有进行写操作,那么是没有问题的,因为Dao层是针对数据库的操作,所以任何有关数据库操作以外的操作都不要在Dao层中做。
    2。如果这个操作HibernateSessionFactory.getSession()返回的是原型,那么是没有影响的,但是如果返回的是单例,那你就需要认真考虑下了,因为这样会影响到多次操作,当你第一次执行这个方法时,没有问题,但当你第二次执行时,因为第一次执行时,Session已经关闭,再次操作会发生错误。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 luckysheet
  • ¥25 关于##爬虫##的问题,如何解决?:
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型
  • ¥50 buildozer打包kivy app失败
  • ¥30 在vs2022里运行python代码
  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题