2011-09-18 15 views
5

Oracle database change notification feature envía rowids (direcciones de filas físicas) en las inserciones, actualizaciones y eliminaciones de filas. Tal como se indica en la documentación del oráculo, la aplicación puede usar esta función para crear una memoria caché de nivel medio. Pero esto parece contradecirse cuando tenemos una mirada detallada sobre cómo funcionan las identificaciones de fila.Oracle Database Change Notification y ROWID

Las direcciones de filas físicas (ROWID) pueden cambiar cuando se realizan varias operaciones de la base de datos como se indica en this stackoverflow thread. Además de esto, como tom menciona en este thread, las tablas agrupadas pueden tener los mismos rowids.

Basado en la investigación anterior, no parece ser seguro usar el rowid enviado durante la notificación de cambio de base de datos como la clave en el caché de la aplicación, ¿verdad? Esto también genera una pregunta sobre: ​​¿Debería utilizarse la función de notificación de cambio de base de datos para generar un caché de servidor de aplicaciones? o ¿se hace una recomendación para reiniciar todos los clústeres de servidores de aplicaciones (para volver a cargar/actualizar la caché) cuando las tablas de los objetos en caché se someten a cualquier operación que provoque que rowid's cambie? ¿Sería una buena suposición para entornos de producción?

+0

¿Por qué no confía en entidades comerciales/atributos de dominio? – zerkms

+0

No entendí completamente su recomendación. Con la notificación de cambio de base de datos, Oracle solo envía números de fila para las filas insertadas/actualizadas. No se puede configurar para proporcionar otra información de columna en esa tabla. –

+0

sí, y ¿por qué no crea una capa de almacenamiento en caché sobre su capa de acceso a datos, basándose en datos comerciales, no relacionados con el almacenamiento? ¿Crees que puedes almacenar en caché los datos mejor que Oracle? – zerkms

Respuesta

5

Me parece que ninguna de las operaciones que potencialmente pueden cambiar el ROWID es una operación que se llevaría a cabo en un entorno productivo mientras se ejecuta la aplicación. Además, he visto un montón de software productivo que usa la transacción ROWID entre transacciones (generalmente solo por unos segundos o minutos). Ese software probablemente fallaría antes de su caché si el ROWID cambiara. Por lo tanto, me parece razonable crear una caché de base de datos basada en la notificación de cambio. Solo proporcione una pequeña exención de responsabilidad con respecto a ROWID.

La única operación algo problemática es una actualización que causa un movimiento a otra partición. Pero eso es algo que rara vez sucede porque derrota el propósito de la partición, al menos si se produce con regularidad. El diseñador de un esquema de base de datos particular podrá decirle si tal operación puede ocurrir y es relevante para el almacenamiento en caché. Si ninguna de las tablas tiene configurado ENABLE ROW MOVEMENT, ni siquiera tiene que preguntarle al diseñador.

En cuanto a duplicar ROWID: ROWIDs no son únicos a nivel mundial, son únicos dentro de una tabla. Y le dan tanto el nombre ROWID como el nombre de la tabla en la notificación de cambio. Entonces la tupla de ROWID y el nombre de la tabla es una clave única perfecta para construir un caché confiable.

+0

Suena bien. Mientras investigaba más sobre este tema vine a través de tablas organizadas por índice (IOT). Tienen rowids lógicos que pueden cambiar ya que las filas se almacenan de una manera ordenada. Entonces, al usar DCN, siempre debemos asegurarnos de que la tabla de la base de datos no sea una tabla organizada por índice, ¿verdad? –