2011-05-01 16 views
6

Tengo que implementar un requisito para una aplicación Java CRUD donde los usuarios deseen mantener intactos sus resultados de búsqueda incluso si realizan acciones que afecten los criterios con los que coinciden las filas devueltas.Mantener el resultado de búsqueda constante en varias transacciones

Confused? De acuerdo. Déjame darte un ejemplo familiar. En Gmail, si realiza una búsqueda avanzada en correos electrónicos no leídos, se le presentará una lista de resultados coincidentes. Haga clic en una entrada y luego regrese a la lista de búsqueda. Lo que sucede es que acaba de leer esa entrada pero no ha desaparecido del conjunto de resultados original. Solo esa línea ha cambiado de negrita a normal.

Necesito implementar exactamente el mismo comportamiento, pero la aplicación está diseñada de tal manera que cualquier transacción se conserva primero y luego la UI vuelve a consultar el archivo db para mantenerse sincronizado. La complejidad de la aplicación y el tamaño de la base de datos me impide hacer simplemente un simple almacenamiento en memoria caché de las filas correspondientes y hacer los cambios tanto en db como en memoria.

Estoy pensando en resolver el problema en el nivel de la base de datos creando una tabla intermedia en la base de datos Oracle con punteros para comparar registros y volver a consultar solo los registros para mantener la UI sincronizada con los datos. ¿Algunas ideas?

Respuesta

4

En Oracle, si abre un cursor, los resultados de ese cursor son estáticos, independientemente de si otra transacción inserta una fila que aparecerá en el cursor, o actualiza o elimina una fila que sí existe en el cursor.

El desafío entonces es no cerrar el cursor si desea resultados consistentes desde cuando se abrió el cursor.

+0

Sin embargo, solo puede recuperar un cursor una vez ... Debería abrir muchos cursores si el usuario tiene la intención de volver a la página de búsqueda varias veces. –

2

Puede usar una consulta de retroceso para leer datos del pasado. Por ejemplo, select * from employee as of timestamp to_timestap('01-MAY-2011 070000', 'DD-MON-YYYY HH24MISS');

Oracle solo almacena esta información histórica durante un período de tiempo limitado. Tendrá que buscar en su configuración de retención; el parámetro UNDO_RETENTION, la garantía de retención de espacio de tabla UNDO y el tamaño adecuado, y también los LOB tienen su propia configuración de retención.

2

Crea dos conexiones a la base de datos.

Establecer el primero en READ ONLY (usando SET TRANSACTION READ ONLY) hacer su búsqueda de esa conexión, pero asegúrese de que no fin de que la transacción mediante la emisión de una confirmación o retrotracción.

Como una transacción de solo lectura solo ve los datos tal como estaban en el momento en que comenzó la transacción, la primera conexión nunca verá ningún cambio en la base de datos, ni siquiera los comprometidos.

Luego puede hacer sus actualizaciones en la segunda conexión sin afectar los resultados en la primera conexión.

Si no puede usar dos conexiones, puede implementar las actualizaciones a través de procedimientos almacenados que utilizan transacciones autónomas, luego puede mantener abierta la transacción de solo lectura en la única conexión que tiene.

3

Si la IU mantiene una sola sesión en la base de datos, una solución es utilizar tablas temporales globales en Oracle. Cuando ejecuta una búsqueda, inserte los ID únicos en el GTT, luego la interfaz de usuario simplemente consulta el GTT.

Si la IU no mantiene la sesión abierta, puede hacer lo mismo pero con una tabla común. Entonces, por supuesto, solo tendría que agregar un código de limpieza para eliminar los resultados de búsqueda anteriores de la tabla.

+0

Esa es una idea inteligente, pero necesita algunos ajustes para ajustarse a la factura. El acceso a los datos se realiza a través de un grupo de conexiones, por lo que GTT no es adecuado. Además, la solución sugerida requiere grandes cambios en la capa de acceso a los datos, lo que a su vez puede causar efectos secundarios no deseados y problemas de rendimiento. Supongo que necesito crear una tabla temporal autocompletada usando una combinación de magia de procedimiento almacenado/activador para que las complejidades de retención de datos estén enmascaradas lejos del código tanto como sea posible. –

Cuestiones relacionadas