Search in sources :

Example 1 with ConfigException

use of io.mycat.config.util.ConfigException in project Mycat-Server by MyCATApache.

the class ConfigInitializer method testConnection.

public void testConnection() {
    // 实际链路的连接测试		
    if (this.dataNodes != null && this.dataHosts != null) {
        Map<String, Boolean> map = new HashMap<String, Boolean>();
        for (PhysicalDBNode dataNode : dataNodes.values()) {
            String database = dataNode.getDatabase();
            PhysicalDBPool pool = dataNode.getDbPool();
            for (PhysicalDatasource ds : pool.getAllDataSources()) {
                String key = ds.getName() + "_" + database;
                if (map.get(key) == null) {
                    map.put(key, false);
                    boolean isConnected = false;
                    try {
                        isConnected = ds.testConnection(database);
                        map.put(key, isConnected);
                    } catch (IOException e) {
                        LOGGER.warn("test conn error:", e);
                    }
                }
            }
        }
        //
        boolean isConnectivity = true;
        for (Map.Entry<String, Boolean> entry : map.entrySet()) {
            String key = entry.getKey();
            Boolean value = entry.getValue();
            if (!value && isConnectivity) {
                LOGGER.warn("SelfCheck### test " + key + " database connection failed ");
                isConnectivity = false;
            } else {
                LOGGER.info("SelfCheck### test " + key + " database connection success ");
            }
        }
        if (!isConnectivity) {
            throw new ConfigException("SelfCheck### there are some datasource connection failed, pls check!");
        }
    }
}
Also used : PhysicalDBNode(io.mycat.backend.datasource.PhysicalDBNode) PhysicalDatasource(io.mycat.backend.datasource.PhysicalDatasource) HashMap(java.util.HashMap) PhysicalDBPool(io.mycat.backend.datasource.PhysicalDBPool) ConfigException(io.mycat.config.util.ConfigException) IOException(java.io.IOException) HashMap(java.util.HashMap) Map(java.util.Map)

Example 2 with ConfigException

use of io.mycat.config.util.ConfigException in project Mycat-Server by MyCATApache.

the class XMLSchemaLoader method createDBHostConf.

private DBHostConfig createDBHostConf(String dataHost, Element node, String dbType, String dbDriver, int maxCon, int minCon, String filters, long logTime) {
    String nodeHost = node.getAttribute("host");
    String nodeUrl = node.getAttribute("url");
    String user = node.getAttribute("user");
    String password = node.getAttribute("password");
    String usingDecrypt = node.getAttribute("usingDecrypt");
    String passwordEncryty = DecryptUtil.DBHostDecrypt(usingDecrypt, nodeHost, user, password);
    String weightStr = node.getAttribute("weight");
    int weight = "".equals(weightStr) ? PhysicalDBPool.WEIGHT : Integer.parseInt(weightStr);
    String ip = null;
    int port = 0;
    if (empty(nodeHost) || empty(nodeUrl) || empty(user)) {
        throw new ConfigException("dataHost " + dataHost + " define error,some attributes of this element is empty: " + nodeHost);
    }
    if ("native".equalsIgnoreCase(dbDriver)) {
        int colonIndex = nodeUrl.indexOf(':');
        ip = nodeUrl.substring(0, colonIndex).trim();
        port = Integer.parseInt(nodeUrl.substring(colonIndex + 1).trim());
    } else {
        URI url;
        try {
            url = new URI(nodeUrl.substring(5));
        } catch (Exception e) {
            throw new ConfigException("invalid jdbc url " + nodeUrl + " of " + dataHost);
        }
        ip = url.getHost();
        port = url.getPort();
    }
    DBHostConfig conf = new DBHostConfig(nodeHost, ip, port, nodeUrl, user, passwordEncryty, password);
    conf.setDbType(dbType);
    conf.setMaxCon(maxCon);
    conf.setMinCon(minCon);
    conf.setFilters(filters);
    conf.setLogTime(logTime);
    //新增权重
    conf.setWeight(weight);
    return conf;
}
Also used : DBHostConfig(io.mycat.config.model.DBHostConfig) ConfigException(io.mycat.config.util.ConfigException) URI(java.net.URI) IOException(java.io.IOException) ConfigException(io.mycat.config.util.ConfigException)

