Java getCurrentSession正在为每个调用创建新连接

Java getCurrentSession正在为每个调用创建新连接,java,mysql,spring,hibernate,Java,Mysql,Spring,Hibernate,我是spring和hibernate的新手,一切都正常,但我检查了getCurrentSession的每次调用,mysql中都创建了一个处于睡眠状态的新连接线程。据我所知,这对于数据库来说不是一个好的实践。为什么getCurrentSession每次都要创建新的连接线程。 我的密码是- application-context.xml 实体类-用户 控制器类-AccountController MySql连接状态快照为- 您正在为每个请求创建spring上下文: ApplicationContex

我是spring和hibernate的新手,一切都正常,但我检查了getCurrentSession的每次调用,mysql中都创建了一个处于睡眠状态的新连接线程。据我所知,这对于数据库来说不是一个好的实践。为什么getCurrentSession每次都要创建新的连接线程。 我的密码是-

application-context.xml

实体类-用户

控制器类-AccountController

MySql连接状态快照为-


您正在为每个请求创建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);