2017-02-01 27 views
0

私はWebアプリケーションを開発しているときにEclipseの/ insideの中でtomcatを実行しています。 Webアプリケーションは、hibernateとguiceを介して、埋め込みモードでhsqldbを使用しています。私は風袋​​を止めるときを除いて、うまく動作しているようです。 Eclipseには緑色の開始ボタンとTomcat用の赤色の停止ボタンがあります。停止ボタンをクリックすると、Hibernateとhsqldbをミックスに追加する前と同じように、すぐに停止しません。これで数秒待ってからeclipseを実行すると、tomcatを止めずにOKをクリックして強制終了させるダイアログボックスが表示されます。JDBCドライバの登録を解除しますか?

私はこれを修正するために何をする必要があるか知っていますか?私はtomcatのlibディレクトリにhsqldb jarファイルを置くと言っているいくつかの他の応答を見つけましたが、私はそれがやや劇的ではないことができるかと思っていました。ここで

は(Eclipseのコンソールウィンドウ内)のTomcatのエラー出力には何があります:

Jan 31, 2017 7:04:11 PM org.apache.catalina.loader.WebappClassLoaderBase clearReferencesJdbc 
WARNING: The web application [basic] registered the JDBC driver [org.hsqldb.jdbc.JDBCDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 
Jan 31, 2017 7:04:11 PM org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads 
WARNING: The web application [basic] appears to have started a thread named [HSQLDB Timer @276f0355] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: 
java.lang.Object.wait(Native Method) 
org.hsqldb.lib.HsqlTimer$TaskQueue.park(Unknown Source) 
org.hsqldb.lib.HsqlTimer.nextTask(Unknown Source) 
org.hsqldb.lib.HsqlTimer$TaskRunner.run(Unknown Source) 
java.lang.Thread.run(Thread.java:745) 
Jan 31, 2017 7:04:11 PM org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads 
WARNING: The web application [basic] appears to have started a thread named [pool-1-thread-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: 
sun.misc.Unsafe.park(Native Method) 
java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215) 
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078) 
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093) 
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) 
java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067) 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
java.lang.Thread.run(Thread.java:745) 
Jan 31, 2017 7:04:11 PM org.apache.catalina.loader.WebappClassLoaderBase checkThreadLocalMapForLeaks 
SEVERE: The web application [basic] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [[email protected]]) and a value of type [org.hibernate.internal.SessionImpl] (value [SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=ExecutableList{size=0} updates=ExecutableList{size=0} deletions=ExecutableList{size=0} orphanRemovals=ExecutableList{size=0} collectionCreations=ExecutableList{size=0} collectionRemovals=ExecutableList{size=0} collectionUpdates=ExecutableList{size=0} collectionQueuedOps=ExecutableList{size=0} unresolvedInsertDependencies=null])]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak. 
+0

Tomcatを停止するときにデータベースをシャットダウンする必要があります。 – fredt

+0

lumpynoseはrigthで、2つのソリューションがあります。 - "SHUTDOWN;"あなたのアプリケーションの終わりのどこかのSQLコマンドとして または接続文字列で次のように使用してください。 _Connection = DriverManager.getConnection( "jdbc:hsqldb:file:mydb; shutdown = true"、 "SA"、 ""); –

答えて

0

私は愚かな答えを持っていますが、私は私が何をしたかを紹介します。

@JulienR:javax.persistence.jdbc.url値のpersistence.xmlファイルにはすでにシャットダウン= trueがあります。

ServletContextListenerを作成してweb.xmlファイルに追加しました。ここにコードがあります。 EntityManagerを使用してSHUTDOWNコマンドを発行する最初の部分は私のコードです。私がhereから降りたClassLoaderとドライバーの目で見ているコード。だから、これでもうHSQLDBについて不満はしませんが、私はまだ停止していない2つのスレッドについて警告を出しています(そして、それを待っている時にEclipseが待つのを待たなければなりません)。私はログから関連する行を追加しました。

public class BasicServletContextListener implements ServletContextListener { 
    private final transient Logger log = 
     LoggerFactory.getLogger(BasicServletContextListener.class); 

    // private final Provider<EntityManager> entityManagerProvider; 

    @Override 
    public void contextDestroyed(ServletContextEvent event) { 
     this.log.debug("contextEvent: {}", event.toString()); 

     final EntityManagerFactory entityManagerFactory = 
      Persistence.createEntityManagerFactory("ilmp"); 

     final EntityManager entityManager = 
      entityManagerFactory.createEntityManager(); 

     entityManager.getTransaction().begin(); 

     final Query query = 
      entityManager.createNativeQuery("SHUTDOWN COMPACT;"); 

     this.log.debug("query: {}", query.executeUpdate()); 

     entityManager.getTransaction().commit(); 

     entityManager.close(); 

     // Now deregister JDBC drivers in this context's ClassLoader: 
     // Get the webapp's ClassLoader 
     final ClassLoader cl = Thread.currentThread().getContextClassLoader(); 
     // Loop through all drivers 
     final Enumeration<Driver> drivers = DriverManager.getDrivers(); 
     while (drivers.hasMoreElements()) { 
      final Driver driver = drivers.nextElement(); 
      if (driver.getClass().getClassLoader() == cl) { 
       // This driver was registered by the webapp's 
       // ClassLoader, so deregister it: 
       try { 
        this.log.info("Deregistering JDBC driver {}", driver); 
        DriverManager.deregisterDriver(driver); 
       } 
       catch (final SQLException ex) { 
        this.log.error("Error deregistering JDBC driver {}", driver, 
            ex); 
       } 
      } 
      else { 
       // driver was not registered by the webapp's 
       // ClassLoader and may be in use elsewhere 
       this.log.trace(
           "Not deregistering JDBC driver {} as it does not belong to this webapp's ClassLoader", 
           driver); 
      } 
     } 
    } 

