gpt4 book ai didi

java - 调用 EntityManager.find() 后 MySQL 中的待处理进程

转载 作者:行者123 更新时间:2023-11-29 03:00:40 25 4
gpt4 key购买 nike

我写了一个 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;

我得到以下输出

enter image description here

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

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

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

谢谢

最佳答案

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

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

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

关于java - 调用 EntityManager.find() 后 MySQL 中的待处理进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24180898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com