Java SpringMVC-HibernateMySQL
我正在用SpringMVC、Hibernate和数据库MySQL开发一个应用程序 控制器处理请求和响应。Hibernate处理数据库事务 我的问题是,当一个或两个访问该服务时,它可以正常工作,但在一段时间内可以正常工作,但在这之后,我经常会收到错误并锁定超时Java SpringMVC-HibernateMySQL,java,mysql,spring,hibernate,spring-mvc,Java,Mysql,Spring,Hibernate,Spring Mvc,我正在用SpringMVC、Hibernate和数据库MySQL开发一个应用程序 控制器处理请求和响应。Hibernate处理数据库事务 我的问题是,当一个或两个访问该服务时,它可以正常工作,但在一段时间内可以正常工作,但在这之后,我经常会收到错误并锁定超时 //My sample Controller code @RequestMapping(value = "Bank", method = RequestMethod.GET) public ResponseEntity<L
//My sample Controller code
@RequestMapping(value = "Bank", method = RequestMethod.GET)
public ResponseEntity<List<Bank>> getAllBank(@RequestHeader int data) {
try {
//My DAO implementation class for bank table
bankdao = new BankDAOImpl();
List<Bank> bank = bankdao.getAllBank(data);
return new ResponseEntity<List<Bank>>(bank, HttpStatus.OK);
} catch (HibernateException he) {
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
} catch (Exception e) {
e.printStackTrace();
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
//My DAO implementation code
public List<Bank> getAllBank(int organizationId) throws HibernateException {
//I'm opening session in every function
Session session = SessionFactoryUtil.getSessionFactory().openSession();
try {
session.beginTransaction();
Criteria criteria = session.createCriteria(Bank.class);
criteria.add(Restrictions.eq("organizationId", organizationId));
criteria.add(Restrictions.eq("deleteFlag", false));
criteria.addOrder(Order.asc("bankName"));
List<Bank> ls=criteria.list();
return ls;
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
session.getTransaction().commit();
session.close();
}
//我的示例控制器代码
@RequestMapping(value=“Bank”,method=RequestMethod.GET)
公共响应属性getAllBank(@RequestHeader int data){
试一试{
//银行表的我的DAO实现类
bankdao=新的BankDAOImpl();
List bank=bankdao.getAllBank(数据);
返回新的响应状态(bank,HttpStatus.OK);
}捕获(冬眠异常he){
返回新的响应属性(HttpStatus.INTERNAL_SERVER_ERROR);
}捕获(例外e){
e、 printStackTrace();
返回新的响应属性(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
//我的DAO实现代码
公共列表getAllBank(int organizationId)引发HibernateeException{
//我在每一个活动中都会主持开幕式
Session Session=SessionFactoryUtil.getSessionFactory().openSession();
试一试{
session.beginTransaction();
条件=session.createCriteria(Bank.class);
添加(Restrictions.eq(“organizationId”,organizationId));
添加(Restrictions.eq(“deleteFlag”,false));
标准.addOrder(Order.asc(“银行名称”));
List ls=标准。List();
返回ls;
}捕获(例外e){
e、 printStackTrace();
返回null;
}最后{
session.getTransaction().commit();
session.close();
}
导致问题的会话
如果我为所有函数创建单独的会话工厂,而不是打开会话
它能解决我的问题吗?您不应该为每个方法创建单独的会话工厂。只需打开一个会话。可能是您处理事务的方式不正确。您应该这样做
public List<Bank> getAllBank(int organizationId) throws HibernateException {
//I'm opening session in every function
Session session = SessionFactoryUtil.getSessionFactory().openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
Criteria criteria = session.createCriteria(Bank.class);
criteria.add(Restrictions.eq("organizationId", organizationId));
criteria.add(Restrictions.eq("deleteFlag", false));
criteria.addOrder(Order.asc("bankName"));
List<Bank> ls=criteria.list();
tx.commit();// commit here
return ls;
} catch (Exception e) {
e.printStackTrace();
if (tx != null) {
tx.rollback();// rollback here
}
return null;
} finally {
session.close();
}
}
public List getAllBank(int-organizationId)抛出HibernateeException{
//我在每一个活动中都会主持开幕式
Session Session=SessionFactoryUtil.getSessionFactory().openSession();
事务tx=null;
试一试{
tx=session.beginTransaction();
条件=session.createCriteria(Bank.class);
添加(Restrictions.eq(“organizationId”,organizationId));
添加(Restrictions.eq(“deleteFlag”,false));
标准.addOrder(Order.asc(“银行名称”));
List ls=标准。List();
tx.commit();//在此处提交
返回ls;
}捕获(例外e){
e、 printStackTrace();
如果(tx!=null){
tx.rollback();//在此处回滚
}
返回null;
}最后{
session.close();
}
}
可能是您的
SessionFactoryUtil
有问题。查看它会很有趣。尝试使用@Autowired BankDAOImpl BankDAOImpl,而不是创建新实例您是否可以粘贴锁超时异常的实际堆栈跟踪?此外,您是否在未发布的代码中的其他地方或通过任何其他方法执行更新ns(例如,在mysql数据库客户端中)?您是否有对dao方法的嵌套调用?当一个dao方法调用另一个dao方法时?如何配置hibernate数据源?@Ben Rowland同时会有许多用户插入、更新、,delete@user1516873是的,在某些函数中,SessionFactoryUtil是一个类,其中我将sessionFactory配置绑定到该cfg文件并构建session@Sreema我明白了。我希望您只构建一次会话工厂。是的,但在所有函数中都会打开会话。我发现了一种可能性,可以使用hibernatecp3 jar来增加连接池,这有助于提高性能@v.ladynev