5

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

Web サーバーは、NetBeans に同梱されている Tomcat 7.0.22 です...

なぜこれが起こっているのですか?

初期化コードは次のとおりです。

@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 */
    }

これが私のシャットダウン/破棄方法です:

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

JPAを使用しています。データベースが読み込まれる (最初の起動) 場合、アプリは正常に動作しています。ここに私の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」を追加しましたが、まったく効果がありません。一般に、ファイルのロックを無効にしたくありません...

ありがとう!

4

3 に答える 3

1

同じ Web アプリケーション内からそのデータベースにアクセスする必要がある場合は、次の方法をお勧めします。

  1. HSQLDB を「インプロセス」モードで実行します。
  2. データベースを Tomcat のリソースとして定義し、JNDI でアクセスします。

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

于 2012-07-24T14:56:13.213 に答える
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 が接続を閉じる前に、データベースが閉じられて停止されるということです...

キャッチのスタック トレースを出力すると、次の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

この例外の原因を知っていますか?

于 2012-08-02T14:26:24.883 に答える