Servlet中的HSQL DB:锁定文件未释放

5 java jpa hsqldb java-ee

我在Servlet中运行HSQLDB.当我将应用程序重新部署到Web服务器时,.lck文件未正确释放,并且HSQL服务器无法加载该文件.

Web服务器是随NetBeans一起提供的Tomcat 7.0.22 ...

任何想法为什么会这样?

这是init代码:

@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 */
    }
Run Code Online (Sandbox Code Playgroud)

这是我的shutdown/destroy方法:

@Override
public void destroy() {
    super.destroy();
    server.setNoSystemExit(true);
    server.stop();
    server.shutdown();
    controller.shutdown();
}
Run Code Online (Sandbox Code Playgroud)

我正在使用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>   
Run Code Online (Sandbox Code Playgroud)

为了测试目的,我添加了"hsqldb.lock_file = false",它完全没有效果.一般来说,我不想禁用文件锁定...

谢谢!

小智 1

如果您需要从同一个 Web 应用程序中访问该数据库,那么最好:

  1. 在“进程内”模式下运行 HSQLDB 。
  2. 将数据库定义为Tomcat的资源并使用JNDI访问它。

这将有助于完全摆脱 hsqldb 启动/停止的负担。