2012-07-24 13 views
5

サーブレット内でHSQLDBを実行しています。アプリケーションをWebサーバーに再デプロイすると、.lckファイルが正しく解放されず、HSQLサーバーはファイルをロードできません。HSQL DB in Servlet:ロックファイルが公開されていません

のTomcat 7.0.22は、NetBeansでWebサーバー出荷されています...

なぜこれが起こっているすべてのアイデア?ここで

は、initコードです:私はJPAを使用しています

@Override 
public void destroy() { 
    super.destroy(); 
    server.setNoSystemExit(true); 
    server.stop(); 
    server.shutdown(); 
    controller.shutdown(); 
} 

:ここ

@Override public void init() throws ServletException { 
     HsqlProperties p = new HsqlProperties(); 
     p.setProperty("server.database.0", dbPath); 
     p.setProperty("server.dbname.0", Environment.PERSISTENCE_HSQL_DB_NAME); 
     p.setProperty("server.port", Environment.PERSISTENCE_HSQL_PORT); 
     server = new Server(); 
     server.setProperties(p); 
     server.setSilent(false); 
     server.setTrace(true); 
     server.setLogWriter(new PrintWriter(System.out)); 
     server.setErrWriter(null); 
     server.start(); 

     server.checkRunning(true); 

     /* Exception handling */ 
    } 

は私のシャットダウンである/メソッドを破壊します。データベースが読み込まれると(最初の起動時)、アプリケーションは正常に動作しています。ここに私のpersistence.xmlがあります:

<persistence-unit name="embedded_hsql" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <!-- Entities --> 
    <properties> 
     <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/> 
     <property name="hibernate.connection.url" value="jdbc:hsqldb:hsql://localhost:9001/fst_db;hsqldb.lock_file=false"/> 
     <property name="hibernate.connection.username" value="SA"/> 
     <property name="hibernate.connection.password" value=""/> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> 
     <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/> 
     <property name="hibernate.show_sql" value="false"/> 
     <property name="hibernate.connection.SetBigStringTryClob" value="true"/> 
     <property name="hibernate.hbm2ddl.auto" value="update"/> 
     <property name="current_session_context_class" value="thread" /> 
     <property name="cache.provider_class" value="org.hibernate.cache.NoCacheProvider" /> 
    </properties> 
</persistence-unit> 

"hsqldb.lock_file = false"をテスト目的で追加しましたが、これはまったく効果がありません。一般に私はファイルのロックを無効にしたくない...

ありがとう!

答えて

1

あなたはそれが良いだろうよりも、同じWebアプリケーション内からそのデータベースにアクセスする必要がある場合:"in-process"モードで

  1. 実行HSQLDB。
  2. データベースをTomcatのresourceとして定義し、JNDIでアクセスします。

これは、hsqldbの開始/停止の負荷を完全に取り除くのに役立ちます。

+0

解決策の詳細を教えていただけますか?私のpersistence.xmlはどのように見えますか?私がリソースを定義し、実際のHSQLファイルがどこにあるかを伝えなければならない場合。私はまだファイルパスを動的に設定するという問題に... –

+0

リソースとして保存されたHSQLDBデータベースは読み取り専用です。 http://www.hsqldb.org/doc/1.8/src/org/hsqldb/jdbc/jdbcConnection.htmlを参照してください。 –

0

こんにちは、問題をこのように解決:

@Override 
public void destroy() { 
    controller.shutdown(); 
    PersistenceUtility.getInstance().closeAllEntityManagers(); 

    try { 
     EntityManager em = PersistenceUtility.getInstance().createEntityManager(); 
     em.getTransaction().begin(); 
     Query shutdownQuery = em.createNativeQuery("SHUTDOWN"); 
     shutdownQuery.executeUpdate(); 
     em.getTransaction().commit(); 
    } catch (Throwable t) { 
     Environment.LOGGER.debug("Database connection closed"); 
    } 

    server.signalCloseAllServerConnections(); 
    server.shutdown(); 
    super.destroy(); 
} 

左私の唯一の問題は、ネイティブクエリSHUTDOWNは、トリックを行いますが、対応するEntityManagerによってスローされた例外をトリガーするということです。私の理論は、データベースがクローズされていることであるとのEntityManagerはその接続を閉じた前に停止...

私はcatched Throwable tのスタックトレースを印刷する場合、私が取得:

javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: could not execute native bulk manipulation query 
    at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:637) 
    at org.hibernate.ejb.QueryImpl.executeUpdate(QueryImpl.java:58) 
    at com.convista.fst.manager.ConfigurationServlet.destroy(ConfigurationServlet.java:115) 
    at org.apache.catalina.core.StandardWrapper.unload(StandardWrapper.java:1417) 
    at org.apache.catalina.core.StandardWrapper.stopInternal(StandardWrapper.java:1764) 
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:230) 
    at org.apache.catalina.core.StandardContext$4.run(StandardContext.java:5449) 
    at java.lang.Thread.run(Thread.java:722) 
Caused by: org.hibernate.exception.JDBCConnectionException: could not execute native bulk manipulation query 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 
    at org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:174) 
    at org.hibernate.impl.SessionImpl.executeNativeUpdate(SessionImpl.java:1163) 
    at org.hibernate.impl.SQLQueryImpl.executeUpdate(SQLQueryImpl.java:334) 
    at org.hibernate.ejb.QueryImpl.executeUpdate(QueryImpl.java:49) 
    ... 6 more 
Caused by: java.sql.SQLTransientConnectionException: connection exception: connection failure: java.net.SocketException: Software caused connection abort: socket write error 
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.JDBCPreparedStatement.close(Unknown Source) 
    at org.hibernate.jdbc.AbstractBatcher.closePreparedStatement(AbstractBatcher.java:534) 
    at org.hibernate.jdbc.AbstractBatcher.closeStatement(AbstractBatcher.java:269) 
    at org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:169) 
    ... 9 more 
Caused by: org.hsqldb.HsqlException: connection exception: connection failure: java.net.SocketException: Software caused connection abort: socket write error 
    at org.hsqldb.error.Error.error(Unknown Source) 
    at org.hsqldb.error.Error.error(Unknown Source) 
    at org.hsqldb.ClientConnection.execute(Unknown Source) 
    ... 13 more 

は、あなたはこれを原因を知っていますか例外?

関連する問題