Problema de almacenamiento en caché de declaraciones preparadas en el controlador Cassandra Csharp
Creo que he encontrado un error con la lógica de cómo una declaración preparada se almacena en caché en el StatementFactory en el controlador Cassandra csharp (versión 2.7.3). Aquí está el caso de uso.
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));
Hemos descubierto que después de ejecutar esta eliminación, solo la primera solicitud tiene éxito. Después de sumergirse en el código fuente deStatementFactory
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;
});
}
Puede ver que el caché solo usa la instrucción cql. En nuestro caso, tenemos los mismos nombres de tabla en diferentes espacios de teclas (también conocidos como sesiones). Nuestra declaración cql en ambas consultas se ve igual. es decirELIMINAR DE foo_bar DONDE id =?.
Si tuviera que adivinar, diría que una solución simple sería combinar la instrucción cql y el espacio de teclas juntos como la clave de caché.
¿Alguien más se ha encontrado con este problema antes?