Java getCurrentSession正在为每个调用创建新连接
我是spring和hibernate的新手,一切都正常,但我检查了getCurrentSession的每次调用,mysql中都创建了一个处于睡眠状态的新连接线程。据我所知,这对于数据库来说不是一个好的实践。为什么getCurrentSession每次都要创建新的连接线程。 我的密码是- application-context.xml 实体类-用户 控制器类-AccountController MySql连接状态快照为-Java getCurrentSession正在为每个调用创建新连接,java,mysql,spring,hibernate,Java,Mysql,Spring,Hibernate,我是spring和hibernate的新手,一切都正常,但我检查了getCurrentSession的每次调用,mysql中都创建了一个处于睡眠状态的新连接线程。据我所知,这对于数据库来说不是一个好的实践。为什么getCurrentSession每次都要创建新的连接线程。 我的密码是- application-context.xml 实体类-用户 控制器类-AccountController MySql连接状态快照为- 您正在为每个请求创建spring上下文: ApplicationContex
您正在为每个请求创建spring上下文:
ApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
当应用程序在侦听器中启动时,这种情况应该只发生一次
请看这里:
您可能还希望在控制器中注入UserDao。使用部署描述符和以下条目通过侦听器加载上下文 org.springframework.web.context.ContextLoaderListener 您已经定义了组件扫描包,所以您可以在这里使用自动连接,只需将@component注释添加到您的UserDAO,并从服务层删除以下代码
ApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
User user = ((UserDao) context.getBean("userDao"))
使用@Component注释定义DAO类
package com.vc.teacher.db.dao;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import com.vc.teacher.entities.User;
@Component
public class UserDao {
@Autowired
SessionFactory sessionFactory;
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Transactional
public User checkCreditionals(String email, String password){
User user = null;
Session session = sessionFactory.getCurrentSession();
Query query = session.createQuery("from User where email = '"+email+"' and password = '"+password+"'");
List list = query.list();
if(list.size()>0)
user = (User)list.get(0);
return user;
}
@Transactional
public boolean registerUser(User user){
boolean result = false;
Session session = sessionFactory.getCurrentSession();
try{
user.setUserTypeId(2);
session.save(user);
result = true;
} catch (Exception e){
result = false;
e.printStackTrace();
}
return result;
}
}`
现在像这样启动对象-
@Autowired
UserDao userDao;
并调用您的方法-
userDao.checkCreditionals(email, password);
我这样做了,但在构建时它给出了这个错误-没有找到符合依赖项类型[com.vc.teacher.db.dao.UserDao]的合格bean:至少需要1个符合此依赖项autowire候选项条件的bean。依赖项注释:{@org.springframework.beans.factory.annotation.Autowiredrequired=true}确保使用@Component对UserDao类进行注释。。因为我们是隐式定义bean的。我在UserDao类中添加了注释@Component,所以您的问题得到了解决?没有。。。我面临着我在前面的评论中提到的问题,我做到了,但在构建时它给出了这个错误-没有找到符合依赖项类型[com.vc.teacher.db.dao.UserDao]的合格bean:至少需要1个符合此依赖项autowire候选项条件的bean。依赖项批注:{@org.springframework.beans.factory.annotation.Autowiredrequired=True您已经在xml中声明了userDao,所以应该可以使用。也许可以发布更新的解决方案。我已经根据您的答案更改了代码。否则代码的其他部分是相同的。检查此答案:如果您在userDao上使用了@Component,那么请检查包扫描是否正确如果您使用xml,那么它应该可以工作。尝试添加@QualifieruserDao只是为了在注入时进行测试,但是我发现配置或代码没有问题。
ApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
User user = ((UserDao) context.getBean("userDao"))
package com.vc.teacher.db.dao;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import com.vc.teacher.entities.User;
@Component
public class UserDao {
@Autowired
SessionFactory sessionFactory;
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Transactional
public User checkCreditionals(String email, String password){
User user = null;
Session session = sessionFactory.getCurrentSession();
Query query = session.createQuery("from User where email = '"+email+"' and password = '"+password+"'");
List list = query.list();
if(list.size()>0)
user = (User)list.get(0);
return user;
}
@Transactional
public boolean registerUser(User user){
boolean result = false;
Session session = sessionFactory.getCurrentSession();
try{
user.setUserTypeId(2);
session.save(user);
result = true;
} catch (Exception e){
result = false;
e.printStackTrace();
}
return result;
}
}`
@Autowired
UserDao userDao;
userDao.checkCreditionals(email, password);