java - hibernate :应用程序在崩溃后不会关闭

标签 java hibernate jpa

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

使用的库

  • Hibernate 4.3.1 Final:jpa 文件夹和 required 文件夹中的所有 jar ( 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();    
    }
}

持久性.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/

相关文章:

java - JPA实体怎么做

java - Oracle 中没有序列的@GenelatedValue

android - IN 条件仅适用于单值数据存储查询 - Google 应用引擎

java - 简单单元测试中的 URLUtil.isHttpsUrl() 错误返回值? (返回默认值=真)

java - JPA 最佳实践 - 加入只读数据

java - Maven:是否可以将一组第 3 方 jar 上传到存储库,然后可以将其作为单个依赖项引用?

java - 使用 BLOB 或 TEXT/CLOB 在字段中保存 HTML 数据

带内连接的 Hibernate 更新查询

java - 字节数组转十六进制(int 格式)

java - Soap 客户端抛出意外的元素异常