一、相关说明
最近在写一个分布式查询的框架,其中涉及读数据库集群配置文件部分,在这里单独列出来。
平时写代码访问数据库都是直接把数据库ip、端口号、数据库名称还有用户名等写进代码里面,这样做的坏处就是每当数据库ip、端口号等信息变化,都要找到相对应的代码处进行修改。这是很不方便的,现在都是采用配置文件的方式记录数据库的信息。那么记录在配置文件中的数据库配置信息该怎么读取呢?这就是此博文所要讲的。
二、准备工作
1.dom4j.jar
dom4j是sourceforge.net上的一个开源项目,主要用于对XML的解析。关于dom4j的介绍和下载,
请点击这里。 这个链接里面对其有很详细的介绍,同时还有对xml操作的介绍。
2.获取xml数据库集群配置文件路径
获取xml的路径,通常我们是直接把文件的绝对路径写入代码中,这样做的劣势很明显:每当工程文件夹移动了,要想成功运行该工程就要在代码中修改下xml文件的路径。
有一个获取文件路径的好方法:Class.gerResource()和ClassLoader.getResource().我的程序中只使用了后者。关于这两者的使用方法,
请点击这里。
三、读取xml配置文件
1.工程一览图
整个工程在这里下载,
点击下载。
2.common/commonFunc.java
package common;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public class CommonFunc {
public static long StringToLong(String time)
{
SimpleDateFormat format = new SimpleDateFormat("yy-MM-dd H:m:s");
format.setTimeZone(TimeZone.getTimeZone("UTC"));
long result=0;
try
{
Date date = format.parse(time);
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
cal.setTime(date);
result = cal.getTimeInMillis();
}
catch(Exception e)
{
System.out.println("StringToLong error");
}
return result;
}
}
3.config/dbcp.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--连接数据库集群的配置文件-->
<ConnectionPool>
<!-- 各节点存储数据的时间范围,顺序一定不能乱-->
<TimeRange>
<node1>
<startTime>2013-1-1 00:00:14</startTime>
<endTime>2013-1-10 03:28:25</endTime>
</node1>
<node2>
<startTime>2013-1-1 00:00:14</startTime>
<endTime>2013-1-10 03:28:25</endTime>
</node2>
<node3>
<startTime>2013-1-1 00:00:14</startTime>
<endTime>2013-1-10 03:28:25</endTime>
</node3>
<node4>
<startTime>2013-1-1 00:00:14</startTime>
<endTime>2013-1-10 03:28:25</endTime>
</node4>
<node5>
<startTime>2013-1-1 00:00:14</startTime>
<endTime>2013-1-10 03:28:25</endTime>
</node5>
<node6>
<startTime>2013-1-1 00:00:14</startTime>
<endTime>2013-1-10 03:28:25</endTime>
</node6>
</TimeRange>
<!-- 各个节点的连接信息 -->
<ConnectionInfo>
<node1>
<nodeName>node1</nodeName>
<url>192.168.0.202:5000</url>
<dbName>xiamen</dbName>
<tableName>st_objectstates_xiamengps1</tableName>
</node1>
<node2>
<nodeName>node2</nodeName>
<url>192.168.0.202:5000</url>
<dbName>xiamen</dbName>
<tableName>st_objectstates_xiamengps1</tableName>
</node2>
<node3>
<nodeName>node3</nodeName>
<url>192.168.0.202:5000</url>
<dbName>xiamen</dbName>
<tableName>st_objectstates_xiamengps1</tableName>
</node3>
<node4>
<nodeName>node4</nodeName>
<url>192.168.0.202:5000</url>
<dbName>xiamen</dbName>
<tableName>st_objectstates_xiamengps1</tableName>
</node4>
<node5>
<nodeName>node5</nodeName>
<url>192.168.0.202:5000</url>
<dbName>xiamen</dbName>
<tableName>st_objectstates_xiamengps1</tableName>
</node5>
<node6>
<nodeName>node6</nodeName>
<url>192.168.0.202:5000</url>
<dbName>xiamen</dbName>
<tableName>st_objectstates_xiamengps1</tableName>
</node6>
</ConnectionInfo>
</ConnectionPool>
设计视图:
4.connectDB/NodeInfo.java
package connectDB;
public class NodeInfo {
public NodeInfo() {
// TODO Auto-generated constructor stub
}
public String nodeName=null;
public String url=null;
public String dbName=null;
public String tableName=null;
public long startTime=0;
public long endTime=0;
}
5.connectDB/ReadConfig.java
ReadConfig.java是读取配置文件的类,这个要结合配置文件的格式来看这个代码。
package connectDB;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import common.CommonFunc;
public class ReadConfig {
// xml文件所在路径
private String xmlFilePath;
public ReadConfig(String xmlFilePath) {
this.xmlFilePath=xmlFilePath;
}
//读取xml文件,返回一个dom对象
private Document getDoc()
{
Document result =null;
File configFile=new File(xmlFilePath);
if(configFile.exists())
{
SAXReader reader=new SAXReader();
try {
result=reader.read(configFile);
} catch (DocumentException e) {
e.printStackTrace();
}
}
return result;
}
public ArrayList<NodeInfo> readConfig()
{
Document doc=getDoc();
if(doc==null)
return null;
ArrayList<NodeInfo>result=new ArrayList<NodeInfo>();
Element root = doc.getRootElement();
Element timeRange=root.element("TimeRange");
Element connectionInfo=root.element("ConnectionInfo");
Iterator<?> timeRItr = timeRange.elementIterator();
Iterator<?> connInfoItr = connectionInfo.elementIterator();
while(timeRItr.hasNext())
{
Element timeInfoNode=(Element)timeRItr.next();
Element connInfoNode=(Element)connInfoItr.next();
NodeInfo nodeInfo=new NodeInfo();
nodeInfo.startTime=CommonFunc.StringToLong(timeInfoNode.elementText("startTime"));
nodeInfo.endTime=CommonFunc.StringToLong(timeInfoNode.elementText("endTime"));
// 默认“TimeRange”以下节点顺序与“ConnectionInfo”以下节点信息是一致的,所以,dbcp.xml文件的顺序要注意这一点
nodeInfo.nodeName=connInfoNode.elementText("nodeName");
nodeInfo.dbName=connInfoNode.elementText("dbName");
nodeInfo.url=connInfoNode.elementText("url");
nodeInfo.tableName=connInfoNode.elementText("tableName");
result.add(nodeInfo);
}
return result;
}
}
6.main/testFunc.java
package main;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.ListIterator;
import connectDB.NodeInfo;
import connectDB.ReadConfig;
public class testFunc {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
String xmlFilePath=testFunc.class.getClassLoader().getResource("config/dbcp.xml").toURI().getPath();
ReadConfig readXml=new ReadConfig(xmlFilePath);
ArrayList<NodeInfo> nodesInfo=readXml.readConfig();
ListIterator<NodeInfo> list=nodesInfo.listIterator();
while(list.hasNext())
{
System.out.println(list.next().nodeName);
}
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这个类里面获取了xml数据库集群配置文件的地址,请结合工程一览图中dbcp.xml文件的位置来看这行代码。