2010-09-03 10 views
1

Je suis confronté à une exigence particulière qui est la suivante:
Une opération réseau-intensive est déclenchée à un serveur par plusieurs clients, via une interface Web. Cependant, une seule opération est autorisée à la fois et, par conséquent, une entrée (tuple) est créée dans une table SQL pour indiquer que l'opération est en cours. Une fois l'opération terminée (indépendamment du succès ou de l'échec), le résultat approprié est affiché sur le ou les clients et le tuple correspondant est supprimé de la table SQL.
Étant donné que l'opération nécessite beaucoup de ressources, un scénario dans lequel l'opération doit être "considérée" comme devant être annulée, après un certain temps d'attente (10 minutes) doit être introduit.
Existe-t-il une façon d'associer la durée de vie d'une ligne dans SQL à une valeur de délai d'attente, de sorte qu'elle est supprimée après un certain temps? Mon application est principalement écrite en Java 1.5 et EJB 3.0, en utilisant JPA/Hibernate pour accéder au moteur de base de données Oracle 10g.Comment supprimer un tuple d'une table SQL après un timeout?

Merci d'avance.

Cordialement,
Nagendra U M

+0

Avez-vous envisagé d'utiliser DBMS_LOCK pour acquérir un verrou nommé au lieu d'une table de base de données? –

Répondre

0

Je ne sais pas qu'Oracle a ce genre d'installation mais je pense qu'aucun moteur DB n'a cela.

Si vous voulez le faire au niveau DB,

  1. vous devez avoir une colonne datetime, par exemple .; 'CreatedDate' dans tableau. Cette colonne aura date/heure lors de la création de l'enregistrement. Ecrivez une procédure et placez-la dans une tâche horaire . Ce travail sera exécuté toutes les 10 minutes et supprimera les enregistrements de 10 minutes. La requête sera comme ceci.

T-SQL: Veuillez le convertir en fonction de votre moteur db.

DELETE FROM yourtable WHERE CreatedDate < DATEADD(mi, -10, GETDATE()) 

Ceci supprimera tous les enregistrements datant de plus de 10 minutes de la table.

Ceci est juste pour vous donner une idée du travail de planification. C'est dans SQL Server. Je ne sais pas sur Oracle

step_by_step_guide_to_add_a_sql_job_in_sql_server_2005

0

On dirait que vous implémentez un mutex en utilisant la base de données, jetez un oeil à this question et voir si ça aide? Des sons comme l'accès transactionnel à une table de drapeau résoudra cela pour vous, tant que vous obtenez les deux états d'échec de votre code serveur.

+0

EXACTEMENT !! Le but de ma table SQL est de s'assurer qu'une seule opération se passe à la fois. Mais dans le cas où il n'y a pas de réponse du serveur, même après une longue période, alors j'ai besoin d'un moyen de gérer les délais, afin que je puisse libérer l'opération à effectuer par d'autres clients. c'est-à-dire, pour retirer l'entrée de la table après 10 minutes. Comment cela peut-il être fait? de toute façon à travers des instructions SQL natives ou même JPA? Et, merci pour la réponse rapide. :-) –

+0

Votre transaction pourrait se lire comme suit: 'begin tran; s'il n'existe pas (sélectionner 1 dans la table où a été démarré> = dateadd (mi, -10, getdate())) begin; insérer dans la table ..., getdate(); fin; commit' - que ce soit, ou quel que soit le processus décide d'arrêter l'exécution de votre opération réseau intense, met également à jour la table –

1

Je suggère que vous essayez d'utiliser une colonne d'horodatage contenant l'heure de début de la tâche. Un déclencheur before peut alors être fait pour supprimer l'ancienne colonne avant qu'une nouvelle soit insérée si la tâche a expiré.

Si vous voulez avoir plusieurs tâches avec des délais d'attente différents, vous pouvez même ajouter une colonne avec le délai en secondes. Il suffit de coder votre déclencheur en conséquence.

Questions connexes