解决方法“由于:java.lang.IllegalStateException:文件被锁定:nio:/Development/hiber/data/contactmgr.mv.db [1.4.192 / 7]”

She*_*hek 5 java hibernate h2 spring-boot

我正在尝试使用休眠模式在H2数据库中插入模拟数据,但是我面临以下错误

引起原因:java.lang.IllegalStateException:文件已锁定:nio:/Development/hiber/data/contactmgr.mv.db [1.4.192 / 7]

早些时候,我以为是因为用户名和密码属性引起的,但是即使从hibernate.cfg.xml中删除了该错误,我仍然偶然发现了该错误。

com.hibernate.demo.Application.buildSesssionFactory(Application.java:46)的com.hibernate.demo.Application。(Application.java:17)的buildMetadata(MetadataSources.java:151)原因:org.h2.jdbc。 JdbcSQLException:数据库可能已经在使用:null。可能的解决方案:关闭所有其他连接;在org.h2.mvstore的org.h2.message.DbException.get(DbException.java:168)的org.h2.message.DbException.getJdbcSQLException(DbException.java:345)使用服务器模式[90020-192]。 org.h2.mvstore.db.MVTableEngine $ Store.open(MVTableEngine.java:167)上的db.MVTableEngine $ Store.convertIllegalStateException(MVTableEngine.java:187)在org.h2.mvstore.db.MVTableEngine.init(MVTableEngine。 org.h2.engine.Database.getPageStore(Database.java:2463)处org.h2.engine.Database处的Java:99)。

这是我正在使用的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:./data/contactmgr</property>


        <property name="hibernate.default_schema">PUBLIC</property>

        <!-- 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>

        <property name="show_sql">true</property>

        <mapping class="com.hibernate.demo.model.Contact"/>

    </session-factory>

</hibernate-configuration>
Run Code Online (Sandbox Code Playgroud)

以下是我的主班:

public class Application {

    //Session factory
    private static final SessionFactory sessionFactory = buildSesssionFactory();

    public static void main(String[] args) {

        Contact contact = new Contact.ContactBuilder("Bob", "marley").withEmail("marley.bob@gmail.com").withPhone(5859789791L).build();

        //Open a Session

        Session session = sessionFactory.openSession();

        //Begin a Transaction
         session.beginTransaction();


        //Use the session to save the contact

        session.save(contact);
        //Commit the transaction

        session.getTransaction().commit();
        // Close the session
        session.close();
    }

    private static SessionFactory buildSesssionFactory() {
        // Create a StandardServiceRegistry
        Configuration configuration = new Configuration();
        configuration.configure("hibernate.cfg.xml");
        final ServiceRegistry registry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
        return new MetadataSources(registry).buildMetadata().buildSessionFactory();
Run Code Online (Sandbox Code Playgroud)

Dav*_*ann 7

抛出此异常是因为 H2 db 文件已在使用中。(可能是因为你的 db 文件存在一些不一致或类似的问题)

我建议如下:

  1. 您是否尝试过简单地删除该文件以及该文件夹中属于它的所有其他中间文件?之后只需使用新的 db 文件重新启动应用程序。

  2. 也许您已经打开了两次应用程序,从而导致了错误?关闭所有实例将消除异常。

  • 它已解决,这是您的解决方案中的第二点导致它,H2 实例在后台运行,我的应用程序试图在同一端口上旋转一个新实例,投票通过。谢谢 (2认同)