Hibernate:崩溃后app不会关闭

时间:2014-02-21 19:31:30

标签: java hibernate jpa

我的应用程序只是创建一个EntityManager,之后我会故意抛出一个RuntimeException。如果我在创建实体管理器之前放置RuntimeException行,则main会正确捕获异常并关闭应用程序(如预期的那样)。但是如果在此之后发生任何异常,则会捕获异常(我可以看到堆栈跟踪)但应用程序仍在运行,我必须将其杀死。在Netbeans中,线程的状态是" zombie"。

使用了库

  • Hibernate 4.3.1 Final:来自 jpa 文件夹和必需文件夹(link)的所有广告
  • 数据库连接器:jtds 1.3.1(link

我的考试班

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>

2 个答案:

答案 0 :(得分:2)

任何 EntityManagerFactory 都可以获取需要正确清理的关键资源;在您的示例中,它可能是管理连接的线程。 您必须确保工厂已关闭:通常框架负责正常关闭,但如果您自己管理资源,则必须将下一个块包含在 finally 块中。

EntityManagerFactory factory = Persistence.createEntityManagerFactory("pu");
try {
    // rest of your application here
}
finally {
    factory.close();
}

答案 1 :(得分:0)

您是否故意关闭申请?我不确定我是否按照你在这里尝试做的事情。

如果你要做的就是停止申请,你可以打电话,

System.exit(0)

表示程序执行成功,或传递其他数字表示失败。