有一个用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并且一直报错,很闹心!)

解决方案 »

  1.   

    这样行吗?try {
              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);
          } 
      

  2.   

    我试了一下,还是不行。
    当连接第一个不通,它会报错,并且直接跳回到了逻辑程序部分。不主动往catch中跑了。
      

  3.   

    这个可能吗,除非程序有问题,另外楼主在程序里就不能判断一下吗
    //借鉴一下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) {
      } 
    }
      

  4.   

    我测试了一下,执行到init()方法中的sc = SqlMapClientBuilder.buildSqlMapClient(r)的语句,就算是连不到数据库,sc也是有返回值的。所以,不管是init()方法,还是getSqlMapClient() 方法,程序都不会报错。
    这就是在这里面加try{}catch{}不管用的原因。