gpt4 book ai didi

c# - Cassandra Csharp 驱动程序中的准备语句缓存问题

转载 作者:行者123 更新时间:2023-11-30 14:26:44 26 4
gpt4 key购买 nike

我相信我发现了一个错误,该错误涉及如何将准备好的语句缓存在 Cassandra csharp 驱动程序(版本 2.7.3)的 StatementFactory 中。这是用例。

Guid key = Guid.NewGuid(); // your key

ISession session_foo = new Session("foo"); //This is pseudo code
ISession session_bar = new Session("bar");

var foo_mapper = new Mapper(session_foo); //table foo_bar
var bar_mapper = new Mapper(session_bar); //table foo_bar

await Task.WhenAll(
foo_mapper.DeleteAsync<Foo>("WHERE id = ?", key),
bar_mapper.DeleteAsync<Bar>("WHERE id = ?", key));

我们发现运行这个删除后,只有第一个请求成功了。在深入了解 StatementFactory 的源代码之后

public Task<Statement> GetStatementAsync(ISession session, Cql cql)
{
if (cql.QueryOptions.NoPrepare)
{
// Use a SimpleStatement if we're not supposed to prepare
Statement statement = new SimpleStatement(cql.Statement, cql.Arguments);
SetStatementProperties(statement, cql);
return TaskHelper.ToTask(statement);
}
return _statementCache
.GetOrAdd(cql.Statement, session.PrepareAsync)
.Continue(t =>
{
if (_statementCache.Count > MaxPreparedStatementsThreshold)
{
Logger.Warning(String.Format("The prepared statement cache contains {0} queries. Use parameter markers for queries. You can configure this warning threshold using MappingConfiguration.SetMaxStatementPreparedThreshold() method.", _statementCache.Count));
}
Statement boundStatement = t.Result.Bind(cql.Arguments);
SetStatementProperties(boundStatement, cql);
return boundStatement;
});
}

可以看到缓存只用到了cql语句。在我们的例子中,我们在不同的键空间(又名 session )中有相同的表名。我们在两个查询中的 cql 语句看起来是一样的。即 DELETE FROM foo_bar WHERE id =?

如果非要我猜的话,我会说一个简单的修复方法是将 cql 语句和键空间组合在一起作为缓存键。

以前有其他人遇到过这个问题吗?

最佳答案

作为一个简单的解决方法,我使用 DoNotPrepare 跳过缓存

await _mapper.DeleteAsync<Foo>(Cql.New("WHERE id = ?", key).WithOptions(opt => opt.DoNotPrepare()));

我还发现了一个关于 Datastax 的未决问题

关于c# - Cassandra Csharp 驱动程序中的准备语句缓存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34612595/

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