簡體   English   中英

嵌入式H2:數據庫的Tomcat WebApp可能已在使用中:“被另一個進程鎖定”

[英]Tomcat WebApp with embedded H2 : Database may be already in use: “Locked by another process”

我正在使用嵌入式H2數據庫上的Hibernate開發Maven Spring Boot Web應用程序。 應用程序部署在Tomcat 8應用程序容器上,使用Maven目標tomcat7:從Maven Tomcat插件重新部署(tomcat7-maven-plugin)。

當我第一次嘗試在Tomcat上部署這個Web應用程序時,我沒有異常(在Tomcat重啟之后)。

但是當我嘗試在Tomcat上重新部署此Web應用程序時,我有以下異常:

org.h2.jdbc.JdbcSQLException:數據庫可能已在使用中:“被另一個進程鎖定”。 可能的解決方案:關閉所有其他連接; 使用服務器模式; SQL語句:null / 14cfb969fb93251ff134953c65dd1f05db2ecd34c6b [90020-145]

的hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">org.h2.Driver</property>
        <property name="connection.url">jdbc:h2:file:d:/Profiles/mBaye/Developement/Run/spring-boot-web-seed-dev/db/springbootwebui;DB_CLOSE_DELAY=0;MVCC=TRUE</property>
        <property name="connection.username">sa</property>
        <property name="connection.password"/>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.H2Dialect</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <!-- <property name="hbm2ddl.auto">create</property> -->
        <!-- Update the database schema on startup -->
        <property name="hbm2ddl.auto">update</property>

        <mapping resource="app/Greeting.hbm.xml"/>

    </session-factory>

</hibernate-configuration>

GreetingController.java

@Controller
public class GreetingController {

    private static Logger logger ;

    // A SessionFactory is set up once for an application
    private static final SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

    [...]

    private Greeting saveGreeting(Greeting greeting) {

        logger.info(new StringBuilder("greeting=").append(greeting.toString()).toString());

        Session session = null;
        Greeting ret = null;

        try {
            session = sessionFactory.openSession();
            session.beginTransaction();
            session.save( greeting );
            session.getTransaction().commit();
            // Return result
            ret = greeting ;
        } catch (Exception e) {
            logger.log(Level.SEVERE, new StringBuilder("Failed to save ").append(greeting.toString()).toString(), e);
        } finally {
            session.close();
        }

        if (ret != null) {
            logger.info(new StringBuilder("ret=").append(ret.toString()).toString());   
        } else {
            logger.info(new StringBuilder("ret=null").toString());
        }

        return ret ;
    }

    [...]
}

我在其他主題上讀到,當VM正確退出時,數據庫連接會自動關閉(來源: 什么是關閉H2的正確方法?

我想,當應用程序部署在Tomcat上時,Tomcat會保留數據庫連接。

我想找到一種正確的方法來關閉Tomcat重新部署的所有數據庫連接。

提前致謝。

我終於找到了解決方案! :)

我將H2數據庫連接URL的設置更改為:

<property name="connection.url">jdbc:h2:file:d:/Profiles/mBaye/Developement/Run/spring-boot-web-seed-dev/db/springbootwebui;MVCC=TRUE;DB_CLOSE_ON_EXIT=TRUE;FILE_LOCK=NO</property>

的hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">org.h2.Driver</property>
        <property name="connection.url">jdbc:h2:file:d:/Profiles/mBaye/Developement/Run/spring-boot-web-seed-dev/db/springbootwebui;MVCC=TRUE;DB_CLOSE_ON_EXIT=TRUE;FILE_LOCK=NO</property>
        <property name="connection.username">sa</property>
        <property name="connection.password"/>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.H2Dialect</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <!-- <property name="hbm2ddl.auto">create</property> -->
        <!-- Update the database schema on startup -->
        <property name="hbm2ddl.auto">update</property>

        <mapping resource="app/Greeting.hbm.xml"/>

    </session-factory>

</hibernate-configuration>

我不確定這是最好的解決方案,但它確實有效。

當所有連接都關閉時,H2關閉數據庫。 關閉連接池的所有連接對我有用。

關閉連接也對我有用,打開多個連接而沒有意識到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM