升级到Hibernate 4.3.4主方法永远不会终止JVM没有完成

chi*_*tiz 6 java multithreading hibernate jpa

我必须从升级Hibernate 4.2.3Hibernate 4.3.4测试一些JPA 2.1规格.我只改变了这一行code

上一行:

final org.hibernate.service.ServiceRegistry serviceRegistry = new org.hibernate.service.ServiceRegistryBuilder().applySettings(hibConfiguration.getProperties()).buildServiceRegistry();
Run Code Online (Sandbox Code Playgroud)

新增代码行

final org.hibernate.service.ServiceRegistry serviceRegistry = new org.hibernate.boot.registry.StandardServiceRegistryBuilder().applySettings(hibConfiguration.getProperties()).build();
Run Code Online (Sandbox Code Playgroud)

问题我有一个主要方法只是为了测试一些,Criteria APImain method从未完成与最新Hibernate Version我已检索正在运行的线程,并与最新版本的线程如下.

ThreadList:
[threadID:]2  [threadName:] Reference Handler [isDaemon:] true [isAlive:] true
[threadID:]3  [threadName:] Finalizer [isDaemon:] true [isAlive:] true
[threadID:]4  [threadName:] Signal Dispatcher [isDaemon:] true [isAlive:] true
[threadID:]5  [threadName:] Attach Listener [isDaemon:] true [isAlive:] true
[threadID:]10 [threadName:] Abandoned connection cleanup thread [isDaemon:] true [isAlive:] true
[threadID:]11 [threadName:] pool-1-thread-1 [isDaemon:] false [isAlive:] true
[threadID:]1  [threadName:] main [isDaemon:] false [isAlive:] true
Run Code Online (Sandbox Code Playgroud)

与之前的版本相比,这个帖子是新的.

[threadID:]11 [threadName:] pool-1-thread-1 [isDaemon:] false [isAlive:] true
Run Code Online (Sandbox Code Playgroud)

根据规范,它不是守护进程.

No, it is not. The virtual machine terminates if the last non-daemon thread has finished. It doesn't have to be the main thread.
Run Code Online (Sandbox Code Playgroud)

我认为这个帖子至少在5分钟内不会完成.

问题出现了,只创建了HibernateSessionFactory.

public static void main(String[] args)
{        
    HibernateHandler handler = new HibernateHandler(true);//creates the HibernateSessionFactory
    return;//JVM not finish at this point
}
Run Code Online (Sandbox Code Playgroud)

我希望我的JVM终止与主方法完成..

我做错了什么..

chi*_*tiz 6

似乎新ServiceRegister的不是closed,DestroyedSessionFactory你关闭时,你必须在你打电话时自己摧毁.

getSessionFactory.close().
Run Code Online (Sandbox Code Playgroud)

我的新Hibernate代码

final Configuration hibConfiguration = new Configuration().configure(yourCFGPath);         
final org.hibernate.service.ServiceRegistry serviceRegistry = new org.hibernate.boot.registry
.StandardServiceRegistryBuilder().
applySettings(hibConfiguration.getProperties()).build();
hibConfiguration.setSessionFactoryObserver(new SessionFactoryObserver()
{
    @Override
    public void sessionFactoryCreated(SessionFactory factory){}
    @Override
    public void sessionFactoryClosed(SessionFactory factory)
    {
        ((StandardServiceRegistryImpl)serviceRegistry).destroy();
    }});                
 final org.hibernate.SessionFactory factory = hibConfiguration.buildSessionFactory(serviceRegistry);
Run Code Online (Sandbox Code Playgroud)

以后你要打电话

session.getSessionFactory().close();
Run Code Online (Sandbox Code Playgroud)

我希望真的能帮助别人.