    @Override 
    public void contextInitialized(ServletContextEvent event) { 
     this.log.debug("contextEvent: {}", event.toString()); 
    } 
} 

>

INFO: 2017-Feb-01 19:05:36.023 [localhost-startStop-2] org.hibernate.hql.internal.QueryTranslatorFactoryInitiator.initiateService.47: HHH000397: Using ASTQueryTranslatorFactory 
Hibernate: SHUTDOWN COMPACT; 
INFO: 2017-Feb-01 19:05:36.226 [localhost-startStop-2] sun.reflect.NativeMethodAccessorImpl.invoke0.-2: Database closed 
INFO: 2017-Feb-01 19:05:36.273 [localhost-startStop-2] sun.reflect.NativeMethodAccessorImpl.invoke0.-2: open start - state not modified 
INFO: 2017-Feb-01 19:05:36.351 [localhost-startStop-2] sun.reflect.NativeMethodAccessorImpl.invoke0.-2: Database closed 
DEBUG: 2017-Feb-01 19:05:36.460 [localhost-startStop-2] com.objecteffects.basic.persist.BasicServletContextListener.contextDestroyed.42: query: 0 
INFO: 2017-Feb-01 19:05:36.460 [localhost-startStop-2] com.objecteffects.basic.persist.BasicServletContextListener.contextDestroyed.59: Deregistering JDBC driver [email protected] 
Feb 01, 2017 7:05:36 PM org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads 
WARNING: The web application [basic] appears to have started a thread named [pool-1-thread-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: 
sun.misc.Unsafe.park(Native Method) 
java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215) 
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078) 
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093) 
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) 
java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067) 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
java.lang.Thread.run(Thread.java:745) 
Feb 01, 2017 7:05:36 PM org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads 
WARNING: The web application [basic] appears to have started a thread named [pool-2-thread-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: 
sun.misc.Unsafe.park(Native Method) 
java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215) 
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078) 
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093) 
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) 
java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067) 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
java.lang.Thread.run(Thread.java:745) 
Feb 01, 2017 7:05:36 PM org.apache.catalina.loader.WebappClassLoaderBase checkThreadLocalMapForLeaks 
SEVERE: The web application [basic] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [[email protected]]) and a value of type [org.hibernate.internal.SessionImpl] (value [SessionImpl(PersistenceContext[entityKeys=[EntityKey[com.objecteffects.basic.persist.TumblrSecretsEntity#1], EntityKey[com.objecteffects.basic.persist.TumblrSecretsEntity#2]],collectionKeys=[]];ActionQueue[insertions=ExecutableList{size=0} updates=ExecutableList{size=0} deletions=ExecutableList{size=0} orphanRemovals=ExecutableList{size=0} collectionCreations=ExecutableList{size=0} collectionRemovals=ExecutableList{size=0} collectionUpdates=ExecutableList{size=0} collectionQueuedOps=ExecutableList{size=0} unresolvedInsertDependencies=null])]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak. 
Feb 01, 2017 7:05:36 PM org.apache.coyote.AbstractProtocol stop 
INFO: Stopping ProtocolHandler ["http-nio-8080"] 
Feb 01, 2017 7:05:36 PM org.apache.coyote.AbstractProtocol stop 
INFO: Stopping ProtocolHandler ["ajp-nio-8009"] 
Feb 01, 2017 7:05:36 PM org.apache.coyote.AbstractProtocol destroy 
INFO: Destroying ProtocolHandler ["http-nio-8080"] 
Feb 01, 2017 7:05:36 PM org.apache.coyote.AbstractProtocol destroy 
INFO: Destroying ProtocolHandler ["ajp-nio-8009"] 

愚かな答えは、私は(私は引退だと自分自身のために何かを書こうと周りdinking)私は数年前に書いた何かのために私のセットアップを見て、追加することですこれまでにこのpersistence.xmlに使用していたc3p0の設定行は、遅延なしでシャットダウンしますが、ゾンビスレッドに関する警告がまだ残っています。関連する行は次のとおりです(まだコメントアウトされています)。

<!--    <property --> 
<!--     name="hibernate.c3p0.min_size" --> 
<!--     value="5" /> --> 

<!--    <property --> 
<!--     name="hibernate.c3p0.max_size" --> 
<!--     value="20" /> --> 

<!--    <property --> 
<!--     name="hibernate.c3p0.timeout" --> 
<!--     value="1800" /> --> 

<!--    <property --> 
<!--     name="hibernate.c3p0.max_statements" --> 
<!--     value="50" /> --> 
関連する問題