From: <sc...@hy...> - 2009-12-07 21:31:19
|
Author: scottmf Date: 2009-12-07 13:31:07 -0800 (Mon, 07 Dec 2009) New Revision: 14045 URL: http://svn.hyperic.org/?view=rev&root=Hyperic+HQ&revision=14045 Modified: trunk/src/org/hyperic/hq/events/server/session/EventsStartupListener.java Log: [HHQ-3593] hoping that by executing statements in batch it will avoid a small window of time where new RegisteredTriggers with deleted=1 are updated/inserted to avoid foreign key constraint errors. Modified: trunk/src/org/hyperic/hq/events/server/session/EventsStartupListener.java =================================================================== --- trunk/src/org/hyperic/hq/events/server/session/EventsStartupListener.java 2009-12-07 21:30:43 UTC (rev 14044) +++ trunk/src/org/hyperic/hq/events/server/session/EventsStartupListener.java 2009-12-07 21:31:07 UTC (rev 14045) @@ -83,7 +83,7 @@ triggerEvents.add(TriggersCreatedZevent.class); ZeventManager.getInstance().addBufferedListener( - triggerEvents, new TriggersCreatedListener()); + triggerEvents, new TriggersCreatedListener()); cleanupRegisteredTriggers(); } @@ -91,34 +91,63 @@ private void cleanupRegisteredTriggers() { Connection conn = null; Statement stmt = null; + Boolean autocommit = null; + boolean commit = false; try { conn = DBUtil.getConnByContext( new InitialContext(), HQConstants.DATASOURCE); + autocommit = Boolean.valueOf(conn.getAutoCommit()); + conn.setAutoCommit(false); stmt = conn.createStatement(); - int rows = stmt.executeUpdate( + stmt.addBatch( "update EAM_ALERT_CONDITION set trigger_id = null " + "WHERE exists (" + "select 1 from EAM_ALERT_DEFINITION WHERE deleted = '1' " + "AND EAM_ALERT_CONDITION.alert_definition_id = id" + ")"); - _log.info("disassociated " + rows + " triggers in EAM_ALERT_CONDITION" + - " from their deleted alert definitions"); - rows = stmt.executeUpdate( + stmt.addBatch( "delete from EAM_REGISTERED_TRIGGER WHERE exists (" + "select 1 from EAM_ALERT_DEFINITION WHERE deleted = '1' " + "AND EAM_REGISTERED_TRIGGER.alert_definition_id = id" + ")"); - _log.info("deleted " + rows + " rows from EAM_REGISTERED_TRIGGER"); + int[] rows = stmt.executeBatch(); + conn.commit(); + commit = true; + _log.info("disassociated " + rows[0] + " triggers in EAM_ALERT_CONDITION" + + " from their deleted alert definitions"); + _log.info("deleted " + rows[1] + " rows from EAM_REGISTERED_TRIGGER"); } catch (SQLException e) { _log.error(e, e); } catch (NamingException e) { _log.error(e, e); } finally { + resetAutocommit(conn, autocommit); + if (!commit) rollback(conn); DBUtil.closeJDBCObjects( EventsStartupListener.class.getName(), conn, stmt, null); } } + private void rollback(Connection conn) { + try { + if (conn != null) { + conn.rollback(); + } + } catch (SQLException e) { + _log.error(e, e); + } + } + + private void resetAutocommit(Connection conn, Boolean autocommit) { + try { + if (autocommit != null) { + conn.setAutoCommit(autocommit.booleanValue()); + } + } catch (SQLException e) { + _log.error(e, e); + } + } + private void loadConfigProps(String prop) { try { String property = System.getProperty(prop); |