我按照这里的示例:http://developer.db4o.com/Forums/tabid/98/aft/10114/Default.aspx使用HttpModule使用db4o设置我的MVC2应用程序。我也开放了一个LINQPad实例来查询数据。 Web应用程序看起来像魅力,但LINQPad不断获取DatabaseFileLockedExceptions,直到我关闭Web服务器。
正如我所说,我几乎逐字地使用Gamlor的HttpModule(使用ClientServer而不是嵌入式是唯一的区别),这是我的LINQPad代码:
01 void Main()
02 {
03 using(var server = Db4oClientServer.OpenServer(db4opath, 0))
04 {
05 using(var db = server.OpenClient()){
06 var result = (from Object o in db select o);
07 result.Dump();
08 }
09 }
10 }
11
12 private string db4opath = @"C:\blah\blah\blah\blah.db4o";
如果Web服务器没有运行,LINQPad代码可以正常工作。
我做错了什么?
答案 0 :(得分:2)
当您打开db4o数据库时,它会锁定数据库文件以防止损坏。这意味着在服务器运行时,数据库文件将被锁定,其他进程无法访问它。 (是的,有一种方法可以禁用它,但这几乎肯定会破坏数据库)
您的网络服务器是否也在运行客户端服务器模式?如果是这种情况,您可以连接正在运行的db4o-instance。您也可以先尝试连接,只有在直接打开服务器失败时才能进行连接?
如果您只在ASP.NET应用程序中使用嵌入式客户端服务器,则可以将其更改为用于实际客户端服务器的调试目的。 ASP.NET仅使用嵌入式客户端。但它可以让你连接LINQ-Pad。
回答评论:
您需要打开fully server,它支持通过网络连接的客户端。例如:
// in your application
int PortNumber = 8888;
using(var server = Db4oClientServer.OpenServer("database.db4",PortNumber))
{
server.GrantAccess("debug-user","debug-pwd");
// application uses embedded client:
using(var container = server.OpenClient())
{
// your application does stuff
}
}
然后在LINQPad中:
using(var client = Db4oClientServer.OpenClient("localhost",8888,"debug-user","debug-pwd"))
{
// do stuff
}