From 39c16cf436ce7eae8b1bcede2b2ffe653efbc61f Mon Sep 17 00:00:00 2001 From: chenson42 Date: Thu, 13 Mar 2014 17:20:48 +0000 Subject: [PATCH] 0001644: SQL Optimizations --- .../service/impl/TriggerRouterService.java | 65 +++++++++++++------ 1 file changed, 46 insertions(+), 19 deletions(-) diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/TriggerRouterService.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/TriggerRouterService.java index 3df29c4441..cb230393e2 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/TriggerRouterService.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/TriggerRouterService.java @@ -473,7 +473,7 @@ private String getTriggerRouterSql(String sql) { } public List getTriggerRouters() { - return sqlTemplate.query(getTriggerRouterSql(), new TriggerRouterMapper()); + return sqlTemplate.query(getTriggerRouterSql(), new TriggerRouterMapper(configurationService.getNodeGroupLinks())); } public Set getTriggerRouterForTableForCurrentNode(String catalogName, @@ -664,7 +664,7 @@ public Router getActiveRouterByIdForCurrentNode(String routerId, boolean refresh public List getRoutersByGroupLink(NodeGroupLink link) { return sqlTemplate.query( getSql("select", "selectRoutersColumnList", "selectRouterByNodeGroupLinkWhereSql"), - new RouterMapper(), link.getSourceNodeGroupId(), link.getTargetNodeGroupId()); + new RouterMapper(configurationService.getNodeGroupLinks()), link.getSourceNodeGroupId(), link.getTargetNodeGroupId()); } public Trigger getTriggerForCurrentNodeById(String triggerId) { @@ -726,13 +726,13 @@ public Router getRouterById(String routerId, boolean refreshCache) { public List getRouters() { return sqlTemplate.query(getSql("select ", "selectRoutersColumnList", "selectRoutersSql"), - new RouterMapper()); + new RouterMapper(configurationService.getNodeGroupLinks())); } public List getAllTriggerRoutersForCurrentNode(String sourceNodeGroupId) { List triggerRouters = (List) sqlTemplate.query( getTriggerRouterSql("activeTriggersForSourceNodeGroupSql"), - new TriggerRouterMapper(), sourceNodeGroupId); + new TriggerRouterMapper(configurationService.getNodeGroupLinks()), sourceNodeGroupId); mergeInConfigurationTablesTriggerRoutersForCurrentNode(sourceNodeGroupId, triggerRouters); return triggerRouters; } @@ -740,13 +740,13 @@ public List getAllTriggerRoutersForCurrentNode(String sourceNodeG public List getAllTriggerRoutersForReloadForCurrentNode( String sourceNodeGroupId, String targetNodeGroupId) { return sqlTemplate.query( - getTriggerRouterSql("activeTriggersForReloadSql"), new TriggerRouterMapper(), + getTriggerRouterSql("activeTriggersForReloadSql"), new TriggerRouterMapper(configurationService.getNodeGroupLinks()), sourceNodeGroupId, targetNodeGroupId, Constants.CHANNEL_CONFIG); } public TriggerRouter findTriggerRouterById(String triggerId, String routerId) { List configs = (List) sqlTemplate.query( - getTriggerRouterSql("selectTriggerRouterSql"), new TriggerRouterMapper(), + getTriggerRouterSql("selectTriggerRouterSql"), new TriggerRouterMapper(configurationService.getNodeGroupLinks()), triggerId, routerId); if (configs.size() > 0) { return configs.get(0); @@ -786,7 +786,7 @@ public Map> getTriggerRoutersByChannel(String nodeGr final Map> newValue = new HashMap>(); this.triggerRouterPerChannelCacheTime = System.currentTimeMillis(); sqlTemplate.query(getTriggerRouterSql("selectGroupTriggersSql"), - new TriggerRouterMapper() { + new TriggerRouterMapper(configurationService.getNodeGroupLinks()) { @Override public TriggerRouter mapRow(Row rs) { TriggerRouter tr = super.mapRow(rs); @@ -991,9 +991,8 @@ public void syncTriggers(boolean force) { public void syncTriggers(StringBuilder sqlBuffer, boolean force) { if (parameterService.is(ParameterConstants.AUTO_SYNC_TRIGGERS) || isCalledFromSymmetricAdminTool()) { - if (clusterService.lock(ClusterConstants.SYNCTRIGGERS)) { - synchronized (this) { - clusterService.lock(ClusterConstants.SYNCTRIGGERS); + synchronized (this) { + if (clusterService.lock(ClusterConstants.SYNCTRIGGERS)) { try { String additionalMessage = ""; if (isCalledFromSymmetricAdminTool() @@ -1019,10 +1018,15 @@ public void syncTriggers(StringBuilder sqlBuffer, boolean force) { String nodeId = nodeService.findIdentityNodeId(); if (StringUtils.isNotBlank(nodeId)) { NodeSecurity nodeSecurity = nodeService.findNodeSecurity(nodeId); - if (nodeSecurity != null && (nodeSecurity.isInitialLoadEnabled() || nodeSecurity.getInitialLoadTime() == null)) { - createTriggersForTables = parameterService.is(ParameterConstants.TRIGGER_CREATE_BEFORE_INITIAL_LOAD); + if (nodeSecurity != null + && (nodeSecurity.isInitialLoadEnabled() || nodeSecurity + .getInitialLoadTime() == null)) { + createTriggersForTables = parameterService + .is(ParameterConstants.TRIGGER_CREATE_BEFORE_INITIAL_LOAD); if (!createTriggersForTables) { - log.info("Trigger creation has been disabled by " + ParameterConstants.TRIGGER_CREATE_BEFORE_INITIAL_LOAD + " because an initial load is in progress or has not yet been requested"); + log.info("Trigger creation has been disabled by " + + ParameterConstants.TRIGGER_CREATE_BEFORE_INITIAL_LOAD + + " because an initial load is in progress or has not yet been requested"); } } else { createTriggersForTables = true; @@ -1034,15 +1038,16 @@ public void syncTriggers(StringBuilder sqlBuffer, boolean force) { } inactivateTriggers(triggersForCurrentNode, sqlBuffer); - updateOrCreateDatabaseTriggers(triggersForCurrentNode, sqlBuffer, force, true); + updateOrCreateDatabaseTriggers(triggersForCurrentNode, sqlBuffer, force, + true); resetTriggerRouterCacheByNodeGroupId(); } finally { clusterService.unlock(ClusterConstants.SYNCTRIGGERS); log.info("Done synchronizing triggers"); } + } else { + log.info("Sync triggers was locked by the cluster service"); } - } else { - log.info("Sync triggers was locked by the cluster service"); } } else { log.info("Not synchronizing triggers. {} is set to false", @@ -1660,13 +1665,30 @@ public TriggerHistory mapRow(Row rs) { } class RouterMapper implements ISqlRowMapper { + + List nodeGroupLinks; + + public RouterMapper(List nodeGroupLinks) { + this.nodeGroupLinks = nodeGroupLinks; + } + + private NodeGroupLink getNodeGroupLink(String sourceNodeGroupId, String targetNodeGroupId) { + for (NodeGroupLink nodeGroupLink : nodeGroupLinks) { + if (nodeGroupLink.getSourceNodeGroupId().equals(sourceNodeGroupId) && + nodeGroupLink.getTargetNodeGroupId().equals(targetNodeGroupId)) { + return nodeGroupLink; + } + } + return null; + } + public Router mapRow(Row rs) { Router router = new Router(); router.setSyncOnInsert(rs.getBoolean("r_sync_on_insert")); router.setSyncOnUpdate(rs.getBoolean("r_sync_on_update")); router.setSyncOnDelete(rs.getBoolean("r_sync_on_delete")); router.setTargetCatalogName(rs.getString("target_catalog_name")); - router.setNodeGroupLink(configurationService.getNodeGroupLinkFor( + router.setNodeGroupLink(getNodeGroupLink( rs.getString("source_node_group_id"), rs.getString("target_node_group_id"))); router.setTargetSchemaName(rs.getString("target_schema_name")); router.setTargetTableName(rs.getString("target_table_name")); @@ -1751,8 +1773,13 @@ public Trigger mapRow(Row rs) { class TriggerRouterMapper implements ISqlRowMapper { - private TriggerMapper triggerMapper = new TriggerMapper(); - private RouterMapper routerMapper = new RouterMapper(); + private TriggerMapper triggerMapper; + private RouterMapper routerMapper; + + public TriggerRouterMapper(List nodeGroupLinks) { + routerMapper = new RouterMapper(nodeGroupLinks); + triggerMapper = new TriggerMapper(); + } public TriggerRouter mapRow(Row rs) { TriggerRouter triggerRouter = new TriggerRouter();