Java 调用EntityManager.find()后MySQL中挂起的进程

Java 调用EntityManager.find()后MySQL中挂起的进程,java,mysql,hibernate,jpa,hikaricp,Java,Mysql,Hibernate,Jpa,Hikaricp,我写了一个DAL,它抽象了对MySQL数据库数据的访问,我在MySQL中运行的进程面临着一个恼人的问题 我有一个用户实体(目标是用户DB表)和这个UserDAO public class UserDAO { @PersistenceContext private EntityManager entityManager; public User create(User user) { ... } public void delete(S

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

我有一个
用户
实体
(目标是
用户
DB表)和这个
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(或Hibernate)错误还是EntityManager类的错误使用


谢谢

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

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


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

Hi@brettw,感谢您的回复。发生了两件奇怪的事情:1)我将HikariCP版本从1.3.8更改为1.3.9。运行测试将抛出此异常堆栈。似乎Hikari在设置最小池大小时遇到问题2)我重新尝试使用Hikari 1.3.8版本。现在,进程的问题不再出现了!我不知道该说什么;这个问题没有采取任何措施就解决了。
minimumPoolSize
在1.3.3中被弃用,在1.3.9中被删除。改用
minimumIdle
。1.3.8中的问题是对时间敏感的,因此您可能不会总是看到它。我建议升级到1.3.9并将
minimumPoolSize
更改为
minimumIdle
。我已经完成了您所说的更改(因此现在我使用的是1.3.9版本,并将
minimumPoolSize
更改为
minimumIdle
)。现在我在persistence.xml文件中运行测试时遇到了一个奇怪的错误,如果切换两个参数的顺序,错误是否会持续?我推出了一个版本(1.4.0),将边界检查推迟到所有参数都设置好之后。从这条评论开始大约需要3个小时,它才会出现在maven central repository.Ok中。1.4.0应纠正此问题。同时(接下来的2-3小时),只需注释掉
minimumIdle