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