程序开始启动,启动类org.opencloudb.Mycat Startup
export CLASSPATH=/root/mycat:/root/mycat/*:$CLASSPATH
java -DMYCAT_HOME=. -server -XX:MaxPermSize=64M -XX:+AggressiveOpts -XX:MaxDirectMemorySize=2G -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1984 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Xms2048m -Xmx2048m -Djava.library.path=lib -classpath lib/wrapper.jar:conf:lib/druid-1.0.12.jar:lib/libwrapper-linux-ppc-64.so:lib/guava-18.0.jar:lib/log4j-1.2.17.jar:lib/mapdb-0.9.8.jar:lib/wrapper.jar:lib/fdb-sql-parser-1.5.0.jar:lib/libwrapper-linux-x86-64.so:lib/Mycat-server-1.3.0.3-release.jar:lib/libwrapper-linux-x86-32.so:lib/slf4j-log4j12-1.7.3.jar:lib/ehcache-core-2.6.6.jar:lib/slf4j-api-1.7.3.jar:lib/mongo-java-driver-2.11.4.jar -Dwrapper.key=6LoiSc51snB3DbXi -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.pid=2407 -Dwrapper.version=3.2.3 -Dwrapper.native_library=wrapper -Dwrapper.service=TRUE -Dwrapper.cpu.timeout=10 -Dwrapper.jvmid=1 org.tanukisoftware.wrapper.WrapperSimpleApp org.opencloudb.MycatStartup start
jdb -DMYCAT_HOME=. -server -XX:MaxPermSize=64M -XX:+AggressiveOpts -XX:MaxDirectMemorySize=2G -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1984 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Xms2048m -Xmx2048m -Djava.library.path=lib -Dwrapper.key=6LoiSc51snB3DbXi -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.pid=2407 -Dwrapper.version=3.2.3 -Dwrapper.native_library=wrapper -Dwrapper.service=TRUE -Dwrapper.cpu.timeout=10 -Dwrapper.jvmid=1 org.opencloudb.MycatStartup start
stop in org.opencloudb.MycatStartup.main
run
---------如下:
刚开始代码倒没啥可说的,后面会加载rule.dtd文件和rule.xml文件。
继续跟踪
dtd = XMLRuleLoader.class.getResourceAsStream(dtdFile);
xml = XMLRuleLoader.class.getResourceAsStream(xmlFile);
Element root = ConfigUtil.getDocument(dtd, xml).getDocumentElement();//获取文件的根元素
获取根元素之后,会先解析function元素。代码如下:
private void loadFunctions(Element root) throws ClassNotFoundException,
InstantiationException, IllegalAccessException,
InvocationTargetException {
NodeList list = root.getElementsByTagName("function");
for (int i = 0, n = list.getLength(); i < n; ++i) {
Node node = list.item(i);
if (node instanceof Element) {
Element e = (Element) node;
String name = e.getAttribute("name");
if (functions.containsKey(name)) {
throw new ConfigException("rule function " + name
+ " duplicated!");
}
String clazz = e.getAttribute("class");
AbstractPartitionAlgorithm function = createFunction(name, clazz);
ParameterMapping.mapping(function, ConfigUtil.loadElements(e));
function.init();
functions.put(name, function);
}
}
}
可以看到,获取 name,clazz两个参数之后,是通过createFunction函数来创建一个对象。
ParameterMapping.mapping(function, ConfigUtil.loadElements(e));则是通过反射来将配置文件的属性设置到此对象里去
所以取名为ParameterMapping
function.init();---之前已经初始化了function对象和属性,执行一个init初始化操作。
然后存到functions里。
---------------接下来就是解析
loadTableRules(root); 解析规则
举例子如下:
<?xml version="1.0" encoding="UTF-8"?>
<mycatrules>
<tableRule name="sharding-by-murmur">
<rule>
<columns>id</columns>列名
<algorithm>murmur</algorithm>是下面的算法的名称
</rule>
</tableRule>
<function name="murmur" class="org.opencloudb.route.function.PartitionByMurmurHash">
<property name="seed">0</property>
<property name="count">2</property>
<property name="virtualBucketTimes">160</property>
<!--<property name="bucketMapPath">/etc/mycat/bucketMapPath</property> -->
</function>
其实也就是说:<tableRule里面的算法需要在function里提前存在,否则会报错。
==============
</mycatrules>