问题描述
不使用Spring。我有一个RootDao的父类,里面有一个执行HQL语句的方法RootDao代码片段://通过传入的HQL查询语句,返回Listpublic 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()方法获取Listpublic class UserDao extends RootDao{ //查询username等于传入的值的List public List<User> getUserList(String username){ List<User> userlist = new ArrayList<User>(); 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()会不会对别的产生影响?
解决方案
1。Dao是对数据库中数据进行CRUD操作的,如果传入的username没有进行写操作,那么是没有问题的,因为Dao层是针对数据库的操作,所以任何有关数据库操作以外的操作都不要在Dao层中做。2。如果这个操作HibernateSessionFactory.getSession()返回的是原型,那么是没有影响的,但是如果返回的是单例,那你就需要认真考虑下了,因为这样会影响到多次操作,当你第一次执行这个方法时,没有问题,但当你第二次执行时,因为第一次执行时,Session已经关闭,再次操作会发生错误。
解决方案二:
HibernateSessionFactory.getSession()是新建一个SESSION,SESSION后面关不关闭跟单例没关系。
解决方案三:
没问题的。