调用EntityManager.find()后,在MySQL中挂起进程

时间:2014-06-12 09:27:16

标签: java mysql hibernate jpa hikaricp

我编写了一个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类的错误用法?

谢谢

1 个答案:

答案 0 :(得分:1)

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

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

如果你没有打电话给close()shutdown(),那就是问题,但我们当然总是建议运行最新版本的HikariCP。