如何解决“引起:java.lang.IllegalStateException:文件被锁定:nio:/Development/hiber/data/contactmgr.mv.db [1.4.192/

Posted

技术标签:

【中文标题】如何解决“引起:java.lang.IllegalStateException:文件被锁定:nio:/Development/hiber/data/contactmgr.mv.db [1.4.192/7]”【英文标题】:How to resolve "Caused by: java.lang.IllegalStateException: The file is locked: nio:/Development/hiber/data/contactmgr.mv.db [1.4.192/7]" 【发布时间】:2016-11-06 15:27:31 【问题描述】:

我正在尝试使用 hibernate 在 H2 db 中插入模拟数据,但我面临以下错误

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

,之前我认为这是因为用户名和密码属性,但即使在从 hibernate.cfg.xml 中删除它之后,我也偶然发现了这个错误。

线程“main”中的异常 java.lang.ExceptionInInitializerError 原因:org.hibernate.exception.JDBCConnectionException:调用Driver#connect时出错 在 org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator$1$1.convert(BasicConnectionCreator.java:122) 在 org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.convertSqlException(BasicConnectionCreator.java:140) 在 org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:58) 在 org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.createConnection(BasicConnectionCreator.java:75) 在 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:106) 在 org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111) 在 org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234) 在 org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206) 在 org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:260) 在 org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:94) 在 org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111) 在 org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234) 在 org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206) 在 org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:147) 在 org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:272) 在 org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:231) 在 org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206) 在 org.hibernate.metamodel.source.internal.MetadataImpl.(MetadataImpl.java:120) 在 org.hibernate.metamodel.source.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:123) 在 org.hibernate.metamodel.MetadataSources.buildMetadata(MetadataSources.java:151) 在 com.hibernate.demo.Application.buildSesssionFactory(Application.java:46) 在 com.hibernate.demo.Application.(Application.java:17) 原因:org.h2.jdbc.JdbcSQLException:数据库可能已在使用中:null。可能的解决方案:关闭所有其他连接;采用 服务器模式 [90020-192] 在 org.h2.message.DbException.getJdbcSQLException(DbException.java:345) 在 org.h2.message.DbException.get(DbException.java:168) 在 org.h2.mvstore.db.MVTableEngine$Store.convertIllegalStateException(MVTableEngine.java:187) 在 org.h2.mvstore.db.MVTableEngine$Store.open(MVTableEngine.java:167) 在 org.h2.mvstore.db.MVTableEngine.init(MVTableEngine.java:99) 在 org.h2.engine.Database.getPageStore(Database.java:2463) 在 org.h2.engine.Database.open(Database.java:692) 在 org.h2.engine.Database.openDatabase(Database.java:270) 在 org.h2.engine.Database.(Database.java:264) 在 org.h2.engine.Engine.openSession(Engine.java:64) 在 org.h2.engine.Engine.openSession(Engine.java:176) 在 org.h2.engine.Engine.createSessionAndValidate(Engine.java:154) 在 org.h2.engine.Engine.createSession(Engine.java:137) 在 org.h2.engine.Engine.createSession(Engine.java:27) 在 org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:349) 在 org.h2.jdbc.JdbcConnection.(JdbcConnection.java:118) 在 org.h2.jdbc.JdbcConnection.(JdbcConnection.java:102) 在 org.h2.Driver.connect(Driver.java:72) 在 org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:55) ... 19 更多 引起:java.lang.IllegalStateException:文件被锁定:nio:/Development/hiber/data/contactmgr.mv.db [1.4.192/7] 在 org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:773) 在 org.h2.mvstore.FileStore.open(FileStore.java:172) 在 org.h2.mvstore.MVStore.(MVStore.java:344) 在 org.h2.mvstore.MVStore$Builder.open(MVStore.java:2893) 在 org.h2.mvstore.db.MVTableEngine$Store.open(MVTableEngine.java:154) ... 34 更多

这是我正在使用的 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>

以下是我的主要课程:

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();

【问题讨论】:

【参考方案1】:

由于 H2 db 文件已在使用中,因此引发此异常。 (可能是因为您的 db 文件存在一些不一致或类似问题)

我建议如下:

    您是否尝试过简单地删除该文件以及文件夹中属于该文件的所有其他中间文件?然后使用新的数据库文件重新启动应用程序。

    也许您已经打开应用程序两次并因此导致错误?关闭所有实例将摆脱异常。

【讨论】:

它已解决,这是您的解决方案中的第二点导致它,H2 实例在后台运行,我的应用程序试图在同一端口上旋转一个新实例,投票赞成。谢谢【参考方案2】:

如果您不想对数据库进行任何锁定,您可以配置您的数据库连接 URL,如下所示:

<property name="connection.url">jdbc:h2:./data/contactmgr;DB_CLOSE_ON_EXIT=TRUE;FILE_LOCK=NO</property>

文档:

http://h2database.com/html/advanced.html

【讨论】:

谢谢!这节省了我的时间,因为必须同时从 2 个项目中打开数据库(一个处于读/写模式,另一个处于只读模式)。

以上是关于如何解决“引起:java.lang.IllegalStateException:文件被锁定:nio:/Development/hiber/data/contactmgr.mv.db [1.4.192/的主要内容,如果未能解决你的问题,请参考以下文章

如何解决包冲突问题

如何解决包冲突问题

如何解决ajax跨域问题

MySQL 的 10048问题,如何解决?

如何解决smartgit的冲突问题

如何解决https传输图片的问题