最近客户上了一套oracle 11g rac,版本11.2.0.4,操作系统使用rhel 6.4 ,今天测试了一下failover功能。由于没有DNS服务器,使用VIP进行客户端failover,tnsnames.ora配置如下:
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(LOAD_BALANCE = yes)
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.23)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.24)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.25)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
(FAILOVER = on)
(TYPE = select)
(METHOD = basic)
(RETRIES = 180)
(DELAY = 5)
)
)
PL/SQL测试过程,针对LOAD_BALANCE可以反复连接,select instance_name from v$instance; 可以验证,会连接到不同的实例。测试结果是1,2,1,2这样连的。
针对failover=on ,TYPE = select 验证也成功,PL/SQL连上select instance_name from v$instance;如果当前是实例一,shutdown实例一,重新select会返回实例二,测试通过。(sqldeveloper一直测试不通过,无论使用TNS方式连接还是JDBC,都不行,不知道为什么)。
本以为大功告成,结果tomcat是以JDBC方式进行连接的,将以上参数配置在连接池后,发现无法实现failover,只能手动重启tomcat才会连存活的实例。Google了一下,按如下方式解决:
proxool自动重新获取连接
我是oracle数据库 加 tomcat。
出现网络或者数据库故障而无法连接到数据库,在恢复正常以后,由于连接是在连接池中持久保存的,会出现连接仍然不可用的情况,这时连接池里的连接实际上都是坏连接,怎么让连接池可以自动重连清除这些坏连接呢?
网上给出的方法是加上
<test-before-use>true</test-before-use>
我是整合了spring的,把这个参数加上后
<bean id="dataSource"
class="org.logicalcobwebs.proxool.ProxoolDataSource"> <property name="driver"> <value>${jdbc.driverClassName}</value> </property> <property name="driverUrl"> <value>${jdbc.url}</value> </property> <property name="user"> <value>${jdbc.username}</value> </property> <property name="password"> <value>${jdbc.password}</value> </property> <property name="alias"> <value>cims_pool</value> </property> <property name="testBeforeUse"> <value>true</value> </property> <!-- proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 --> <!-- <property name="houseKeepingSleepTime"> <value>120000</value> </property> --> <!-- proxool测试sql语句 --> <!-- <property name="houseKeepingTestSql"> <value>select sysdate from dual</value> </property> --> <!-- 最少保持的空闲连接数 --> <property name="prototypeCount"> <value>5</value> </property> <!-- 允许最大连接数,超过了这个连接,再有请求时,就排在队列中等候 --> <property name="maximumConnectionCount"> <value>100</value> </property> <property name="minimumConnectionCount"> <value>10</value> </property> <property name="maximumActiveTime"> <value>1800000</value> </property> </bean>连接数据库就报另外一个错
Created a new connection but it failed its test
自己解决了:取消这句话的注释
<!--
<property name="houseKeepingTestSql"> <value>select sysdate from dual</value> </property> -->开启<property name="houseKeepingTestSql">
<value>select sysdate from dual</value>
</property> 就可以failover了。