代码之家  ›  专栏  ›  技术社区  ›  Tom Bushell

Fluent Nhibernate-需要多程序访问单个、延迟加载的sqlite数据库

  •  1
  • Tom Bushell  · 技术社区  · 15 年前

    我正在开发一个项目,该项目有多个程序共享一个延迟加载的sqlite数据库文件,使用FluentNHibernate(自动映射)作为数据访问层。

    我开发的第一个程序(我们称之为程序1)始终保持会话打开,并且延迟加载工作正常。

    当我让程序2运行时,这种方法失败了,并且在程序1运行时尝试从程序2写入数据库-我得到了“数据库锁定”异常。

    我通过在程序1启动后关闭会话来解决这个问题-例如

            private ISessionFactory _sessionFactory;
            private ISession _session;
    
            _sessionFactory = Database.CreateSessionFactory();
    
            _session = _sessionFactory.OpenSession(); 
            _session.BeginTransaction();
    
            // ... read the database here
    
            _session.Close();
    

    当然,当用户从用户界面中选择不同的数据集时,这就打破了程序1中的延迟加载——这是我所期望的。

    我想只要用户选择新数据,我就可以再次打开会话,然后再次关闭它-例如。

            if ( !_session.IsOpen )
                _session = _sessionFactory.OpenSession();
    
            if ( !_session.IsConnected )
                _session.Reconnect();
    
            _session.BeginTransaction();
    
            // ... read the database here
    
            _session.Close();
    

    但到目前为止,还没有能够让这项工作。当我尝试读取数据时,我得到“没有会话,或者会话已关闭”异常,即使我刚刚打开了一个会话。(对连接的测试只是一个实验,因为异常跟踪说了一些关于断开连接时抛出延迟异常的内容,但没有帮助)

    我做错什么了?

    2 回复  |  直到 13 年前
        1
  •  2
  •   GrayWizardx    15 年前

    您是否可以构建一个由第一个应用程序启动的服务层来调用它(如果您在Windows框中,则注册为Windows服务),然后让每个人都调用该服务以从中获取数据?

    我不是说要有一个单独的服务器,只是你的程序调用的一个单独的服务。

        2
  •  0
  •   Community CDub    8 年前

    在我出于其他原因重构了一些会话管理代码之后,“数据库锁定”异常神秘地消失了。(主要的更改是为所有DB访问使用事务,并确保所有事务和会话对象都得到正确的处理—主要是通过将它们封闭在“使用”块中来实现)。

    This link 讨论由丢失的释放导致的类似问题。我怀疑这可能是我的问题,但我不确定。

    另一个好的尝试来源是 Database file is inexplicably locked during SQLite commit

    在任何情况下,多个程序现在都可以成功地读写一个共享的sqlite数据库。