最近客户上了一套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

补充: [ Scheduler Warning ] Scheduler Init Servlet failed!
Scheduler Excption: org.springframework.transaction.CannotCreateTransactionExce
ption: Could not open Hibernate Session for transaction; nested exception is org
.hibernate.exception.GenericJDBCException: Cannot open connection
补充:

自己解决了:取消这句话的注释

<!--
<property name="houseKeepingTestSql">
<value>select sysdate from dual</value>
</property>
-->



开启<property name="houseKeepingTestSql">
<value>select sysdate from dual</value>
</property> 就可以failover了。