2014-10-21 6 views
10

I Quartz verwenden in gruppierten ModusQuartz org.quartz.jobStore.selectWithLockSQL Zeilensperre

Ich habe einige Zeilensperre Anstoß auf DB-Ebene durch übermäßigen Anruf verursacht:

org.quartz.jobStore.selectWithLockSQL

"SELECT * FROM QRTZ_LOCKS WHERE SCHED_NAME =" SYS_B_0" AND lock_name =: 1 FOR UPDATE“

I Quarz docs lesen und ist noch nicht ganz klar zu mir, warum ist obige Abfrage ausgeführt wird.

Welchen Zweck hat diese Zeilensperre?

Grüße

+2

Werfen Sie einen Blick auf https://jira.terracotta.org/jira/browse/QTZ-35. JIRA ist geschlossen mit "wird nicht behoben" aber hat nützliche Informationen – blob

Antwort

3

Die Schleusen Tabelle durch Quarz ist für die Koordination mehrerer Schedulern verwendet, wenn im Cluster-Modus eingesetzt. In einem Cluster sollte nur ein Knoten den Trigger auslösen. Daher wird eine Sperre verwendet, um zu vermeiden, dass mehrere Knoten denselben Trigger erhalten.

Vom clustering Abschnitt der Dokumentation (http://quartz-scheduler.org/generated/2.2.1/html/qs-all/#page/Quartz_Scheduler_Documentation_Set%2Fre-cls_cluster_configuration.html%23):

Clustering derzeit nur mit den JDBC-Jobstor (JobStoreTX oder JobStoreCMT), und im wesentlichen wirkt, indem es mit jedem Knoten des Clusters Teile arbeitet die gleiche Datenbank. Der Lastausgleich findet automatisch statt, wobei jeder Knoten des Clusters so schnell wie möglich zündet. Wenn die Auslösezeit eines Triggers auftritt, ist der erste Knoten, der es erhält (indem es eine Sperre auf setzt) ​​der Knoten, der es auslöst.

+2

Ich habe ein ähnliches Problem. Ich verstehe die Logik hinter der Abfrage, aber ich kann auch nicht verstehen, warum sie so oft ausgeführt wird. In meinem Fall wird die Abfrage für einen Job, der alle 10 Minuten ausgeführt wird, mehr als 11000 Mal pro Stunde ausgeführt! Bist du zu irgendeinem Schluss gekommen? –