2012-07-24 47 views
5

我正在Servlet中運行HSQLDB。當我將應用程序重新部署到Web服務器時,.lck文件未正確釋放,HSQL服務器無法加載文件。Servlet中的HSQL數據庫:鎖定文件未發佈

的Web服務器的Tomcat 7.0.22隨NetBeans ...

任何想法,爲什麼發生這種情況?

這裏是初始化代碼:

@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 =假」用於測試目的其中有沒有任何影響。一般來說,我不想禁用文件鎖定...

謝謝!

回答

1

如果你需要從同一個web應用程序中訪問該數據庫比它會更好:在"in-process"模式

  1. 運行HSQLDB。
  2. 將數據庫定義爲Tomcat的resource並使用JNDI訪問它。

這將有助於徹底擺脫hsqldb的啓動/停止負擔。

+0

你可以給我更詳細的解決方案嗎?我的persistence.xml會是什麼樣子?如果我定義資源並且必須告訴實際的HSQL文件在哪裏。我仍然需要動態設置文件路徑的問題...... – 2012-07-30 19:39:10

+0

作爲資源存儲的HSQLDB數據庫是隻讀的。請參閱http://www.hsqldb.org/doc/1.8/src/org/hsqldb/jdbc/jdbcConnection.html – 2016-08-30 13:36:45

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 

你知道是什麼原因導致這異常?