2012-07-24 15 views
5

मैं एक सर्वलेट के अंदर एक HSQLDB चला रहा हूं। जब मैं वेब सर्वर पर एप्लिकेशन को पुन: नियोजित करता हूं तो .lck फ़ाइल ठीक से रिलीज़ नहीं होती है और HSQL सर्वर फ़ाइल लोड नहीं कर सकता है।सर्वलेट में एचएसक्यूएल डीबी: लॉक फ़ाइल जारी नहीं की गई

वेब सर्वर बिलाव 7.0.22 NetBeans के साथ भेज दिया है ...

कोई भी विचार क्यों यह हो रहा है?

यहाँ init कोड है:

@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. डेटाबेस को टोमकैट के 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 क्या दिखता है? और यदि मैं संसाधन को परिभाषित करता हूं और यह बताना चाहता हूं कि वास्तविक एचएसक्यूएल फ़ाइल कहां होगी। मुझे अभी भी फ़ाइल पथ को गतिशील रूप से सेट करने की समस्या है ... –

+0

संसाधनों के रूप में संग्रहीत HSQLDB डेटाबेस केवल पढ़ने के लिए हैं। देखें http://www.hsqldb.org/doc/1.8/src/org/hsqldb/jdbc/jdbcConnection.html –

0

हाय समस्या इस तरह से हल किया। मेरे सिद्धांत है कि डेटाबेस को बंद कर दिया और इससे पहले कि 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 

क्या आप जानते हैं कि इसका क्या कारण बनता है अपवाद?