gpt4 book ai didi

RavenDB - 一个客户端无法看到另一客户端的更改

转载 作者:行者123 更新时间:2023-12-03 03:07:37 24 4
gpt4 key购买 nike

我正在运行我的应用程序的两个实例。在一种情况下,我保存了我的一个实体。当我检查 RavenDB (http://localhost:8080/raven) 时,我可以看到变化。然后,在我的另一个客户端中,我执行此操作(如下),但我没有看到其他应用程序的更改。我需要做什么才能获取数据库中的最新数据?

public IEnumerable<CustomVariableGroup> GetAll()
{
return Session
.Query<CustomVariableGroup>()
.Customize(x => x.WaitForNonStaleResults());
}

编辑:如果我尝试进行更改并获得并发异常,则上面的代码有效。之后,当我调用刷新(调用上面的代码)时,它就起作用了。

这是执行保存的代码:

public void Save<T>(T objectToSave)
{
Guid eTag = (Guid)Session.Advanced.GetEtagFor(objectToSave);
Session.Store(objectToSave, eTag);
Session.SaveChanges();
}

这是包含数据库和 session 的类:

public abstract class DataAccessLayerBase
{
/// <summary>
/// Gets the database.
/// </summary>
protected static DocumentStore Database { get; private set; }

/// <summary>
/// Gets the session.
/// </summary>
protected static IDocumentSession Session { get; private set; }

static DataAccessLayerBase()
{
if (Database != null) { return; }

Database = GetDatabase();
Session = GetSession();
}

private static DocumentStore GetDatabase()
{
string databaseUrl = ConfigurationManager.AppSettings["databaseUrl"];

DocumentStore documentStore = new DocumentStore();

try
{
//documentStore.ConnectionStringName = "RavenDb"; // See app.config for why this is commented.
documentStore.Url = databaseUrl;
documentStore.Initialize();
}
catch
{
documentStore.Dispose();
throw;
}

return documentStore;
}

private static IDocumentSession GetSession()
{
IDocumentSession session = Database.OpenSession();

session.Advanced.UseOptimisticConcurrency = true;

return session;
}
}

最佳答案

缺乏更详细的信息和一些代码,我只能猜测......

请确保在 session 中调用 .SaveChanges()。如果没有显式指定 ITransaction,您的 IDocumentSession 将在打开和调用 .SaveChanges 之间被隔离和事务化。所有操作要么成功,要么全部失败。但如果您不调用它,您之前的所有 .Store 调用都将丢失。

如果我错了,请发布有关您的代码的更多详细信息。


编辑:第二个答案(在附加信息之后):

您的问题与 RavenDB 在客户端缓存的方式有关。默认情况下,RavenDB 会缓存整个 DocumentSession 中的每个 GET 请求。普通查询只是 GET 查询(不,无论您的索引是动态索引还是预先手动定义的索引,它都无关),因此它们将被缓存。应用程序中的解决方案是处置 session 并打开一个新 session 。

我建议您重新考虑您的 session 生命周期。看来您的 session 持续时间太长,否则这种并发性就不会成为问题。如果您正在构建网络应用程序,我建议您以请求的开头和结尾来打开和关闭 session 。看看 RaccoonBlog,看看它的实现是否优雅。

关于RavenDB - 一个客户端无法看到另一客户端的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8671375/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com