欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

[置顶] MyCat

程序员文章站 2022-05-09 11:53:44
...

数据库路由中间件MyCat - 源代码篇(12) 4.配置模块 4.2 schema.xml 接上一篇,接下来载入每个schema的配置(也就是每个MyCat中虚拟化的数据库的配置): XMLSchemaLoader.java private void loadSchemas(Element root) { NodeList list = root . getElemen

数据库路由中间件MyCat - 源代码篇(12)

4.配置模块

4.2 schema.xml

接上一篇,接下来载入每个schema的配置(也就是每个MyCat中虚拟化的数据库的配置):
XMLSchemaLoader.java

private void loadSchemas(Element root) {
        NodeList list = root.getElementsByTagName("schema");
    for (int i = 0, n = list.getLength(); i  n; i++) {
        Element schemaElement = (Element) list.item(i);
        //读取各个属性
        String name = schemaElement.getAttribute("name");
        String dataNode = schemaElement.getAttribute("dataNode");
        String checkSQLSchemaStr = schemaElement.getAttribute("checkSQLschema");
        String sqlMaxLimitStr = schemaElement.getAttribute("sqlMaxLimit");
        int sqlMaxLimit = -1;
        //读取sql返回结果集限制
        if (sqlMaxLimitStr != null && !sqlMaxLimitStr.isEmpty()) {
            sqlMaxLimit = Integer.valueOf(sqlMaxLimitStr);
        }

        // check dataNode already exists or not,看schema标签中是否有datanode
        String defaultDbType = null;
        //校验检查并添加dataNode
        if (dataNode != null && !dataNode.isEmpty()) {
            ListString> dataNodeLst = new ArrayListString>(1);
            dataNodeLst.add(dataNode);
            checkDataNodeExists(dataNodeLst);
            String dataHost = dataNodes.get(dataNode).getDataHost();
            defaultDbType = dataHosts.get(dataHost).getDbType();
        } else {
            dataNode = null;
        }
        //加载schema下所有tables
        MapString, TableConfig> tables = loadTables(schemaElement);
        //判断schema是否重复
        if (schemas.containsKey(name)) {
            throw new ConfigException("schema " + name + " duplicated!");
        }

        // 设置了table的不需要设置dataNode属性,没有设置table的必须设置dataNode属性
        if (dataNode == null && tables.size() == 0) {
            throw new ConfigException(
                    "schema " + name + " didn't config tables,so you must set dataNode property!");
        }

        SchemaConfig schemaConfig = new SchemaConfig(name, dataNode,
                tables, sqlMaxLimit, "true".equalsIgnoreCase(checkSQLSchemaStr));

        //设定DB类型,这对之后的sql语句路由解析有帮助
        if (defaultDbType != null) {
            schemaConfig.setDefaultDataNodeDbType(defaultDbType);
            if (!"mysql".equalsIgnoreCase(defaultDbType)) {
                schemaConfig.setNeedSupportMultiDBType(true);
            }
        }

        // 判断是否有不是mysql的数据库类型,方便解析判断是否启用多数据库分页语法解析
        for (String tableName : tables.keySet()) {
            TableConfig tableConfig = tables.get(tableName);
            if (isHasMultiDbType(tableConfig)) {
                schemaConfig.setNeedSupportMultiDBType(true);
                break;
            }
        }
        //记录每种dataNode的DB类型
        MapString, String> dataNodeDbTypeMap = new HashMap();
        for (String dataNodeName : dataNodes.keySet()) {
            DataNodeConfig dataNodeConfig = dataNodes.get(dataNodeName);
            String dataHost = dataNodeConfig.getDataHost();
            DataHostConfig dataHostConfig = dataHosts.get(dataHost);
            if (dataHostConfig != null) {
                String dbType = dataHostConfig.getDbType();
                dataNodeDbTypeMap.put(dataNodeName, dbType);
            }
        }
        schemaConfig.setDataNodeDbTypeMap(dataNodeDbTypeMap);
        schemas.put(name, schemaConfig);
    }
}

首先读取schema每个配置属性项,并作有效性判断。比如默认的dataNode是否存在。只要验证之前读取的dataNode里面有没有就可以

private void checkDataNodeExists(Collection nodes) {
    if (nodes == null || nodes.size() 1