Example 3 with ConfigException

use of io.mycat.config.util.ConfigException in project Mycat-Server by MyCATApache.

the class XMLSchemaLoader method processChildTables.

private void processChildTables(Map<String, TableConfig> tables, TableConfig parentTable, String dataNodes, Element tableNode) {
    // parse child tables
    NodeList childNodeList = tableNode.getChildNodes();
    for (int j = 0; j < childNodeList.getLength(); j++) {
        Node theNode = childNodeList.item(j);
        if (!theNode.getNodeName().equals("childTable")) {
            continue;
        }
        Element childTbElement = (Element) theNode;
        //读取子表信息
        String cdTbName = childTbElement.getAttribute("name").toUpperCase();
        String primaryKey = childTbElement.hasAttribute("primaryKey") ? childTbElement.getAttribute("primaryKey").toUpperCase() : null;
        boolean autoIncrement = false;
        if (childTbElement.hasAttribute("autoIncrement")) {
            autoIncrement = Boolean.parseBoolean(childTbElement.getAttribute("autoIncrement"));
        }
        boolean needAddLimit = true;
        if (childTbElement.hasAttribute("needAddLimit")) {
            needAddLimit = Boolean.parseBoolean(childTbElement.getAttribute("needAddLimit"));
        }
        String subTables = childTbElement.getAttribute("subTables");
        //子表join键,和对应的parent的键,父子表通过这个关联
        String joinKey = childTbElement.getAttribute("joinKey").toUpperCase();
        String parentKey = childTbElement.getAttribute("parentKey").toUpperCase();
        TableConfig table = new TableConfig(cdTbName, primaryKey, autoIncrement, needAddLimit, TableConfig.TYPE_GLOBAL_DEFAULT, dataNodes, getDbType(dataNodes), null, false, parentTable, true, joinKey, parentKey, subTables);
        if (tables.containsKey(table.getName())) {
            throw new ConfigException("table " + table.getName() + " duplicated!");
        }
        tables.put(table.getName(), table);
        //对于子表的子表,递归处理
        processChildTables(tables, table, dataNodes, childTbElement);
    }
}
Also used : NodeList(org.w3c.dom.NodeList) Node(org.w3c.dom.Node) Element(org.w3c.dom.Element) TableConfig(io.mycat.config.model.TableConfig) ConfigException(io.mycat.config.util.ConfigException)

Example 4 with ConfigException

use of io.mycat.config.util.ConfigException in project Mycat-Server by MyCATApache.

the class XMLSchemaLoader method loadDataHosts.

