2

我写了一个 DAL,它抽象了对 MySQL 数据库数据的访问,我正面临着一个在 MySQL 中运行的进程的恼人问题。

我有一个User Entity(针对User数据库表)和这个UserDAO

public class UserDAO {

    @PersistenceContext private EntityManager entityManager;

    public User create(User user)
    {
        ...
    }

    public void delete(String username)
    {
        ...
    }

    public User findByUsername(String username)
    {
        User user = entityManager.find(User, username);

        return user;
    }

    public User update(User user) {
        ...
    }

}

然后这是我正在运行的测试:

@RunWith(CdiRunner.class)
@AdditionalClasses(EntityManagerProvider.class)
public class DALUserTest {

    @Inject UserDAO userDAO;

    @Test
    public void testGetUser() {

        User user = userDAO.findByUsername("myUsername");

        assertNotNull(user);
    }
}

测试运行正常。问题是,如果我去 MySQL 控制台并运行命令

show processlist;

我得到以下输出

在此处输入图像描述

正如你所看到的,测试执行(当然是在它终止之后)在 MySQL 的后台留下了一个挂起的进程,它会一直留在那里直到有人杀死它。此外,每当我运行测试时,它都会添加越来越多的待处理进程。

更多信息:我persistence.xml用来配置连接。Hibernate 用作 JPA 的实现,HikariCP用作连接池提供者。

你怎么看这个问题?会不会是 HikariCP(或 Hibernate)错误或 EntityManager 类的错误使用?

谢谢

4

1 回答 1

1

可能是 HikariCP,我们在 1.3.9(本周发布)中修复了关闭时连接清理的一些问题。如果您尚未升级,则应该升级。

打电话HikariDataSource.close()HikariDataSource.shutdown()对吗?如果您在容器中运行,则可以将容器配置为在其销毁配置中调用这些方法之一。如果您不关闭池,它确实会放弃连接(任何池都会)。

如果您没有调用close()or shutdown(),那将是问题所在,但我们当然始终建议在最新版本的 HikariCP 上运行。

于 2014-06-12T12:41:29.957 回答