我的应用程序只是创建一个 EntityManager,然后我故意抛出一个 RuntimeException。如果我在创建实体管理器之前放置 RuntimeException 行,则 main 会正确捕获异常,并且应用程序将关闭(如预期)。但是,如果此后发生任何异常,异常将被捕获(我可以看到堆栈跟踪),但应用程序继续运行,我必须杀死它。在 Netbeans 中,线程的状态是“僵尸”。
使用的库
我的测试课
package test;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class Main {
public static void main(String[] args) {
// throw an exception here, app closes as expected
EntityManagerFactory factory = Persistence.createEntityManagerFactory("pu");
EntityManager em = factory.createEntityManager();
// throw an exception here, it runs forever
throw new RuntimeException();
}
}
持久性.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="pu" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect"/>
<property name="javax.persistence.jdbc.driver" value="net.sourceforge.jtds.jdbc.Driver"/>
<property name="javax.persistence.jdbc.user" value="user"/>
<property name="javax.persistence.jdbc.password" value="password"/>
<property name="javax.persistence.jdbc.url" value="jdbc:jtds:sqlserver://server:1433/database"/>
</properties>
</persistence-unit>
</persistence>
最佳答案
任何EntityManagerFactory都可以获取需要适当清理的关键资源;在您的示例中,它可能是管理连接的线程。 您必须确保工厂关闭:通常框架会负责正确关闭,但如果您自己管理资源,则必须将下一个 block 包含在 finally block 中。
EntityManagerFactory factory = Persistence.createEntityManagerFactory("pu");
try {
// rest of your application here
}
finally {
factory.close();
}
关于java - hibernate :应用程序在崩溃后不会关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21943526/