private void loadDataHosts(Element root) {
    NodeList list = root.getElementsByTagName("dataHost");
    for (int i = 0, n = list.getLength(); i < n; ++i) {
        Element element = (Element) list.item(i);
        String name = element.getAttribute("name");
        //判断是否重复
        if (dataHosts.containsKey(name)) {
            throw new ConfigException("dataHost name " + name + "duplicated!");
        }
        //读取最大连接数
        int maxCon = Integer.parseInt(element.getAttribute("maxCon"));
        //读取最小连接数
        int minCon = Integer.parseInt(element.getAttribute("minCon"));
        /**
			 * 读取负载均衡配置
			 * 1. balance="0", 不开启分离机制,所有读操作都发送到当前可用的 writeHost 上。
			 * 2. balance="1",全部的 readHost 和 stand by writeHost 参不 select 的负载均衡
			 * 3. balance="2",所有读操作都随机的在 writeHost、readhost 上分发。
			 * 4. balance="3",所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力
			 */
        int balance = Integer.parseInt(element.getAttribute("balance"));
        /**
			 * 读取切换类型
			 * -1 表示不自动切换
			 * 1 默认值,自动切换
			 * 2 基于MySQL主从同步的状态决定是否切换
			 * 心跳询句为 show slave status
			 * 3 基于 MySQL galary cluster 的切换机制
			 */
        String switchTypeStr = element.getAttribute("switchType");
        int switchType = switchTypeStr.equals("") ? -1 : Integer.parseInt(switchTypeStr);
        //读取从延迟界限
        String slaveThresholdStr = element.getAttribute("slaveThreshold");
        int slaveThreshold = slaveThresholdStr.equals("") ? -1 : Integer.parseInt(slaveThresholdStr);
        //如果 tempReadHostAvailable 设置大于 0 则表示写主机如果挂掉, 临时的读服务依然可用
        String tempReadHostAvailableStr = element.getAttribute("tempReadHostAvailable");
        boolean tempReadHostAvailable = !tempReadHostAvailableStr.equals("") && Integer.parseInt(tempReadHostAvailableStr) > 0;
        /**
			 * 读取 写类型
			 * 这里只支持 0 - 所有写操作仅配置的第一个 writeHost
			 */
        String writeTypStr = element.getAttribute("writeType");
        int writeType = "".equals(writeTypStr) ? PhysicalDBPool.WRITE_ONLYONE_NODE : Integer.parseInt(writeTypStr);
        String dbDriver = element.getAttribute("dbDriver");
        String dbType = element.getAttribute("dbType");
        String filters = element.getAttribute("filters");
        String logTimeStr = element.getAttribute("logTime");
        String slaveIDs = element.getAttribute("slaveIDs");
        long logTime = "".equals(logTimeStr) ? PhysicalDBPool.LONG_TIME : Long.parseLong(logTimeStr);
        //读取心跳语句
        String heartbeatSQL = element.getElementsByTagName("heartbeat").item(0).getTextContent();
        //读取 初始化sql配置,用于oracle
        NodeList connectionInitSqlList = element.getElementsByTagName("connectionInitSql");
        String initConSQL = null;
        if (connectionInitSqlList.getLength() > 0) {
            initConSQL = connectionInitSqlList.item(0).getTextContent();
        }
        //读取writeHost
        NodeList writeNodes = element.getElementsByTagName("writeHost");
        DBHostConfig[] writeDbConfs = new DBHostConfig[writeNodes.getLength()];
        Map<Integer, DBHostConfig[]> readHostsMap = new HashMap<Integer, DBHostConfig[]>(2);
        Set<String> writeHostNameSet = new HashSet<String>(writeNodes.getLength());
        for (int w = 0; w < writeDbConfs.length; w++) {
            Element writeNode = (Element) writeNodes.item(w);
            writeDbConfs[w] = createDBHostConf(name, writeNode, dbType, dbDriver, maxCon, minCon, filters, logTime);
            if (writeHostNameSet.contains(writeDbConfs[w].getHostName())) {
                throw new ConfigException("writeHost " + writeDbConfs[w].getHostName() + " duplicated!");
            } else {
                writeHostNameSet.add(writeDbConfs[w].getHostName());
            }
            NodeList readNodes = writeNode.getElementsByTagName("readHost");
            //读取对应的每一个readHost
            if (readNodes.getLength() != 0) {
                DBHostConfig[] readDbConfs = new DBHostConfig[readNodes.getLength()];
                Set<String> readHostNameSet = new HashSet<String>(readNodes.getLength());
                for (int r = 0; r < readDbConfs.length; r++) {
                    Element readNode = (Element) readNodes.item(r);
                    readDbConfs[r] = createDBHostConf(name, readNode, dbType, dbDriver, maxCon, minCon, filters, logTime);
                    if (readHostNameSet.contains(readDbConfs[r].getHostName())) {
                        throw new ConfigException("readHost " + readDbConfs[r].getHostName() + " duplicated!");
                    } else {
                        readHostNameSet.add(readDbConfs[r].getHostName());
                    }
                }
                readHostsMap.put(w, readDbConfs);
            }
        }
        DataHostConfig hostConf = new DataHostConfig(name, dbType, dbDriver, writeDbConfs, readHostsMap, switchType, slaveThreshold, tempReadHostAvailable);
        hostConf.setMaxCon(maxCon);
        hostConf.setMinCon(minCon);
        hostConf.setBalance(balance);
        hostConf.setWriteType(writeType);
        hostConf.setHearbeatSQL(heartbeatSQL);
        hostConf.setConnectionInitSql(initConSQL);
        hostConf.setFilters(filters);
        hostConf.setLogTime(logTime);
        hostConf.setSlaveIDs(slaveIDs);
        dataHosts.put(hostConf.getName(), hostConf);
    }
}
Also used : NodeList(org.w3c.dom.NodeList) Element(org.w3c.dom.Element) ConfigException(io.mycat.config.util.ConfigException) DBHostConfig(io.mycat.config.model.DBHostConfig) DataHostConfig(io.mycat.config.model.DataHostConfig)

