我的数据库采用的是SQL SERVER2005 MIRROR,3台机器: 
主体服务器(192.168.1.11)、备机服务器(192.168.1.12)、见证服务器(192.168.1.13)。 
经测试镜像完全OK。现在采用PROXOOL作为连接池。不知道如何配置,我看到网上有类似的配置,但是不正确。 我的proxool.xml配置如下: 
<?xml version="1.0" encoding="UTF-8"?> <something-else-entirely> <proxool> <alias>Mirror_DB </alias> <driver-url>jdbc:sqlserver://192.168.0.11:1433;DatabaseName=TestMirror;failoverParnter= 192.168.0.12 </driver-url> <driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver </driver-class> <driver-properties> <property name="user" value="sa"/> <property name="password" value="zzzz"/> </driver-properties> <minimum-connection-count>50 </minimum-connection-count> <maximum-connection-count>3000 </maximum-connection-count> <maximum-active-time>300000 </maximum-active-time> <house-keeping-sleep-time>30000 </house-keeping-sleep-time> <house-keeping-test-sql>select CURRENT_DATE </house-keeping-test-sql> </proxool> </something-else-entirely> 我用的是TOMCAT 5.5.9,初始:主体服务器启动,备机启动,数据库连接正常。但当主体服务器发生故障(这里我停止SQL SERVER服务),见证服务器会自动将数据库转移到备机服务器。但是这里的TOMCAT就不能正常连接了。除非重新启动Tomcat。 这里感觉好像连接池不能自动刷新连接到新的备机服务器上。是不是PROXOOL不支持镜像? 我的数据库连接的方法如下: 
public final class DBUtil { 
public DBUtil() { 
try { 
Class.forName("org.logicalcobwebs.proxool.ProxoolDriver"); 
} catch (ClassNotFoundException e) { 
System.out.println("Can't find proxool.xml!"); 

} //从数据库连接池中取得一个数据库连接 
public static synchronized Connection getConnection() { 
Connection conn=null; 
try { 
conn = DriverManager.getConnection("proxool.Mirror_DB"); 
System.out.println("Connnect"); 
} catch (SQLException se) { 
System.out.println("Can't connect principal database,Please Check Database is working!"); 
se.printStackTrace(); 
try { 
conn = DriverManager.getConnection("proxool.Mirror_DB"); 
} catch (Exception ex) { 
System.out.println("Can't connect mirror database,Please Check Database is working!"); 
//e.printStackTrace(); 

} catch (Exception e){ 
e.printStackTrace(); 

return conn; 

} 谁有遇到过类似问题的,有解决的吗。大家帮帮忙。这个问题急!!!!我发过两个帖,还是没有回复啊。哪位大神帮帮忙吧。

解决方案 »

  1.   

    数据库镜像可以使用两种类型的传输安全性:Windows 身份验证或基于证书的身份验证,就证书验证的镜像实现做个学习笔记。 ?? 配置环境: 
    HOST_A : Windows Server 2003??Standard Edition(SP2)+SQL Server 2005 Enterprise Edition(SP2 9.00.3042.00) 
    HOST_B : Windows Server 2003??Standard Edition(SP2)+SQL Server 2005 Enterprise Edition(SP2 9.00.3042.00) 主体 
    HOST_A 
    镜像 
    HOST_B 一. 在主体数据库HOST_A 上: 
    USE master; --a.创建数据库主密钥 
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'madefuckgan!'; 
    GO 
    --可用以下语句查看生成的数据库主密钥 
    --SELECT * from??sys.symmetric_keys ; --b.创建一个证书 
    CREATE CERTIFICATE DB_HOST_A_cert 
    ?? WITH SUBJECT = 'DB_HOST_A certificate for database mirroring' , 
    ?? START_DATE = '12/31/2007' , 
    ?? EXPIRY_DATE = '12/31/2010' 
    GO 
    --SELECT * FROM sys.certificates; --c.创建镜像端点 
    CREATE ENDPOINT DB_MIRR 
    ?? STATE = STARTED 
    ?? AS TCP ( 
    ??????LISTENER_PORT=5021 
    ??????, LISTENER_IP = ALL 
    ?? ) 
    ?? FOR DATABASE_MIRRORING ( 
    ??????AUTHENTICATION = CERTIFICATE DB_HOST_A_cert 
    ??????, ENCRYPTION = REQUIRED ALGORITHM RC4 
    ??????, ROLE = ALL 
    ?? ); 
    GO 
    --SELECT * FROM sys.tcp_endpoints 
    --SELECT * FROM sys.database_mirroring_endpoints; --d.备份证书 
    BACKUP CERTIFICATE DB_HOST_A_cert TO FILE = 'D:\db_A_run.cer'; 
    GO --e.创建登入 CREATE LOGIN TO_HOST_A_login WITH PASSWORD = 'openthedoorHostA!'; 
    GO CREATE USER TO_HOST_A_user FOR LOGIN TO_HOST_A_login; 
    GO 二. 在镜像数据库HOST_B 上:?????????????? 
    USE master; --1.创建数据库主密钥 
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'madefuckgan#2!'; 
    GO 
    --可用以下语句查看生成的数据库主密钥 
    --SELECT * from??sys.symmetric_keys ; --2.创建一个证书 
    CREATE CERTIFICATE DB_HOST_B_cert 
    ?? WITH SUBJECT = 'DB_HOST_B certificate for database mirroring' , 
    ?? START_DATE = '12/31/2007' , 
    ?? EXPIRY_DATE = '12/31/2010' 
    GO 
    --SELECT * FROM sys.certificates; --3.创建镜像端点 
    CREATE ENDPOINT DB_MIRR 
    ?? STATE = STARTED 
    ?? AS TCP ( 
    ??????LISTENER_PORT=5022 
    ??????, LISTENER_IP = ALL 
    ?? ) 
    ?? FOR DATABASE_MIRRORING ( 
    ??????AUTHENTICATION = CERTIFICATE DB_HOST_B_cert 
    ??????, ENCRYPTION = REQUIRED ALGORITHM RC4 
    ??????, ROLE = ALL 
    ?? ); 
    GO 
    --SELECT * FROM sys.tcp_endpoints 
    --SELECT * FROM sys.database_mirroring_endpoints; --4.备份证书 
    BACKUP CERTIFICATE DB_HOST_B_cert TO FILE = 'D:\db_B_run.cer'; 
    GO --5.创建登入 CREATE LOGIN TO_HOST_B_login WITH PASSWORD = 'openthedoorHostB!'; 
    GO CREATE USER TO_HOST_B_user FOR LOGIN TO_HOST_B_login; 
    GO 三.回到主体数据库HOST_A 上: 
    f.从HOST_B上D:\下拷贝备份出来的证书db_B_run.cer到HOST_A的D:\下 
    g.--还原B证书到HOST_A上; 
    use master 
    CREATE CERTIFICATE DB_HOST_B_cert 
    ?? AUTHORIZATION TO_HOST_A_user 
    ?? FROM FILE = 'D:\db_B_run.cer' 
    GO 
    --赋权 
    --Grant CONNECT permission on the login for the remote mirroring endpoint. 
    GRANT CONNECT ON ENDPOINT::DB_MIRR TO [TO_HOST_A_login]; 
    GO 
    h. 
    CREATE DATABASE MIRR_TEST 
    --数据库镜像必须更改为使用完整恢复模式 
    ALTER DATABASE MIRR_TEST 
    ?? SET RECOVERY FULL; 
    GO 
    --备份数据库 
    BACKUP DATABASE MIRR_TEST 
    ????TO DISK = N'D:\MT.BAK' 
    ????WITH FORMAT 
    GO 
    --备份日志 
    --!笔者试过只备份数据库不成功,一定要备份日志. 
    BACKUP LOG MIRR_TEST 
    ????TO DISK = N'D:\MT.BAK' 
    GO?????????? 
    四.在镜像数据库HOST_B 上: 
    6.从HOST_A上D:\下拷贝备份出来的证书db_A_run.cer到HOST_B的D:\下 
    7. 
    --还原A证书到HOST_B上; 
    use master 
    CREATE CERTIFICATE DB_HOST_A_cert 
    ?? AUTHORIZATION TO_HOST_B_user 
    ?? FROM FILE = 'D:\db_A_run.cer' 
    GO 
    --赋权 
    --Grant CONNECT permission on the login for the remote mirroring endpoint. 
    GRANT CONNECT ON ENDPOINT::DB_MIRR TO [TO_HOST_B_login]; 
    GO 
    8. 
    --拷贝从HOST_A备份的数据库备份文件到D:\. 
    --还原数据库及日志 
    RESTORE DATABASE MIRR_TEST 
    ????FROM DISK = N'D:\MT.BAK' 
    ????WITH NORECOVERY ; 
    GO 
    RESTORE LOG MIRR_TEST 
    ????FROM DISK = N'D:\NGT.BAK' 
    ????WITH FILE=2, NORECOVERY; 
    GO 
    五.设置伙伴(自动启动镜像) 
    9.在HOST_B 
    ALTER DATABASE MIRR_TEST 
    ????SET PARTNER = 'TCP://HOST_A:5021'; 
    GO i.在HOST_A 
    ALTER DATABASE MIRR_TEST 
    ????SET PARTNER = 'TCP://HOST_B:5022'; 
    GO 六. OVER!
    PS: 如果HOST_A、HOST_B是在公网上则需分别在%WINDOWS%\system32\drivers\etc\hosts添加解析。 
    文章出处:DIY部落(http://www.diybl.com/course/7_databases/database_other/20090201/154716.html)