Java Hibernate线程在事务提交后未完成

Java Hibernate线程在事务提交后未完成,java,hibernate,Java,Hibernate,我在JavaSE程序中使用Hibernate,因此没有应用服务器 我正在使用我的持久性管理器: import javax.persistence.EntityManager; 导入javax.persistence.EntityManagerFactory; 导入javax.persistence.persistence; 公共枚举持久性管理器{ 例子 私营实体管理工厂; 私有PersistenceManager(){ emFactory=Persistence.createEntityMana

我在JavaSE程序中使用Hibernate,因此没有应用服务器

我正在使用我的持久性管理器:

import javax.persistence.EntityManager;
导入javax.persistence.EntityManagerFactory;
导入javax.persistence.persistence;
公共枚举持久性管理器{
例子
私营实体管理工厂;
私有PersistenceManager(){
emFactory=Persistence.createEntityManagerFactory(“jpa示例”);
}
公共实体管理器getEntityManager(){
返回emFactory.createEntityManager();
}
公众假期结束(){
emFactory.close();
}
}
使用非常简单的persistence.xml:


org.hibernate.jpa.HibernatePersistenceProvider
我的功能代码:

EntityManager em=PersistenceManager.INSTANCE.getEntityManager();
em.getTransaction().begin();
//这里的虚拟对象实例化
em.persist(obj1);
em.persist(obj2);
em.getTransaction().commit();
系统输出打印(“comitting”);
em.close();
系统输出打印项次(“关闭”);
PersistenceManager.INSTANCE.close();
系统输出打印项次(“完成”);
我的应用程序按预期打印所有内容,即“关闭”和“完成”出现在我的控制台中。我还在mysql容器中看到,事务进行得很顺利。但是,程序从不终止,并以异常结束:

[WARNING] thread Thread[Abandoned connection cleanup thread,5,com.org.Main] was interrupted but is still alive after waiting at least 15000msecs
[WARNING] thread Thread[Abandoned connection cleanup thread,5,com.org.Main] will linger despite being asked to die via interruption
[WARNING] NOTE: 1 thread(s) did not finish despite being asked to  via interruption. This is not a problem with exec:java, it is a problem with the running code. Although not serious, it should be remedied.
[WARNING] Couldn't destroy threadgroup org.codehaus.mojo.exec.ExecJavaMojo$IsolatedThreadGroup[name=com.org.Main,maxpri=10]
java.lang.IllegalThreadStateException
    at java.lang.ThreadGroup.destroy (ThreadGroup.java:778)
    at org.codehaus.mojo.exec.ExecJavaMojo.execute (ExecJavaMojo.java:321)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:134)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:208)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:154)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:146)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:51)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:309)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:194)
    at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:107)
    at org.apache.maven.cli.MavenCli.execute (MavenCli.java:955)
    at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:290)
    at org.apache.maven.cli.MavenCli.main (MavenCli.java:194)
    at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:498)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:289)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:229)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:415)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:356)

为什么呢?我做错了什么?似乎有一些非阻塞调用要关闭,这需要时间,但程序想要终止

你似乎和这篇文章是同一期。他用一个简单的方法解决了他的问题

-Dexec.cleanupDaemonThreads=false

你的问题与Hibernate无关


这里的另一个解决方案是使用主菜单末尾的
System.exit(0)

谢谢,你说得完全正确。我没有看到另一个问题,但肯定是重复的。可惜没有人解释为什么会这样;这可能和maven本身有关不客气。是的,这是非常奇怪的,我发现的唯一一个文档说明“cleanupDaemonThreads:是否中断/加入,并可能在退出时停止守护进程线程。如果这是false,maven对守护进程线程不做任何处理。当maven没有更多工作要做时,VM通常会终止任何剩余的守护进程线程”。因此,当这个选项等于“true”时,maven会尝试自己停止一些线程,而不是让VM完成它的工作。即使有这些文件,我也不太清楚。。。为什么maven会试图停止VM线程?一个谜。