我的应用程序只是创建一个EntityManager,之后我会故意抛出一个RuntimeException。如果我在创建实体管理器之前放置RuntimeException行,则main会正确捕获异常并关闭应用程序(如预期的那样)。但是如果在此之后发生任何异常,则会捕获异常(我可以看到堆栈跟踪)但应用程序仍在运行,我必须将其杀死。在Netbeans中,线程的状态是" zombie"。
使用了库
我的考试班
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();
}
}
的persistence.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>
答案 0 :(得分:2)
任何 EntityManagerFactory 都可以获取需要正确清理的关键资源;在您的示例中,它可能是管理连接的线程。 您必须确保工厂已关闭:通常框架负责正常关闭,但如果您自己管理资源,则必须将下一个块包含在 finally 块中。
EntityManagerFactory factory = Persistence.createEntityManagerFactory("pu");
try {
// rest of your application here
}
finally {
factory.close();
}
答案 1 :(得分:0)
您是否故意关闭申请?我不确定我是否按照你在这里尝试做的事情。
如果你要做的就是停止申请,你可以打电话,
System.exit(0)
表示程序执行成功,或传递其他数字表示失败。