public final class MycatStartup {
private static final String dateFormat = "yyyy-MM-dd HH:mm:ss";
private static final Logger LOGGER = LoggerFactory.getLogger(MycatStartup.class);
public static void main(String[] args) {
//use zk ?
//使用单例模式加静态代码块加载/myid.properties配置文件
//如果配置文件中loadZk取值为true则会调用ZktoXmlMain类的loadZktoFile方法,
// 否则不使用ZK,这段代码小刘的注释写的很漂亮,值得学习和表扬
ZkConfig.getInstance().initZk();
try {
//检查是否设置SystemConfig中的SYS_HOME = "MYCAT_HOME"变量值
String home = SystemConfig.getHomePath();
if (home == null) {
System.out.println(SystemConfig.SYS_HOME + " is not set.");
System.exit(-1);
}
// init
//使用单例模式初始化配置文件为启动做准备:读取配置文件和启用scheduler调度器,
//其中配置文件的加载使用的是java中的w3c的DocumentBuilderFactory-->DocumentBuilder,
//这种代码比较底层。 dom sax dom4j的区别呢?此处没有用dom4j,估计是考虑到dtd验证问题
MycatServer server = MycatServer.getInstance();
//空方法啥也不干,以前可能用来初始化启动上述ZK,被注释掉代码 ZkConfig.instance().initZk();
server.beforeStart();
// startup
//这个是个超级大方法,长达200多行,因此此段代码是个bad code,待优化
server.startup();
System.out.println("MyCAT Server startup successfully. see logs in logs/mycat.log");
} catch (Exception e) {
//SimpleDateFormat类不是线程安全的,所以在多线程的环境下,往往会出现意想不到的结果。
//umberFormatException: multiple points
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
LOGGER.error(sdf.format(new Date()) + " startup error", e);
System.exit(-1);
}
}
}
启用ZK的配置文件
启用ZK的代码
XML文件解析
Sax基于事件的访问,应用程序通过事件处理函数实现对xml文档的访问.
因为事件触发是有时序性的,优点:1、无需将整个文档加载到内存中,所以内存消耗少.
2 、推模型允许注册多个contentHandler.
缺点:1、没有内置的文档导航支持.
2、不能随机访问xml文档.
3、不支持原地修改xml.
4、不支持名字空间作用域.
适合:对xml文档读取数据
小王老师曾说:SAX类似一个盲人去触摸一个漂亮女孩子一样,从头到脚只能触摸一次,即不可返回反复触摸,再摸就是非礼了。而DOM就可以反复了,因为它是整个加载到内存的,SAX是边读边解析的,解析完就丢弃
DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。也就是说,通过DOM树,应用程序可以对XML文档进行随机访问
优点:1、丰富的API集合,可以轻松导航.
2、 整个DOM树加载到内存,允许随机访问.
缺点:1、整个xml文档必须一次解析完.
2、整个DOM树都加载到内存中,内存要求高.
3、一般的DOM节点对于必须为所有节点创建对象的对象类型绑定不太理想.
适用:对xml文档修改数据
DOM4J
DOM4J有更复杂的api,所以dom4j比jdom有更大的灵活性.DOM4J性能最好,连Sun的JAXM也在用DOM4J.目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的 hibernate 也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J.
优点:1、灵活性最高
2、易用性和功能强大、性能优异
缺点:1、复杂的api
2、移植性差
适用:自行选择
单例模式的特征
构造函数私有化,不能产生对象,所以只能用类名调用,所有只能是静态函数。
缺点:弄不好,并发有问题