@Override public void execute(RouteResultset rrs, int type) { if (LOGGER.isDebugEnabled()) { StringBuilder s = new StringBuilder(); LOGGER.debug(s.append(source).append(rrs).toString()); } // 检查路由结果是否为空 RouteResultsetNode[] nodes = rrs.getNodes(); if (nodes == null || nodes.length == 0) { source.writeErrMessage(ErrorCode.ER_NO_DB_ERROR, "No dataNode selected"); return; } // 选择执行方式 if (nodes.length == 1) { singleNodeExecutor.execute(nodes[0], this, rrs.getFlag()); } else { // 多数据节点,非事务模式下,执行的是可修改数据的SQL,则后端为事务模式。 boolean autocommit = source.isAutocommit(); if (autocommit && isModifySQL(type)) { autocommit = false; } // multiNodeExecutor.execute(nodes, autocommit, this, rrs.getFlag()); } }
@Override public void terminate() { // 终止所有正在执行的任务 kill(); // 等待所有任务结束,包括还未执行的,执行中的,执行完的。 try { singleNodeExecutor.terminate(); // multiNodeExecutor.terminate(); commitExecutor.terminate(); rollbackExecutor.terminate(); } catch (InterruptedException e) { for (RouteResultsetNode rrn : target.keySet()) { Channel c = target.remove(rrn); if (c != null) { // c.close(); } } LOGGER.warn("termination interrupted: " + source, e); } // 清理绑定的资源 clear(false); }