有一个用ibatis作为后台连接的程序,每隔20秒会自动运行一次。但是,数据库所在的服务器会进行不定时地切换,比如今天A服务器run,B服务器down,可能明天B服务器run,A服务器down。(A、B服务器上的库表结构一致)
我的连接数据库的程序就是最基本的ibatis方法,但是现在只是单节点,也就是只连接了一台服务器(URL写死)。下面我给出我的连接库的程序。
前面的逻辑程序会用DBUtil.java文件中的getSqlMapClient()方法连接数据库。
另外,一个DBUtil.java文件用于连接数据库,内容:
public class DBUtil {
private static SqlMapClient sc = null;
private static Reader r = null;
public static void init() {
try {
r = Resources.getResourceAsReader("xml/sqlMap-config.xml");//读取xml文件
sc = SqlMapClientBuilder.buildSqlMapClient(r);
} catch (Exception ex) {
} } public static SqlMapClient getSqlMapClient() {
if (sc == null)
init();
return sc;
}
}
在xml文件夹下有一个sqlMap-config.xml文件,内容:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<properties resource="xml/db.properties"/>
<settings
cacheModelsEnabled="true"
enhancementEnabled="true"
maxSessions="64"
maxTransactions="8"
maxRequests="128" /> <transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property value="${driver}" name="JDBC.Driver"/>
<property value="${url}" name="JDBC.ConnectionURL"/>
<property value="${username}" name="JDBC.Username"/>
<property value="${password}" name="JDBC.Password"/>
</dataSource>
</transactionManager>
<sqlMap resource="xml/ApplicationServiceImpl.xml" />
</sqlMapConfig>
在xml文件夹下,一个db.properties文件,内容是数据库的url,SID,name,password。(这里就不方便写出来了)
我想问的是,怎么改动,才能让程序在连接A服务器报错的时候,自动去连接B服务器?这样就能达到自动切换了。
(批注:我试了几种改动,当连接A报错的时候,程序却不自动连B,始终连接A并且一直报错,很闹心!)
我的连接数据库的程序就是最基本的ibatis方法,但是现在只是单节点,也就是只连接了一台服务器(URL写死)。下面我给出我的连接库的程序。
前面的逻辑程序会用DBUtil.java文件中的getSqlMapClient()方法连接数据库。
另外,一个DBUtil.java文件用于连接数据库,内容:
public class DBUtil {
private static SqlMapClient sc = null;
private static Reader r = null;
public static void init() {
try {
r = Resources.getResourceAsReader("xml/sqlMap-config.xml");//读取xml文件
sc = SqlMapClientBuilder.buildSqlMapClient(r);
} catch (Exception ex) {
} } public static SqlMapClient getSqlMapClient() {
if (sc == null)
init();
return sc;
}
}
在xml文件夹下有一个sqlMap-config.xml文件,内容:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<properties resource="xml/db.properties"/>
<settings
cacheModelsEnabled="true"
enhancementEnabled="true"
maxSessions="64"
maxTransactions="8"
maxRequests="128" /> <transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property value="${driver}" name="JDBC.Driver"/>
<property value="${url}" name="JDBC.ConnectionURL"/>
<property value="${username}" name="JDBC.Username"/>
<property value="${password}" name="JDBC.Password"/>
</dataSource>
</transactionManager>
<sqlMap resource="xml/ApplicationServiceImpl.xml" />
</sqlMapConfig>
在xml文件夹下,一个db.properties文件,内容是数据库的url,SID,name,password。(这里就不方便写出来了)
我想问的是,怎么改动,才能让程序在连接A服务器报错的时候,自动去连接B服务器?这样就能达到自动切换了。
(批注:我试了几种改动,当连接A报错的时候,程序却不自动连B,始终连接A并且一直报错,很闹心!)
r = Resources.getResourceAsReader("xml/sqlMap-config.xml");//读取xml文件
sc = SqlMapClientBuilder.buildSqlMapClient(r);
} catch (Exception ex) {
r = Resources.getResourceAsReader("xml/sqlMap2-config.xml");//读取备用的xml文件
sc = SqlMapClientBuilder.buildSqlMapClient(r);
}
当连接第一个不通,它会报错,并且直接跳回到了逻辑程序部分。不主动往catch中跑了。
//借鉴一下2楼的
r = null;
sc = null;
for(int i = 0; sc == null && i < 2; ++i){
try {
r = Resources.getResourceAsReader("xml/sqlMap-config"+i+".xml");//读取xml文件
sc = SqlMapClientBuilder.buildSqlMapClient(r);
} catch (Exception ex) {
}
}
这就是在这里面加try{}catch{}不管用的原因。