2012-07-24 4 views
5

서블릿 내부에서 HSQLDB를 실행하고 있습니다. 애플리케이션을 웹 서버에 재배포 할 때 .lck 파일이 제대로 해제되지 않아 HSQL 서버가 파일을로드 할 수 없습니다.서블릿의 HSQL DB : 잠금 파일이 해제되지 않았습니다.

웹 서버는 톰캣 7.0.22 왜 이런 일이

어떤 아이디어를 ... 넷빈즈와 함께 제공됩니다? 여기

는 초기화 코드 : 나는 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-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"로 추가 : 여기 내의 persistence.xml이다. 일반적으로 파일 잠금을 해제하고 싶지 않습니다 ...

고마워!

답변

1

당신이 더 나은 것보다 같은 웹 응용 프로그램 내에서 해당 데이터베이스에 액세스해야하는 경우 : "in-process" 모드에서

  1. 실행 HSQLDB.
  2. 데이터베이스를 Tomcat의 resource으로 정의하고 JNDI로 액세스하십시오.

이렇게하면 hsqldb 시작/중지 부담을 완전히 없앨 수 있습니다. 왼쪽

@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에 의해 던져진 예외를 유발한다는 것입니다 :

+0

해당 솔루션에 대해 자세히 설명해 주시겠습니까? 내 persistence.xml은 어떻게 생겼을까요? 그리고 리소스를 정의하고 실제 HSQL 파일이 어디에 있는지 알려야 만합니다. 파일 경로를 동적으로 설정하는 문제는 여전히 남아 있습니다 ... –

+0

리소스로 저장된 HSQLDB 데이터베이스는 읽기 전용입니다. http://www.hsqldb.org/doc/1.8/src/org/hsqldb/jdbc/jdbcConnection.html을 참조하십시오. –

0

안녕하세요 이러한 방식으로 문제를 해결했다. 나는 사로 잡았 Throwable t의 스택 추적을 인쇄 할 경우 내 이론이 데이터베이스가 ... 폐쇄와의 EntityManager가 연결을 종료하기 전에 정지된다

내가 얻을 :

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 

당신이 원인이 뭔지 알아 예외?

관련 문제