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

Fluent NHibernate-需要多个程序访问单个、延迟加载的SQLite数据库,nhibernate,sqlite,fluent-nhibernate,Nhibernate,Sqlite,Fluent Nhibernate,我正在开发一个项目,其中有多个程序共享一个延迟加载的SQLite数据库文件,使用Fluent Nhibernate(自动映射)作为数据访问层 我开发的第一个程序(我们称之为程序1)一直保持会话打开,延迟加载工作正常 当我让程序2运行时,这种方法失败了,并试图在程序1运行时从程序2写入数据库-我遇到了“数据库锁定”异常 我通过在程序1启动后关闭会话来解决这个问题-例如 private ISessionFactory _sessionFactory; private

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

我开发的第一个程序(我们称之为程序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();
但到目前为止,我们还没有能够使这项工作。当我尝试读取数据时,即使我刚刚打开了一个会话,也会出现“无会话,或会话已关闭”异常。(对连接的测试只是一个实验,因为异常跟踪说明了在断开连接时抛出惰性异常,但没有帮助)


我做错了什么?

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

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

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

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

另一个值得尝试的好方法是


在任何情况下,多个程序现在正在成功地读写单个共享SQLite数据库。

我想,但这会增加另一层复杂性,我仍然必须解决与现在相同的问题。Gray Wizard是对的……您正在复制prog1和prog2之间的数据访问部分。如果您创建一个服务来管理会话,并为其他两个程序公开查询对象,那么您将不会遇到争用。你甚至可以疯狂地构建一个SQL解析器,将SQLite转换成一个完整的DB服务器(只是开玩笑),经过反思(并得到Mike Brown评论的支持),我意识到你是对的。对不起,我不屑一顾。我从来没有写过服务-有多困难?这很简单,取决于您使用的语言和场景的要求。在.NET世界中,您可以很容易地使用命名管道之类的东西:您能解释一下为什么这三个服务需要同时共享数据吗?它们可以合并到一个应用程序中吗?是否有理由使用sqlite而不是其他技术?为什么要使用SQLLite?sql lite不支持分布式事务。@GrayWizard-它是一个科学仪器应用程序套件。程序1主要从数据库中读取多个测量值,以便进行组分析。同时,Program2将一次收集一个测量值,并将其写入数据库。目前,这两个程序将在同一台Windows PC上运行。将它们作为单独的程序运行似乎是合理的,但这可能是一个错误。@Paco-老实说,我们使用SQLite是因为它是Fluent NHibernate附带的。我的读数表明,它应该能够进行多用户/程序访问,至少在像我们这样的低容量应用程序中是如此。但如果它被证明是一个障碍,应该很容易切换到其他东西,因为我们使用的是NHibernate。至少,这是我的希望!在这种情况下,您应该切换到其他数据库。SQLLite适用于单用户应用程序或测试Nhibernate。