Example 5 with ConfigException

use of io.mycat.config.util.ConfigException in project Mycat-Server by MyCATApache.

the class XMLSchemaLoader method load.

private void load(String dtdFile, String xmlFile) {
    InputStream dtd = null;
    InputStream xml = null;
    try {
        dtd = XMLSchemaLoader.class.getResourceAsStream(dtdFile);
        xml = XMLSchemaLoader.class.getResourceAsStream(xmlFile);
        Element root = ConfigUtil.getDocument(dtd, xml).getDocumentElement();
        //先加载所有的DataHost
        loadDataHosts(root);
        //再加载所有的DataNode
        loadDataNodes(root);
        //最后加载所有的Schema
        loadSchemas(root);
    } catch (ConfigException e) {
        throw e;
    } catch (Exception e) {
        throw new ConfigException(e);
    } finally {
        if (dtd != null) {
            try {
                dtd.close();
            } catch (IOException e) {
            }
        }
        if (xml != null) {
            try {
                xml.close();
            } catch (IOException e) {
            }
        }
    }
}
Also used : InputStream(java.io.InputStream) Element(org.w3c.dom.Element) ConfigException(io.mycat.config.util.ConfigException) IOException(java.io.IOException) IOException(java.io.IOException) ConfigException(io.mycat.config.util.ConfigException)

Aggregations

ConfigException (io.mycat.config.util.ConfigException)30 Element (org.w3c.dom.Element)16 NodeList (org.w3c.dom.NodeList)12 IOException (java.io.IOException)9 Node (org.w3c.dom.Node)8 HashMap (java.util.HashMap)5 TableConfig (io.mycat.config.model.TableConfig)4 RuleConfig (io.mycat.config.model.rule.RuleConfig)4 AbstractPartitionAlgorithm (io.mycat.route.function.AbstractPartitionAlgorithm)4 InputStream (java.io.InputStream)4 PhysicalDatasource (io.mycat.backend.datasource.PhysicalDatasource)3 DataNodeConfig (io.mycat.config.model.DataNodeConfig)3 TableRuleConfig (io.mycat.config.model.rule.TableRuleConfig)3 PhysicalDBNode (io.mycat.backend.datasource.PhysicalDBNode)2 PhysicalDBPool (io.mycat.backend.datasource.PhysicalDBPool)2 JDBCDatasource (io.mycat.backend.jdbc.JDBCDatasource)2 MySQLDataSource (io.mycat.backend.mysql.nio.MySQLDataSource)2 XMLSchemaLoader (io.mycat.config.loader.xml.XMLSchemaLoader)2 DBHostConfig (io.mycat.config.model.DBHostConfig)2 DataHostConfig (io.mycat.config.model.DataHostConfig)2