diff --git a/quartz/src/main/java/org/quartz/impl/jdbcjobstore/DriverDelegate.java b/quartz/src/main/java/org/quartz/impl/jdbcjobstore/DriverDelegate.java index 3e8f1d662..868377759 100644 --- a/quartz/src/main/java/org/quartz/impl/jdbcjobstore/DriverDelegate.java +++ b/quartz/src/main/java/org/quartz/impl/jdbcjobstore/DriverDelegate.java @@ -605,6 +605,20 @@ int updateTriggerStatesForJobFromOtherState(Connection conn, */ int selectNumTriggersForJob(Connection conn, JobKey jobKey) throws SQLException; + /** + *

+ * Check if there are more tiggers associated with a given job. + *

+ * + * @param connection + * @param jobKey + * @return + * @throws SQLException + */ + default boolean hasMoreTriggersForJob(Connection connection, JobKey jobKey) throws SQLException { + return selectNumTriggersForJob(connection, jobKey) > 0; + } + /** *

* Select the job to which the trigger is associated. diff --git a/quartz/src/main/java/org/quartz/impl/jdbcjobstore/JobStoreSupport.java b/quartz/src/main/java/org/quartz/impl/jdbcjobstore/JobStoreSupport.java index 2bb1c23a5..97c454314 100644 --- a/quartz/src/main/java/org/quartz/impl/jdbcjobstore/JobStoreSupport.java +++ b/quartz/src/main/java/org/quartz/impl/jdbcjobstore/JobStoreSupport.java @@ -1460,9 +1460,7 @@ protected boolean removeTrigger(Connection conn, TriggerKey key) deleteTriggerAndChildren(conn, key); if (null != job && !job.isDurable()) { - int numTriggers = getDelegate().selectNumTriggersForJob(conn, - job.getKey()); - if (numTriggers == 0) { + if (!getDelegate().hasMoreTriggersForJob(conn, job.getKey())) { // Don't call removeJob() because we don't want to check for // triggers again. deleteJobAndChildren(conn, job.getKey()); diff --git a/quartz/src/main/java/org/quartz/impl/jdbcjobstore/StdJDBCConstants.java b/quartz/src/main/java/org/quartz/impl/jdbcjobstore/StdJDBCConstants.java index 6299ae463..f925b5e13 100644 --- a/quartz/src/main/java/org/quartz/impl/jdbcjobstore/StdJDBCConstants.java +++ b/quartz/src/main/java/org/quartz/impl/jdbcjobstore/StdJDBCConstants.java @@ -434,6 +434,11 @@ public interface StdJDBCConstants extends Constants { + " AND " + COL_JOB_NAME + " = ? AND " + COL_JOB_GROUP + " = ?"; + String SELECT_TRIGGER_NAMES_FOR_JOB = "SELECT TRIGGER_NAME" + + " FROM " + TABLE_PREFIX_SUBST + TABLE_TRIGGERS + + " WHERE " + COL_SCHEDULER_NAME + " = " + SCHED_NAME_SUBST + + " AND " + COL_JOB_NAME + " = ? AND " + COL_JOB_GROUP + " = ?"; + String SELECT_JOB_FOR_TRIGGER = "SELECT J." + COL_JOB_NAME + ", J." + COL_JOB_GROUP + ", J." + COL_IS_DURABLE + ", J." + COL_JOB_CLASS + ", J." + COL_REQUESTS_RECOVERY + " FROM " + TABLE_PREFIX_SUBST diff --git a/quartz/src/main/java/org/quartz/impl/jdbcjobstore/StdJDBCDelegate.java b/quartz/src/main/java/org/quartz/impl/jdbcjobstore/StdJDBCDelegate.java index a4ceb12a1..9b942a4ee 100644 --- a/quartz/src/main/java/org/quartz/impl/jdbcjobstore/StdJDBCDelegate.java +++ b/quartz/src/main/java/org/quartz/impl/jdbcjobstore/StdJDBCDelegate.java @@ -1616,6 +1616,39 @@ public int selectNumTriggersForJob(Connection conn, JobKey jobKey) throws SQLExc } /** + *

+ * Check if there are more tiggers associated with a given job. + *

+ * + * @param connection + * @param jobKey + * @return + * @throws SQLException + */ + @Override + public boolean hasMoreTriggersForJob(Connection connection, JobKey jobKey) throws SQLException { + PreparedStatement ps = null; + ResultSet rs = null; + try { + ps = connection.prepareStatement(rtp(SELECT_TRIGGER_NAMES_FOR_JOB)); + ps.setString(1, jobKey.getName()); + ps.setString(2, jobKey.getGroup()); + ps.setMaxRows(1); + ps.setFetchSize(1); + rs = ps.executeQuery(); + + int count = 0; + while (rs.next()) { + count ++; + } + return count > 0; + } finally { + closeResultSet(rs); + closeStatement(ps); + } + } + + /** *

* Select the job to which the trigger is associated. *