nodejs node node.js cassandra prepared-statement

node.js - nodejs - node js cassandra insert



El controlador Cassandra nodejs DataStax no devuelve las columnas recién agregadas a través de la ejecución preparada de las declaraciones (1)

Después de agregar un par de columnas en el esquema, quiero seleccionarlas mediante select * . En su lugar, select * devuelve un conjunto antiguo de columnas y ninguna nueva.

Por recomendación de documentación, utilizo {prepare: true} para suavizar los flotantes de JavaScript y Cassandra ints / bigints difference (realmente no necesito la declaración preparada aquí en realidad, es solo para resolver este problema ResponseError: 4 o 0 byte int esperados y Tampoco quiero molestarme con query hints ).

Entonces, en la primera ejecución de select * tuve 3 columnas. Después de esto, agregué 2 columnas al esquema. select * aún devuelve 3 columnas si se usa con {prepare: true} y 5 columnas si se usa sin él.

Quiero tener una forma de actualizar de manera confiable este caché o hacer que el controlador de cassandra prepare declaraciones en cada inicio de la aplicación.

No considero que reiniciar el clúster de la base de datos sea una forma confiable.


Este es realmente un problema en Cassandra que se solucionó en 2.1.3 ( CASSANDRA-7910 ). El problema es que en la actualización del esquema, las declaraciones preparadas no se expulsan de la memoria caché en el lado de Cassandra. Si está ejecutando una versión de menos de 2.1.3 (que es probable desde que se lanzó 2.1.3 la semana pasada), realmente no hay una forma de evitar esto a menos que cree otra declaración preparada separada que sea ligeramente diferente (como extra). espacios o algo para causar una declaración única separada).

Al ejecutar con 2.1.3 y cambiar el esquema de la tabla, C * desalojará adecuadamente las declaraciones preparadas relevantes de la memoria caché, y cuando el controlador envíe otra consulta usando esa declaración, Cassandra responderá con un mensaje ''SIN PREPARACIÓN'', que debería provocar el driver nodejs para volver a preparar la consulta y reenviar la solicitud por usted.

En el controlador Node.js, puede borrar programáticamente los metadatos de declaración preparados :

client.metadata.clearPrepared();