我想有三个办法
1。在getConnection中使用域名而不使用ip,这样当切换的时候,admin人手改动域名指向的ip,这样你的程序就不需要添加任何代码了。
2。在数据库中添加一个column说明自己是主还是备,这要另外写程序去更新数据库,并且同步要做好。
3。在服务器的应用程序中添加一个currentDBServer的变量,当首次开机的时候,这个值指向其中一台数据库的ip(通过config file),然后一直使用这个变量,直到当前数据服务器down掉,然后才去尝试另外一台服务器,并且将另外一个ip赋值给currentDBServer,也是一直用到down。这样备机怎么启动都无所谓,一定会等到主机关闭才能使用。也许还有更好的做法,不过我没想出来......

解决方案 »

  1.   

    谢谢happyegg(想转型的程序员) 的回答!!!
    我的回答:
    1,根据实际环境,主备服务器在139.100...网段,而我要调用的程序在138.100..网段,而主备机器在138网有一个固定的映射地址138.100.100.111,通过连接映射地址是没法连上数据库的,我已经测试过了。而且由于主备数据库的服务名不同,一个server1,一个server2,所以不能采用域名或映射地址的方法来实现。
    2,这一种方法个人感觉得不太好,而且维护的代价比较大。
    3,对于双机热切换,有机器down的情况,也有其他应用程序down了而切换的情况,而我的问题主要是针对这种情况,因为当主机down了,那么很好判断,无法得到getConnection。但是只是正常切换,那么主备互换了,而程序还无法判断哪个是主哪个是备,因为都可以得到getConnection,仅仅是因为备机不能更新,只能查询。
      

  2.   

    我想知道你主备热切换时做了些什么。你怎么样做了之后确定这台为主机,怎么做了之后确定为备机。当你正在使用A机的时候,你后台做了什么动作,让A变为备机,而B变为主机?还有,我不知道你的主备机是应用服务器还是数据库服务器。比如:AB是应用服务器,CD是数据服务器。或者A和B分别集成了应用和数据服务器
      

  3.   

    A,B两台服务器不仅仅是做数据库服务器,也有应用程序服务器,如果有应用程序DOWN后,A,B也会互换,是通过双机脚本自动互换的。这样A,B的数据库主备也互换了,正常情况下默认A为主,B为备。所以把映射地址指向了主(A),互换以后B就成了主。
      

  4.   

    我的意思是用不同的用户名连接两个数据,也就是在两个数据库是不要用相同的用户去操作。比如在A机器上用xxxx这个用户名登陆数据库,在B机器上用yyyy这个用户名登陆数据库.然后在java中有一个类DatabaseMetaData,它有一些方法可以得到这个用户名的,String getUser();
    例如:
        con=DriverManager.getConnection(url,"root","roger");
        meta=con.getMetaData();
        String name=meta.getUserName();
    这个name的值就是连接数据库的名字,不同的数据库,名字不一样的,Mysql显示的是root@localhost,我不知道其它的,你可以试一下,这样你可以先把两个数据库都连起来,在要向它们写数据的时候就是这个方法来判断两个不同的数据库。
    个人想法。
      

  5.   

    谢谢drugon(personal) 的建议
    我太不赞成,因为判断是否能写最好在建立连接时就做,而不是把这些代码放到业务逻辑中去做。增加重用性。
      

  6.   

    没见过你这么做双机备份的。你这样做,恐怕你的程序很难跑起来
    数据库的双机热备都是通过操作系统的集群实现的。你用自己的程序用jdbc来实现双机热备,我想效果肯定不会好。
      

  7.   

    zhang21cnboy(事了抚衣去,不留身与名) 说得对,确实是操作系统实现的,只是特殊的情况下我还需要在程序里做个判断。
    因为用双机的唯一映射地址我无法连接到主机上,网段不同,数据库名不相同,否则的话,我根本不需要写程序来判断哪个有效了,直接连主机得了。热备不同于冷备,热备需要两台机器同时开启服务,所以数据库服务名还必须不同。我的程序只能实现冷备下的切换。