流畅的NHibernate - 需要多个程序访问单个,延迟加载的SQLite数据库

时间:2009-12-19 00:59:35

标签: nhibernate sqlite fluent-nhibernate

我正在使用Fluent Nhibernate(自动映射)作为数据访问层,开发一个包含多个程序的项目,这些程序共享一个延迟加载的SQLite数据库文件。

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

当程序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 个答案:

答案 0 :(得分:2)

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

我不是在谈论拥有一个单独的服务器,而只是一个程序调用的单独服务。

答案 1 :(得分:0)

由于其他原因我重构了一些会话管理代码后,“数据库锁定”异常神秘地消失了。 (主要的变化是使用事务进行所有数据库访问,并确保所有事务和会话对象都已正确处理 - 主要是将它们包含在“使用”块中。)

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

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

在任何情况下,多个程序现在都可以成功读取和写入单个共享SQLite数据库。