`
gaojingsong
  • 浏览: 1195300 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

【Mycat1.6之加载Schema的DataNode源码解读】

阅读更多

一、Mycat1.6之加载Schema的DataNode源码解读


//<dataNode name="dn1" dataHost="localhost1_gaojingsong1" database="scott" />
private void load(String dtdFile, String xmlFile) {
	InputStream dtd = null;
	InputStream xml = null;
		 
	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);
		 
}
//<dataNode name="dn1" dataHost="localhost1_gaojingsong1" database="scott" />
private void loadDataNodes(Element root) {
    //读取DataNode分支
    NodeList list = root.getElementsByTagName("dataNode");
	for (int i = 0, n = list.getLength(); i < n; i++) {
		Element element = (Element) list.item(i);
		String dnNamePre = element.getAttribute("name");

		String databaseStr = element.getAttribute("database");
		String host = element.getAttribute("dataHost");
		//字符串不为空
		if (empty(dnNamePre) || empty(databaseStr) || empty(host)) {
			throw new ConfigException("dataNode " + dnNamePre + " define error 
,attribute can't be empty");
		}
		//dnNames(name),databases(database),hostStrings(dataHost)都可以配置多
个,以',', '$', '-'区分,
		//但是需要保证database的个数*dataHost的个数=name的个数
		//多个dataHost与多个database如果写在一个标签,则每个dataHost拥有所有database
		//例如:
		//则为:localhost1拥有dn1$0-75,localhost2也拥有dn1$0-75(对应db$76-151)
	String[] dnNames = io.mycat.util.SplitUtil.split(dnNamePre, ',', '$', '-');
	String[] databases = io.mycat.util.SplitUtil.split(databaseStr, ',', '$', '-');
	String[] hostStrings = io.mycat.util.SplitUtil.split(host, ',', '$', '-');
        //此处复杂的配置关系请看步骤二实验结果,进行理解
		if (dnNames.length > 1 && dnNames.length != databases.length * hostStrings.length) {
			throw new ConfigException("dataNode " + dnNamePre
							+ " define error ,dnNames.length must be=databases.length*hostStrings.length");
		}
		if (dnNames.length > 1) {
			
			List<String[]> mhdList = mergerHostDatabase(hostStrings, databases);
			for (int k = 0; k < dnNames.length; k++) {
				String[] hd = mhdList.get(k);
				String dnName = dnNames[k];
				String databaseName = hd[1];
				String hostName = hd[0];
				createDataNode(dnName, databaseName, hostName);
			}

		} else {
			createDataNode(dnNamePre, databaseStr, host);
		}

	}
}

/**
	 * 匹配DataHost和Database,每个DataHost拥有每个Database名字
	 * @param hostStrings
	 * @param databases
     * @return
     */
private List<String[]> mergerHostDatabase(String[] hostStrings,	String[] databases) {
	List<String[]> mhdList = new ArrayList<>();
	for (int i = 0; i < hostStrings.length; i++) {
		String hostString = hostStrings[i];
		for (int i1 = 0; i1 < databases.length; i1++) {
			String database = databases[i1];
			String[] hd = new String[2];
			hd[0] = hostString;
			hd[1] = database;
			mhdList.add(hd);
		}
	}
	return mhdList;
}

private void createDataNode(String dnName, String database, String host) {
	DataNodeConfig conf = new DataNodeConfig(dnName, database, host);		
	if (dataNodes.containsKey(conf.getName())) {
		throw new ConfigException("dataNode " + conf.getName() + " duplicated!");
	}
	
	if (!dataHosts.containsKey(host)) {
		throw new ConfigException("dataNode " + dnName + " reference dataHost:" + host + " not exists!");
	}

	dataHosts.get(host).addDataNode(conf.getName());
	dataNodes.put(conf.getName(), conf);
}

public final class DataNodeConfig {
	private final String name;
	private final String database;
	private final String dataHost;
}

二、实验结果验证



 



 结论:

<dataNode name="dn1$0-75" dataHost="localhost$1-10" database="db$0-759" />

         name.length must be=databases.length*dataHost.length"

//从A到C地没有直达路径,需要经过B中转,已知从A到B有三条databases路,从B到C有2条dataHost路

//,试问从A到C有几种方案

  • 大小: 88.3 KB
  • 大小: 72.3 KB
0
2
分享到:
评论

相关推荐

    【Mycat1.6之操作SQLServer案例】

    【Mycat1.6与SQLServer操作案例详解】 Mycat是一款开源的分布式数据库中间件,它在大型分布式系统中扮演着数据库分片的角色,能够有效地解决单个数据库性能瓶颈的问题。Mycat 1.6是其一个重要版本,提供了更稳定、...

    【Mycat1.6之操作Oracle案例】

    【Mycat1.6与Oracle操作案例详解】 在IT行业中,数据库管理是核心部分,尤其是在大型企业级应用中。Mycat是一个开源的分布式数据库中间件,它提供了数据库分片、读写分离、故障切换等功能,适用于高并发、大数据量...

    Mycat-Server-master 源码、可直接在eclipse中调试

    《深入剖析Mycat-Server源码:Eclipse调试与Maven实践》 Mycat,作为一款开源的分布式数据库中间件,广泛应用于大数据环境下的高并发、高性能场景。其核心在于提供数据分片、读写分离以及负载均衡等功能,为大型...

    Mycat从入门到精通之原理与入门、基本功能、配置.zip

    《Mycat从入门到精通之原理与入门、基本功能、配置》教程是针对数据库分片中间件Mycat的一款详尽学习资料。Mycat作为一款开源的分布式数据库系统,广泛应用于大型互联网企业的高并发场景,能有效解决单机数据库无法...

    【Mycat操作之分库分表入门】

    【Mycat操作之分库分表入门】 Mycat是一款开源的分布式数据库中间件,主要功能是实现数据库的水平扩展,通过分库分表来处理大数据量的问题,减轻单机数据库的压力。它支持MySQL协议,可以透明地将一个数据库集群...

    mycat入门到精通教程

    安装Mycat通常涉及下载源码、编译、启动服务等步骤。配置文件主要包括server.xml(全局配置)、schema.xml(数据分片规则)、dataNode.xml(DataNode配置)和user.xml(用户权限配置),需要根据实际情况进行详细...

    Mycat简单入门配置文件介绍

    1. **server.xml**:这是Mycat的核心配置文件,定义了Mycat服务器的启动参数、全局配置、数据节点(DataNode)、schema(逻辑库)等信息。例如,`serverPort` 设置Mycat服务端口,`dataNode` 配置数据节点的数据库...

    mycat安装部署文档

    - 修改配置文件:包括server.xml、schema.xml、dataNode.xml等,设定数据分片策略、服务器节点、端口号等。 - 启动Mycat:通过命令行启动Mycat服务。 2. "mycat使用经验分享.docx":这份文档可能包含用户在实际...

    mycat入门学习资料

    Mycat主要由Server模块、Schema模块、DataNode模块和Client模块组成: 1. Server模块:负责接收客户端的请求,处理网络通信,并转发给相应的Schema模块。 2. Schema模块:包含一组DataNode,定义了数据的分片规则和...

    mycat对mysql数据库进行分库分表demo-mycat-demo-parent.zip

    8. **配置文件**:MyCat的配置文件(如server.xml、schema.xml、dataNode.xml等)是实现其功能的关键,需要根据实际数据库和业务进行详细配置。 9. **安装与部署**:MyCat的部署涉及到下载、解压、启动等多个步骤,...

    mycat安装配置.rar

    3. 编译工具:如GCC,用于编译Mycat源码(如果选择源码安装)。 **三、安装步骤** 1. **下载Mycat**:你可以从Mycat官网或者GitHub仓库下载预编译的二进制包,或者选择源码安装。这里我们假设已经下载了二进制包。...

    HAProxy+MyCat高可用集群配置

    1. **安装MyCat**: 下载MyCat的安装包,解压后配置相应的配置文件,如`server.xml`、`schema.xml`、`dataNode.xml`等。 2. **数据分片**: 在`schema.xml`中定义数据节点(DataNode)和表切片规则,例如按主键取模...

    【基于Maven的Hibernate整合Mycat示例】

    在Mycat的配置文件`server.xml`中,你需要定义数据节点(DataNode),每个数据节点对应一个实际的数据库实例。此外,还需要配置数据源(DataSource)和规则(Schema)来指导数据的分片策略,比如哈希分片、范围分片...

    Mycat安装配置1

    在这个例子中,源码被上传到了`/usr/local/mycat`目录下,然后通过`ll`命令查看了目录内容。这显示了几个子目录,如`bin`, `catlet`, `conf`, `lib`, `logs`, 以及一个`version.txt`文件。这些目录和文件分别包含...

    linux mycat

    在描述中提到的是“linux mycat下载资料”,这通常指的是从Mycat的官方网站或者GitHub仓库获取最新的源码或预编译版本。下载完成后,可以通过解压命令(如`tar -zxvf mycat-x.x.x.tar.gz`)解压到指定目录,并进行...

Global site tag (gtag.js) - Google Analytics