2009-12-19 85 views
1

我正在开发具有共享单一,延迟加载SQLite数据库文件中的多个程序,使用功能NHibernate(自动映射)作为数据项目多程序访问接入层。功能NHibernate - 需要一个单一的,延迟加载SQLite数据库

我公司开发的第一个程序(我们称之为程序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(); 

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

我在做什么错?

+0

您能否解释为什么三种服务需要同时共享数据?他们可以合并成一个应用程序?有没有理由使用SQLite而不是其他技术? – GrayWizardx 2009-12-19 01:51:19

+0

你为什么要sql lite? sql lite不支持分布式事务。 – Paco 2009-12-19 11:17:14

+0

@GrayWizard - 这是一个科学的仪器应用套件。程序1将主要从数据库中读取多个测量值用于组分析。同时,Program2将一次收集一次测量结果,并将其写入数据库。目前,这两个程序都将运行在同一台Windows PC上。把它们作为单独的程序似乎是合理的,但也许这是一个错误。 – 2009-12-19 21:57:14

回答

0

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

This link讨论,是由缺少处置造成了类似的问题。我怀疑这可能是我的问题,但我不确定。

的东西去尝试另一种很好的来源是Database file is inexplicably locked during SQLite commit

在任何情况下,多个节目,目前正在顺利读取和写入到一个共享的SQLite数据库。

2

是否有可能为你建立这是由第一个应用程序启动称之为一个服务层(或注册为Windows服务,如果你是在Windows中),然后让每个人都打电话到该服务,以获得他们的数据来自?

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

+0

我想,但这会增加另一层复杂性,我仍然必须解决我现在遇到的同样的问题。 – 2009-12-19 01:26:22

+1

灰色向导是正确的...你正在复制prog1和prog2之间的数据访问部分。如果您创建管理会话的服务并公开其他两个程序的查询对象,则不会出现争用情况。你甚至可以发疯,并建立一个SQL解析器,将SQLite变成一个完整的数据库服务器(只是在开玩笑) – 2009-12-19 01:39:42

+0

经过反思(并且得到了Mike Brown的评论的加强),我意识到你是对的。抱歉不屑一顾。我从来没有写过一项服务 - 这有多困难? – 2009-12-19 21:45:36