2

したがって、おそらく db4o で悲劇的に間違ったことをして、この問題が発生しています...しかし、コンテキストをリセットするたびに、すべてのオブジェクトが失われます。これが意味することは、(IIS のリセットなどにより) コンテナー オブジェクトが範囲外になるとすぐに、以前に永続化したオブジェクトを取得できなくなるということです。「セッション」の範囲内ですべてを取得できますが、その「セッション」が終了するとすぐに何も返されません。奇妙なのは、データベース ファイルのサイズが大きくなり続けていることです。そのため、すべてがそこにあることがわかっているため、事後に返されることはありません。何が起こっているのか分かりますか?

db4o の一般的なラッパーは次のとおりです。

public class DataStore : IDisposable {

    private static readonly object serverLock = new object();
    private static readonly object containerLock = new object();

    private static IObjectServer server;
    private static IObjectContainer container;

    private static IObjectServer Server {
        get {
            lock (serverLock) {
                if (server == null)
                    server = Db4oFactory.OpenServer(ConfigurationManager.AppSettings["DatabaseFilePath"], 0);
                return server;
            }
        }
    }

    private static IObjectContainer Container {
        get {
            lock (containerLock) {
                if (container == null)
                    container = Server.OpenClient();
                return container;
            }
        }
    }

    public IQueryable<T> Find<T>(Func<T, bool> predicate) {
        return (from T t in Container where predicate(t) select t).AsQueryable();
    }

    public IQueryable<T> Find<T>() {
        return (from T t in Container select t).AsQueryable();
    }

    public ValidationResult Save(IValidatable item) {
        var validationResult = item.Validate();
        if (!validationResult.IsValid) return validationResult;
        Container.Store(item);
        return validationResult;
    }

    public void Delete(object item) {
        Container.Delete(item);
    }

    public void Dispose() {
        Server.Close();
        Container.Close();
    }
}
4

1 に答える 1

1

Save メソッドに commit ステートメントがないと思います。

ゴラン

于 2009-10-13T10:59:33.880 に答える