JAVA 与 MyCat(4) XML解析详解

分库分表之MyCat应用 目录 1、分库分表介绍 1.1 垂直切分 1.2 水平切分 2、MyCAT介绍 3、MyCAT架构 4、MyCAT的关键特性 5、MyCAT分片策略 6、实战演练 6.1 创建数据库: 6.2 安装MyCAT 6.3 配置文件介绍 6.3 启动MyCAT测试 7、Java测试 7.1 pom依赖 7.2 spring配置 7.3 单元测试 8、Mycat自定义分片机制 8.1 Mycat的源码包 8.2 自定义分片类 8.3 打包替换 9、拓展 1、分库分表. 阅读详情

通过mycat来学习java了^^。


接前一篇:http://blog.youkuaiyun.com/john_chang11/article/details/78715228


前一篇讲到了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) {
				}
			}
		}
}


第一个知识点:getResourceAsStream(fileName)的文件位置,已经讲了,接着往下看:

Element root = ConfigUtil.getDocument(dtd, xml).getDocumentElement();

看看ConfigUtil.getDocument(dtd, xml)方法的内容,此时方法的参数值为/rule.dtd和/rule.xml:

public static Document getDocument(final InputStream dtd, InputStream xml) throws ParserConfigurationException,
            SAXException, IOException {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setValidating(true);
        factory.setNamespaceAware(false);
        DocumentBuilder builder = factory.newDocumentBuilder();
        builder.setEntityResolver(new EntityResolver() {
            @Override
            public InputSource resolveEntity(String publicId, String systemId) {
                return new InputSource(dtd);
            }
        });
        builder.setErrorHandler(new ErrorHandler() {
            @Override
            public void warning(SAXParseException e) {
            }

            @Override
            public void error(SAXParseException e) throws SAXException {
                throw e;
            }

            @Override
            public void fatalError(SAXParseException e) throws SAXException {
                throw e;
            }
        });
        return builder.parse(xml);
}
该方法就是通过对rule.xml的解析,返回一个w3c的Document类型,用来存放xml文件内容。这又是一个知识点:


XML文档解析:四种方式的简单总结

对XML的解析网上有许多文章,有兴趣可以搜一下,一大把,这里不做过多重复,只对重点列举一下:

以如下XML文档进行展示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
	<tableRule name="mod-long">
		<rule>
			<columns>user_id</columns>
			<algorithm>mod-long</algorithm>
		</rule>
	</tableRule>
	<tableRule name="mod-long-from">
		<rule>
			<columns>from_user_id</columns>
			<algorithm>mod-long</algorithm>
		</rule>
	</tableRule>
	<tableRule name="mod-long-to">
		<rule>
			<columns>to_user_id</columns>
			<algorithm>mod-long</algorithm>
		</rule>
	</tableRule>

	<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
		<!-- how many data nodes -->
		<property name="count">2</property>
		<property name="defaultNode">0</property>
	</function>

</mycat:rule>



1.DOM解析,适合XML文件小的场景

最原始的解析方式,将整个XML文档读入内存,按层次解析成一棵树,容易理解,可以随机访问树的任意部分,但如果XML文档比较大,会占用大量内存。这种解析方式适用于XML文件比较小的场景。

package io.mycat.test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;


public class DOMrw {

	public static void main(String[] args) {
		parse();
	}

