我正在使用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();
但到目前为止,还没有能够让这个工作。当我尝试读取数据时,我得到“没有会话或会话已关闭”异常,即使我刚刚打开一个会话。 (连接的测试只是一个实验,因为异常跟踪说了一些关于在断开连接时抛出惰性异常的东西,但它没有帮助)
我做错了什么?
答案 0 :(得分:2)
您是否可以构建一个服务层,该服务层由第一个应用程序启动来调用它(如果您在Windows机器上,则注册为Windows服务),然后让每个人都调用该服务来获取其数据从?
我不是在谈论拥有一个单独的服务器,而只是一个程序调用的单独服务。
答案 1 :(得分:0)
由于其他原因我重构了一些会话管理代码后,“数据库锁定”异常神秘地消失了。 (主要的变化是使用事务进行所有数据库访问,并确保所有事务和会话对象都已正确处理 - 主要是将它们包含在“使用”块中。)
This link讨论了由于丢失Dispose而导致的类似问题。我怀疑这可能是我的问题,但我不确定。
另一个值得尝试的好事来源是Database file is inexplicably locked during SQLite commit
在任何情况下,多个程序现在都可以成功读取和写入单个共享SQLite数据库。