2012-07-24 22 views
5

Sto eseguendo un HSQLDB all'interno di un servlet. Quando si ridistribuisce l'applicazione sul server Web, il file .lck non viene rilasciato correttamente e il server HSQL non può caricare il file.DB HSQL in servlet: file di blocco non rilasciato

server Web è Tomcat 7.0.22 fornito con NetBeans ...

Tutte le idee perché questo sta accadendo?

ecco il codice di inizializzazione:

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

Sto usando JPA:

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

Ecco il mio arresto metodo/distruggere. Se il database viene caricato (primo avvio), l'app funziona correttamente. Qui è la mia 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> 

ho aggiunto "hsqldb.lock_file = false" a scopo di test che non ha alcun effetto a tutti. In generale non voglio disabilitare il blocco dei file ...

Grazie!

risposta

1

Se è necessario accedere a tale database all'interno della stessa applicazione web di quello che sarebbe meglio:

  1. run HSQLDB in modalità "in-process".
  2. definire il database come resource di Tomcat e accedervi con JNDI.

Ciò contribuirebbe a eliminare completamente il carico di avvio/arresto di hsqldb.

+0

Potete darmi maggiori dettagli per quella soluzione? Come sarebbe il mio persistence.xml? E se definisco la risorsa e devo dire dove sarebbe il vero file HSQL. Devo ancora risolvere il problema di impostare dinamicamente il percorso del file ... –

+0

I database HSQLDB memorizzati come risorse sono di sola lettura. Vedi http://www.hsqldb.org/doc/1.8/src/org/hsqldb/jdbc/jdbcConnection.html –

0

Hi risolto il problema in questo modo:

@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(); 
} 

Il mio unico problema rimasto è che la query nativa SHUTDOWN fa il trucco, ma anche scattare le eccezioni sollevate dalla corrispondente EntityManager. La mia teoria è che il database è chiuso e si fermò davanti alla EntityManager ha chiuso la sua connessione ...

se stampo l'analisi dello stack del catched Throwable t ottengo:

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 

Sai cosa provoca questa eccezioni?

Problemi correlati