我必须从Hibernate 4.2.3
升级到Hibernate 4.3.4
以测试一些JPA 2.1
规格。我只更改了这一行code
上一行:
final org.hibernate.service.ServiceRegistry serviceRegistry = new org.hibernate.service.ServiceRegistryBuilder().applySettings(hibConfiguration.getProperties()).buildServiceRegistry();
新增代码行
final org.hibernate.service.ServiceRegistry serviceRegistry = new org.hibernate.boot.registry.StandardServiceRegistryBuilder().applySettings(hibConfiguration.getProperties()).build();
问题我有一个主要的方法只是为了测试一些Criteria API
但是main 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
与之前的版本相比,这个帖子是新的。
[threadID:]11 [threadName:] pool-1-thread-1 [isDaemon:] false [isAlive:] true
根据规范,不是守护进程。
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.
我认为这个帖子至少在5分钟内不会完成。
问题出现了,只是创建了HibernateSessionFactory。
public static void main(String[] args)
{
HibernateHandler handler = new HibernateHandler(true);//creates the HibernateSessionFactory
return;//JVM not finish at this point
}
我希望我的JVM以主方法完成终止..
我做错了什么..
答案 0 :(得分:6)
当ServiceRegister
关闭时,似乎新的closed
不是Destroyed
,SessionFactory
,当你打电话时,你必须自己销毁。
getSessionFactory.close().
我的新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);
以后你必须打电话
session.getSessionFactory().close();
我希望真的能帮助别人。
答案 1 :(得分:2)
要了解线程正在做什么,您可以进行线程转储,例如通过在调试模式下从eclipse运行程序,并挂起线程。
在您的具体情况下,您应该尝试调用sessionFactory.close()
。