如何解决“由以下原因引起:java.lang.IllegalStateException:文件被锁定:nio:/Development/hiber/data/contactmgr.mv.db [1.4.192 / 7]”

问题描述 投票:4回答:2

我试图使用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:在org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator上调用Driver#connect时出错。$ 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)at org位于org.hibernate.boot的org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:106)中的.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.createConnection(BasicConnectionCreator.java:75) .registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServi) ceRegistryImpl.java:234)org.hibernate上的org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:260)位于org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService的org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)中的.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:94) (AbstractServiceRegistryImpl.java:234)org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:147)org。 org.hibernate.service.internal.AbstractServiceRegistryImpl.in中的hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:272) itializeService(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)位于com.hibernate.demo.Application.buildSesssionFactory上的org.hibernate.metamodel.MetadataSources.buildMetadata(MetadataSources.java:151)(Application.java: 46)在com.hibernate.demo.Application。(Application.java:17)引起: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]。 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)atg.h2.engine.Database.open(Database.java:692)atg.h2.engine.Database.openDatabase(Database .java:270)org.h2.engine.Database。(Database.java:264)atg.h2.engine.Engine.openSession(Engine.java:64)atg.h2.engine.Engine.openSession(Engine) .java:176)org.h2.engine.Engine.createSessionAndValidate(Engine.java:154)org.h2.engine.Engine.createSession(Engine.java:137)atg.h2.engine.Engine.createSession( Engine.java:27)org.h2.jdbc.JdbcConnection上的org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:349)。(JdbcConnec在org.hibernate.engine.jdbc.connections.internal的org.h2.jdbc.JdbcConnection。(JdbcConnection.java:102)org.h2.Driver.connect(Driver.java:72)处.ed.java:118。 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)atg.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("[email protected]").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();
java hibernate spring-boot h2
2个回答
3
投票

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

我建议如下:

  1. 您是否尝试在文件夹中删除文件和属于它的所有其他中间文件?之后只需使用新的db文件重新启动应用程序。
  2. 也许你已经打开了两次应用程序,从而导致错误?关闭所有实例将消除异常。

1
投票

如果您不希望对数据库进行任何锁定,则可以按如下方式配置数据库连接URL:

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

文件:

© www.soinside.com 2019 - 2024. All rights reserved.