首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有嵌入式WebApp的Tomcat H2 :数据库可能已经在使用:“被另一个进程锁定”

带有嵌入式WebApp的Tomcat H2 :数据库可能已经在使用:“被另一个进程锁定”
EN

Stack Overflow用户
提问于 2015-04-28 09:36:53
回答 3查看 9.4K关注 0票数 5

我正在使用嵌入式H2数据库上的Hibernate开发一个Maven Spring应用程序。应用程序部署在Tomcat 8应用程序容器上,使用Maven目标Tomcat 7:从Maven Tomcat插件重新部署(tomcat7-maven- plugin )。

当我第一次尝试在Tomcat上部署这个web应用程序时,我也不例外(在Tomcat重新启动之后)。

但是,当我试图在Tomcat上重新部署这个web应用程序时,我有以下例外:

org.h2.jdbc.JdbcSQLException:数据库可能已经在使用:“被另一个进程锁定”。可能的解决方案:关闭所有其他连接;使用服务器模式;SQL语句: null/14cfb969fb93251ff134953c65dd1f05db2ecd34c6b 90020-145

hibernate.cfg.xml

代码语言:javascript
复制
<?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

代码语言:javascript
复制
@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正确退出时,数据库连接会自动关闭(源:What is the proper way to close H2?)

我假设,由于应用程序部署在Tomcat上,数据库连接由Tomcat保存。

我想找到一种适当的方法来关闭Tomcat重新部署中的所有数据库连接。

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-30 09:44:34

我终于找到了解决方案!:)

我将H2数据库连接URL的设置更改为:

代码语言:javascript
复制
<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

代码语言:javascript
复制
<?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>

我不确定这是最好的解决办法,但有效。

票数 7
EN

Stack Overflow用户

发布于 2015-04-28 14:36:47

当所有连接都关闭时,H2将关闭数据库。关闭连接池中的所有连接对我有效。

票数 0
EN

Stack Overflow用户

发布于 2016-07-05 00:43:17

关闭连接对我也有效,有多个连接打开而没有意识到。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29915679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档