	public static void parse() {
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		try {
			DocumentBuilder builder = dbf.newDocumentBuilder();
			InputStream in = DOMrw.class.getResourceAsStream("/rule.xml");
			Document doc = builder.parse(in);
			// root <mycat:rule>
			Element root = doc.getDocumentElement();
			System.out.print(root.getNodeName());
			NamedNodeMap nnm = root.getAttributes();
			for (int i = 0; i < nnm.getLength(); i++) {
				Node n = nnm.item(i);
				System.out.print(" " + n.getNodeName() + "=" + n.getNodeValue() + " ");
			}
			System.out.println();
			// all tableRule, function node
			NodeList nodes = root.getChildNodes();

			print(nodes, 1);

		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	private static void print(NodeList nodes, int ind) {
		NamedNodeMap nnm;
		String txt;
		for (int i = 0; i < nodes.getLength(); i++) {
			Node node = nodes.item(i);
			if (node.getNodeType() == Node.TEXT_NODE) {
				txt = node.getTextContent();
				if (txt.replaceAll("\n", "").replaceAll("\t", "").replaceAll(" ", "").length() > 0) {
					for (int j = 0; j < ind; j++) {
						System.out.print("  ");
					}
					System.out.print("[" + node.getTextContent() + "]");
					System.out.println();
				}
			}
			if (node.getNodeType() == Node.ELEMENT_NODE) {
				for (int j = 0; j < ind; j++) {
					System.out.print("  ");
				}
				System.out.print(node.getNodeName());
				nnm = node.getAttributes();
				for (int j = 0; j < nnm.getLength(); j++) {
					Node n = nnm.item(j);
					System.out.print(" " + n.getNodeName() + "=" + n.getNodeValue() + " ");
				}
				System.out.println();
				NodeList nds = node.getChildNodes();
				if (nds.getLength() == 0) {
					System.out.print(node.getTextContent());
				} else {
					print(nds, ind + 1);
				}
			}
		}
	}

}
执行结果:

mycat:rule xmlns:mycat=http://io.mycat/ 
  tableRule name=mod-long 
    rule
      columns
        [user_id]
      algorithm
        [mod-long]
  tableRule name=mod-long-from 
    rule
      columns
        [from_user_id]
      algorithm
        [mod-long]
  function class=io.mycat.route.function.PartitionByMod  name=mod-long 
    property name=count 
      [2]
    property name=defaultNode 
      [0]

上面的java代码是xml的解析,也就是读,把xml文件里的内容全部打印出来。上面代码里,没有写。

2.SAX解析,内存占用少,响应快,适合XML大文档

SAX与DOM正好相反,占用内存少,但只能顺序访问,不能随机访问。SAX在解析XML文档时,按顺序会遇到各种文档元素,遇到时就触发相应的事件,例如startDocument()文档开始事件,endDocument()文档结束事件,startElement()元素开始事件等等,我们重写这些事件方法,就可以完成我们解析的目的,所以SAX也称为事件驱动解析。

SAX不会将整个XML文档都事先读入内存,读过的部分也不保证缓存在内存里,所以适合XML大文档的读取,但只能顺序读取。由于是边读边触发事件边处理,所以SAX的响应速度很快。

XML文档里的元素种类很多,所以对应的事件也很多,但最常用的是startDocument()、endDocument()、startElement()、endElement()、characters()几个。

package io.mycat.test;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAXr {
	public static void main(String[] args) {
		parse();
		// write();
	}

	public static void parse() {
		SAXParserFactory saxf = SAXParserFactory.newInstance();

		try {
			SAXParser saxparser = saxf.newSAXParser();
			InputStream in = DOMrw.class.getResourceAsStream("/rule.xml");
			saxparser.parse(in, new MySAXHandler());
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

class MySAXHandler extends DefaultHandler {
	boolean hasAttribute = false;
	Attributes attributes = null;

	public void startDocument() throws SAXException {
		System.out.println("文档开始");
	}

	public void endDocument() throws SAXException {
		System.out.println("文档结束");
	}

	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		if (!uri.isEmpty()) {
			System.out.print("uri=" + uri + " ");
		}
		if (!localName.isEmpty()) {
			System.out.print("localName=" + localName + " ");
		}
		if (!qName.isEmpty()) {
			System.out.print("qName=" + qName + " ");
		}

		for (int i = 0; i < attributes.getLength(); i++) {
			System.out.print(attributes.getQName(i) + ":" + attributes.getValue(i) + " ");
		}
		// System.out.println();
	}

	public void endElement(String uri, String localName, String qName) throws SAXException {

	}

	// characters该当就相当于DOM里的TEXT_NODE一样,处理文本信息
	public void characters(char[] ch, int start, int length) throws SAXException {
		System.out.print(new String(ch, start, length));
	}
}
执行结果:

文档开始
qName=mycat:rule xmlns:mycat:http://io.mycat/ 
	qName=tableRule name:mod-long 
		qName=rule 
			qName=columns user_id
			qName=algorithm mod-long
		
	
	qName=tableRule name:mod-long-from 
		qName=rule 
			qName=columns from_user_id
			qName=algorithm mod-long
		
	
	qName=tableRule name:mod-long-to 
		qName=rule 
			qName=columns to_user_id
			qName=algorithm mod-long
		
	

	qName=function name:mod-long class:io.mycat.route.function.PartitionByMod 
		
		qName=property name:count 2
		qName=property name:defaultNode 0
	

文档结束

SAX在解析时,需要指定handler类,该类继承DefaultHandler,实现各种事件的处理。


3.JDOM解析,使用简单

前面的DOM方式和SAX方式解析XML代码编写比较复杂,为了简化代码可以使用JDOM,而且完成相同的功能JDOM的代码更高效,但是JDOM不能解决所有的问题。JDOM的目的就是为了解决80%最常见的问题,使这些问题的解决得到极大简化,而另外20%不常见问题,则需要自己编码解决,这些问题很少遇到,可以忽略。所以JDOM还是很值得考虑使用的。
JDOM没有自己的解析器,所以使用的是SAX解析器,但在使用上更类似于DOM,更容易理解。

package io.mycat.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

public class JDOMr {
	public static void main(String[] args) {
		parse();
		// write();
	}

	public static void parse() {
		SAXBuilder saxBuilder = new SAXBuilder();

		try {
			InputStream in = JDOMr.class.getResourceAsStream("/rule.xml");
			Document document = saxBuilder.build(in); // 这里的Document是jdom2的Document
			Element root = document.getRootElement(); // 这里的Element是jdom2的Element
			System.out.print("name=" + root.getName() + " ");
			System.out.print("NamespacePrefix=" + root.getNamespacePrefix() + " ");
			System.out.print("NamespaceURI=" + root.getNamespaceURI() + " ");
			List<Attribute> lattr = root.getAttributes();
			for (Attribute attr : lattr) {
				System.out.print(" " + attr.getName() + "=" + attr.getValue() + " ");
			}
			System.out.println();
			// all tableRule, function node
			List<Element> children = root.getChildren();

			print(children, 1);

		} catch (JDOMException | IOException e) {

			e.printStackTrace();
		}
	}

	private static void print(List<Element> children, int ind) {
		for (Element elt : children) {
			for (int j = 0; j < ind; j++) {
				System.out.print("  ");
			}
			System.out.print(elt.getName());
			List<Attribute> lattr = elt.getAttributes();
			for (Attribute attr : lattr) {
				System.out.print(" " + attr.getName() + "=" + attr.getValue() + " ");
			}
			String txt = elt.getTextTrim();
			if (txt.length() > 0) {
				System.out.print("[" + txt + "]");
			}
			System.out.println();
			// all tableRule, function node
			List<Element> ch = elt.getChildren();

			print(ch, ind + 1);
		}
	}
}
执行结果:

name=rule NamespacePrefix=mycat NamespaceURI=http://io.mycat/ 
  tableRule name=mod-long 
    rule
      columns[user_id]
      algorithm[mod-long]
  tableRule name=mod-long-from 
    rule
      columns[from_user_id]
      algorithm[mod-long]
  tableRule name=mod-long-to 
    rule
      columns[to_user_id]
      algorithm[mod-long]
  function name=mod-long  class=io.mycat.route.function.PartitionByMod 
    property name=count [2]
    property name=defaultNode [0]

通过上面代码,可以很明显地看到,输出同样的结束,JDOM的代码要少的多。


4.DOM4J解析、最好的解析方式

DOM4J是JDOM的改进,一开始DOM4J只是JDOM的一个智能分支,后来发展成一款独立的开源软件,DOM4J不但可以解决所有的XML解析问题,还包括集成的 XPath 支持、XML Schema 支持以及用于大文档或流化文档的基于事件的处理。总之,DOM4J性能优异、功能强大、极端易用使用。

越来越多的软件在使用DOM4J,连 Sun 的 JAXM 也在用 DOM4J。所以使用DOM4J处理XML是不错的选择。

package io.mycat.test.xml;

import java.io.InputStream;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class DOM4Jr {
	public static void main(String[] args) {
		parse();
		// write();
	}

	public static void parse() {
		SAXReader reader = new SAXReader();
		try {
			InputStream in = JDOMr.class.getResourceAsStream("/rule.xml");
			Document document = reader.read(in); // 这里的Document是dom4j的Document
			Element root = document.getRootElement(); // 这里的Element是dom4j的Element
			System.out.print("name=" + root.getName() + " ");
			System.out.print("NamespacePrefix=" + root.getNamespacePrefix() + " ");
			System.out.print("NamespaceURI=" + root.getNamespaceURI() + " ");
			List<Attribute> lattr = root.attributes();
			for (Attribute attr : lattr) {
				System.out.print(" " + attr.getName() + "=" + attr.getValue() + " ");
			}
			System.out.println();
			// all tableRule, function node
			List<Element> children = root.elements();

			print(children, 1);

		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}

	private static void print(List<Element> children, int ind) {
		for (Element elt : children) {
			for (int j = 0; j < ind; j++) {
				System.out.print("  ");
			}
			System.out.print(elt.getName());
			List<Attribute> lattr = elt.attributes();
			for (Attribute attr : lattr) {
				System.out.print(" " + attr.getName() + "=" + attr.getValue() + " ");
			}
			String txt = elt.getTextTrim();
			if (txt.length() > 0) {
				System.out.print("[" + txt + "]");
			}
			System.out.println();
			// all tableRule, function node
			List<Element> ch = elt.elements();

			print(ch, ind + 1);
		}
	}
}
执行结果:

name=rule NamespacePrefix=mycat NamespaceURI=http://io.mycat/ 
  tableRule name=mod-long 
    rule
      columns[user_id]
      algorithm[mod-long]
  tableRule name=mod-long-from 
    rule
      columns[from_user_id]
      algorithm[mod-long]
  tableRule name=mod-long-to 
    rule
      columns[to_user_id]
      algorithm[mod-long]
  function name=mod-long  class=io.mycat.route.function.PartitionByMod 
    property name=count [2]
    property name=defaultNode [0]

从上面代码可以看出,DOM4J与JDOM的代码非常类似,代码依然简练,但DOM4J提供的方法更多,完成的功能更多,效率也更高。


上面就是JAVA的XML的四种解析方式,总的来说,优先使用DOM4J的方式。



现在回过头来再看一下MyCat的XML解析:

   public static Document getDocument(final InputStream dtd, InputStream xml) throws ParserConfigurationException,
            SAXException, IOException {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setValidating(true);
        factory.setNamespaceAware(false);
        DocumentBuilder builder = factory.newDocumentBuilder();
        builder.setEntityResolver(new EntityResolver() {
            @Override
            public InputSource resolveEntity(String publicId, String systemId) {
                return new InputSource(dtd);
            }
        });
        builder.setErrorHandler(new ErrorHandler() {
            @Override
            public void warning(SAXParseException e) {
            }

            @Override
            public void error(SAXParseException e) throws SAXException {
                throw e;
            }

            @Override
            public void fatalError(SAXParseException e) throws SAXException {
                throw e;
            }
        });
        return builder.parse(xml);
    }
首先:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setValidating(true);
        factory.setNamespaceAware(false);
        DocumentBuilder builder = factory.newDocumentBuilder();
这一段用的是javax.xml.parsers包里的JAVA自带的基本类。接下来:

builder.setEntityResolver(new EntityResolver() {
            @Override
            public InputSource resolveEntity(String publicId, String systemId) {
                return new InputSource(dtd);
            }
        });
        builder.setErrorHandler(new ErrorHandler() {
            @Override
            public void warning(SAXParseException e) {
            }

            @Override
            public void error(SAXParseException e) throws SAXException {
                throw e;
            }

            @Override
            public void fatalError(SAXParseException e) throws SAXException {
                throw e;
            }
        });
这一段用的又是SAX的XML解析,最后:

return builder.parse(xml);
返回的又是org.w3c.dom包的Document类。
总的感觉,又点不伦不类,当然不是说这样不能用,就是觉得风格不统一。其实,看SAX部分的作用,就是为了用DTD文件进行XML的校验,而这种校验用JDOM或DOM4J也可以完成。所以可以改成JDOM或DOM4J的统一风格,本人将这段代码改成DOM4J的方式:

	public static Document getDocument(final InputStream dtd, InputStream xml) throws DocumentException {
		SAXReader reader = new SAXReader();
		reader.setValidation(true);
		reader.setEntityResolver(new EntityResolver() {
			public InputSource resolveEntity(String publicId, String systemId) {
				return new InputSource(dtd);
			}
		});

		return reader.read(xml);
	}
这以看到,代码相当简洁,而完成的功能又完全一样。这里的Document是DOM4J里的Document类,不再引用W3C的Document类,风格相当统一。本人已将MyCat里XML解析全部修改成DOM4J的方式,代码简洁不少。

上面内容,如有问题,欢迎指正。












MyCat入门+JAVA程序连接 本文章主要对mycat的配置文件注释说明,详细的安装使用请戳这个地址:mycat安装使用连接mycat时,将原先连接mysql的端口和数据库改为mycat的端口8066,和mycat的逻辑数据库TESTDB,用户名和密码为server.xml表里设定的user。jdbc.url=jdbc:mysql://127.0.0.1:8066/TESTDB?characterEncoding=utf-8 j... 阅读详情

相关推荐

ESP32脑机接口开发板:EEG信号采集与应用开发指南

脑机接口(BCI)技术通过采集脑电图(EEG)信号实现人机交互,其核心在于高精度生物电信号采集与实时处理。基于ESP32微控制器的开发平台结合专业级ADS1299 ADC芯片,可构建8通道EEG信号采集系统,支持250SPS采样率与可编程增益。这种嵌入式解决方案在科研教育领域具有显著优势,既能满足信号质量要求,又大幅降低开发门槛。典型应用包括实时脑电波可视化、注意力检测等BCI场景,通过Python生态工具链(如BrainFlow、LSL)可快速实现数据处理。开发时需注意电极阻抗控制(<10kΩ)和50/6

weixin_42518874的博客 343

MyCat配置rule.xml、server.xml讲解

tableRule主要配置表的分片规则,里面rule标签内主要有两个字段column(根据哪个字段进行分片)和algorithm(指的是这种分片规则对应的算法是什么)里面的内容也是一个引用。function里面的class是mycat处理分片规则所编写的java类 property标签里面配置的是这种分片规则里面所关联的属性配置。tableRule标签里面主要配置我们的分片规则,Function里面涉及的是分片规则里面所涉及的java类,都是在function中配置的。

weixin_44860226的博客 1226

从零构建:毫米波雷达生命信号检测系统的Matlab仿真全流程解析

本文详细解析了毫米波雷达生命信号检测系统的Matlab仿真全流程,涵盖原理、信号处理链路设计及算法优化策略。通过FMCW雷达技术,实现非接触式呼吸心跳信号检测,结合Matlab代码示例展示距离FFT、相位提取与信号分离等关键步骤,为医疗监护和智能家居应用提供实用指南。

weixin_29303701的博客 355

MyCat 实战 - MyCat 配置 rule.xml 详解

抱歉,我之前关于 MyCat 配置文件的部分描述有误。实际上,MyCat 并没有名为。在实际的 MyCat 分布式数据库系统中,更多的情况是直接在。标签定义复杂的分片规则,而不是引用外部文件。因此,对于 MyCat 的规则配置,主要是关注。的配置文件,其主要的配置文件包括。字段做哈希取模分片的规则,应用于。包含了表规则的配置。

qq_33240556的博客 614

噪声整形与过采样实战:从N-bit ADC到DSM的SQNR优化指南

本文深入探讨了噪声整形与过采样技术在DSM(Delta-Sigma调制器)中的应用,重点分析了量化器位数(N)、滤波器阶数(L)和过采样率(OSR)对SQNR优化的影响。通过实战案例和参数协同优化策略,帮助工程师在音频处理和通信系统设计中实现更优的信号质量。

weixin_42561040的博客 339

OTFS 消息传递算法信号检测【附matlab代码详解】

OTFS 消息传递算法方面的一些浅浅理解。

Cuby的博客 4009

mycat配置详解之——rule.xml

mycat的所有配置文件在mycat/conf目录下,主要包括schema.xml、server.xml、rule.xml等配置文件。 rule.xml中定义了对表进行拆分所涉及到的规则。我们可以对表使用不同的分片算法,或对表使用相同的算法但不同的参数。该文件中主要有tableRule和function 两个标签。 1. tableRule标签 该标签定义表规则。在rule.xml中定义表规则,例如: <tableRule name="rule1"> <rule> <colum

数据库生态圈(RDB & NoSQL & Bigdata)——专注于关系库应用与研究(Oracle & Mysql & Postgresql & SQL Server ) 772

华为OD机考双机位A卷 - 流浪地球(Java & Python& JS & C/C++ & GO )

华为OD机考双机位A卷 - 流浪地球(OD上机考试双机位A卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 4039

3.Mycat原理解析-后端连接管理

一、数据源与连接池   前面我们说过,Mycat除了作为服务端外,还作为客户端来连接数据库,所以需要管理与数据库的连接。在管理后端连接中,主要涉及到下面两个类。 PhysicalDatasource BackendConnection   从下面的类图可以看出,同普通的数据源一样,PhysicalDatasource负责建立连接,并且内部维护了一个连接池——conMap。   Mycat

根号三 2702

Vek385评估板(二):板子联网 & memtester安装(LPDDR5X测试)

继上一篇文章:Vek385评估板(一):EDF成功烧录启动及一些问题。 本章完成最主要的两个功能:开发板联网+内存 memtester。因为我是做测试行业的,所以这两个是最想试的。内存测试,除了FPGA测,也可以系统级测,本次在versal上实现这个功能,主要是可以应急。在没有安卓、X86的情况下,可以使用本方案测试。 下一篇会继续做一些其他功能。

千歌叹尽执夏的博客 221

点云配准3:3d-ndt算法在pcl上的实现以及参数设置

3d-ndt算法在pcl上的使用方法以及参数设置

诺有缸的高飞鸟的博客 7891

Mycat核心概念以及核心配置项(server.xml、schema.xml、rule.xml内部标签详细分析)

Mycat核心概念以及核心配置项(server.xml、schema.xml、rule.xml内部标签详细分解)

weixin_44795847的博客 1853

华为eNSP镜像包全集下载,包含CE6800、CE12800、NE系列等!

你好,这里是网络技术联盟站。昨天给大家介绍了win11、10下安装eNSP最新系列(1.3.00)并完美运行,附下载。从文章发布到发文前,一直有朋友想让瑞哥提供一下华为ENSP镜像包,今天安排!eNSP安装包、以及eNSP中所需要的镜像包(设备包)(CE、CX、NE40E、NE5000E、NE9000、USG)例如:导入一个USG设备包,eNSP中的USG5500和USG6000V都是可以启动的。如果你的报错“40”的话,那么打开Oracle VM VirtualBox这个虚拟机,删除对应报错的虚拟机,然后

网络技术联盟站 3万+

Mycat详解及使用

Mycat详解及使用

深圳市多克创新科技有限公司 1974

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

mycat 配置以及java 连mycat

三台服务器: 192.168.192.128 mycat服务器 192.168.192.129 mysql主服务器 192.168.192.132 mysq从服务器 schema.xml配置 [root@node1 conf]# vim schema.xml <?xml version="1.0"?> <!DOCTYPE mycat:schema SYST...

qq690452074的专栏 3078

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

MyCAT配置文件详解

MyCAT配置,一文全搞定

Sicimike的博客 5396

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

mycat配置详解之——server.xml

mycat的所有配置文件在mycat/conf目录下,主要包括schema.xml、server.xml、rule.xml等配置文件。 server.xml 几乎保存了所有 mycat 需要的系统配置信息。其在代码内直接的映射类为 SystemConfig 类。 1.user标签 该标签用于定义登录mycat的用户和权限。这个标签嵌套的 property 标签则是具体声明的属性值,例如: <user name="test"> <property name="password">t

数据库生态圈(RDB & NoSQL & Bigdata)——专注于关系库应用与研究(Oracle & Mysql & Postgresql & SQL Server ) 1160

mycat配置详解-schema.xml之dataHost

接上一篇:mycat配置详解-schema.xml之dataNode <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> &l...

龙哥(webnum)说的,每天进步一点点,总有一天会实现梦想! 4314

mycat

MyCAT官网:http://www.mycat.io/环境:两台已经做好主从复制的机子192.168.1.67(主) 192.168.1.68(从),一台mycat(192.168.1.60),一台同网段,拥有mysql客户端的机子。

m0_73671133的博客 1246

Java-131 深入浅出 MySQL MyCat 深入解析 schema.xml 配置详解:逻辑库、逻辑表、数据节点全攻略

schema.xml 是核心配置文件,用于定义逻辑库、逻辑表、数据节点和数据主机等关键组件。逻辑库(schema)相当于虚拟数据库,可实现业务模块隔离与多租户支持;逻辑表(table)定义表结构及分片规则,支持分片表、全局表和非分片表;数据节点(dataNode)映射逻辑表到实际物理数据库实例;数据主机(dataHost)则负责物理数据库连接管理,支持读写分离、故障转移与心跳检测。常见场景包括订单表按时间或用户ID分片、商品信息作为全局表同步、日志表分区存储等。配置时需结合 rule.xml 定义分片规则,

谢谢你的喜欢 我们一起无限进步 1284

MyCat从入门到实战:一篇文章搞定MyCat

随着互联网及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存 储,存在以下性能瓶颈:为了解决上述问题,我们需要对数据库进行分库分表处理。分库分表的中心思想都是将数据分散存储,使得单一数据库/表的数据量变小来缓解单一数据库的性能 问题,从而达到提升数据库性能的目的。可以把MyCAT对数据库的作用和类比为 Nginx 对后端服务的影响:Nginx 将客户端流量分发到不同的后端服务以提升系统性能,而 MyCAT 则将数据库请求路由到不同的后端数据库节点,实现读写分离与分库分表,从而提高

weixin_53818428的博客 1345

【MySQL 读写分离实战教程:基于 Mycat 中间件,从环境搭建、JDK 与 Mycat 安装、用户配置、server.xml 与 schema.xml 文件修改,到读写分离,主从同步结果验证】

读写分离实战摘要 本文介绍了基于MyCat中间件的数据库读写分离实施方案,通过主库处理写操作、从库承担读请求的方式,有效提升数据库性能。主要内容包括: 读写分离原理:主库专注写入,从库负责查询,通过中间件实现请求分流 MyCat中间件:作为数据库与应用间的桥梁, 环境准备:需准备主库、从库和MyCat服务器,要求MySQL版本一致 实施步骤: 主从库分别创建读写专用用户 配置MyCat的server.xml和schema.xml文件建立主从同步关系 该方案适用于高并发场景能有效降低数据库负载,提高系统吞吐量

m0_63756214的博客 1259

3.4 Mycat入门与配置

摘要:Mycat是一款基于Java的开源MySQL数据库中间件,支持数据分片和分布式管理。安装需配置MySQL、JDK环境,通过schema.xml定义逻辑库、分片规则和数据节点,rule.xml配置分片算法,server.xml管理系统权限。测试表明数据分片存储取决于配置的分片规则,可通过修改配置文件灵活调整数据分布和访问权限。Mycat实现了数据库的透明分片管理,为大数据量场景提供可靠解决方案。

2503_91471254的博客 864

MYCAT集群模式环境搭建

Mycat 集群模式搭建 环境: 系统操作版本:CentOS7.2 jdk版本:1.8 mysql 版本:5.7.24 Zoopeeker 版本:3.4.10 (http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz) Mycat-Server 版本:1.5.1(https://gi...

baidu_30851231的博客 7838

MySQL读写分离详解(二)——MyCAT实战配置

一、实战环境 二、JAVA环境安装 三、MyCAT安装 (一)MyCAT写入环境变量 (二)MyCAT配置文件 四、数据库授权操作 五、实战效果检验

永远是少年 1248
上一篇: JAVA 与 MyCat(3) 关于getResourceAsStream(fileName)的文件位置
下一篇: JAVA 与 MyCat(5) 类的加载 Java内省/反射机制 注解Annotation 详解
本木生
博客等级 码龄14年 18粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值