我正在开发具有共享单一,延迟加载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();
但是到目前为止,还没有能够得到这个工作。当我尝试读取数据时,即使我刚刚打开了一个会话,我也会得到“没有会话或会话已关闭”异常。 (连接测试只是一个实验,因为异常跟踪说了一些关于在断开连接时抛出惰性异常的情况,但它没有帮助)
我在做什么错?
您能否解释为什么三种服务需要同时共享数据?他们可以合并成一个应用程序?有没有理由使用SQLite而不是其他技术? – GrayWizardx 2009-12-19 01:51:19
你为什么要sql lite? sql lite不支持分布式事务。 – Paco 2009-12-19 11:17:14
@GrayWizard - 这是一个科学的仪器应用套件。程序1将主要从数据库中读取多个测量值用于组分析。同时,Program2将一次收集一次测量结果,并将其写入数据库。目前,这两个程序都将运行在同一台Windows PC上。把它们作为单独的程序似乎是合理的,但也许这是一个错误。 – 2009-12-19 21:57:14