最近遇到这么一个问题:前台按钮发送AJax请求到后台,后台是SSH框架。每点击一下按钮就发送一次请求。 点击数次(7次)过后,页面无ajax响应。 在排除前台因素之后,找
到后台代码。写一个Test类。
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
TestDao testDao = (TestDao)context.getBean("testDaoImpl");
for (int i = 0; i < 10; i++) {
TestDao testdao = (TestDao)context.getBean("testDaoImpl");
List<Test> test = testdao.getTestsByVehicleType(1);
System.out.println(i);
}
控制台输出到7也停止了。
网上也有个别帖子求助说"spring 调用bean次数的问题"。
其实罪魁祸首是在DAO注入sessionFactory后,在DAO方法里面sessionFactory.openSession() 。
虽然spring声明式的事务会自动帮你commit,但是openSession()产生的session并不会由于commit而自动关闭,而你多次打开新的session,结果session过多造成这个假死的现象。
我的解决办法是DAO方法里改为sessionFactory.getCurrentSession()。该方法产生的session会在commit的时候自动close()这点我们在hibernate的时候已经学过了;或者使用HibernateTemplate的方法。
不过在假如不是在B/S的情况下,即在Main测试getCurrentSession()是不成功的。 因为SessionFactory是注入进来的,getCurrentSession()不在事务范围之内。
到后台代码。写一个Test类。
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
TestDao testDao = (TestDao)context.getBean("testDaoImpl");
for (int i = 0; i < 10; i++) {
TestDao testdao = (TestDao)context.getBean("testDaoImpl");
List<Test> test = testdao.getTestsByVehicleType(1);
System.out.println(i);
}
控制台输出到7也停止了。
网上也有个别帖子求助说"spring 调用bean次数的问题"。
其实罪魁祸首是在DAO注入sessionFactory后,在DAO方法里面sessionFactory.openSession() 。
虽然spring声明式的事务会自动帮你commit,但是openSession()产生的session并不会由于commit而自动关闭,而你多次打开新的session,结果session过多造成这个假死的现象。
我的解决办法是DAO方法里改为sessionFactory.getCurrentSession()。该方法产生的session会在commit的时候自动close()这点我们在hibernate的时候已经学过了;或者使用HibernateTemplate的方法。
不过在假如不是在B/S的情况下,即在Main测试getCurrentSession()是不成功的。 因为SessionFactory是注入进来的,getCurrentSession()不在事务范围之内。