我编写了一个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类的错误用法?
谢谢
答案 0 :(得分:1)
可能是HikariCP,我们修复了1.3.9(本周发布)关机时连接清理的一些问题。如果你还没有升级,你应该进行升级。
你 正在呼叫HikariDataSource.close()
或HikariDataSource.shutdown()
,对吗?如果您在容器中运行,则可以将容器配置为在其 destroy 配置中调用其中一种方法。如果你不关闭池,它确实会放弃连接(任何池都会)。
如果你没有打电话给close()
或shutdown()
,那就是问题,但我们当然总是建议运行最新版本的HikariCP。