java oracle thin 和 oci 连接方式实现多数据库的故障切换,thinoci
java oracle thin 和 oci 连接方式实现多数据库的故障切换
一、thin方式
其中URL为
jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)
(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=10.132.111.14)(PORT=1521))
(CONNECT_DATA=(SERVICE_NAME=bomc)))
其中LOAD_BALANCE=on表示负载开启,java以随机的方式创建会话连接;
LOAD_BANLANCE=off表示负载关闭,java以顺序的方式创建会话连接,只有
当第一个数据库出现故障无法连接时才会选择第二个数据库进行会话连接。
二、oci方式
1. 具体程序部署的本机需要安装oracle客户端,并在PATH路径下指定oracle客户端bin目录,并拷贝
oracle客户端里自带的jdbc驱动到自己的工程项目。
2. 配置TNSNAMES.ORA文件如下:
HA_DB =
(DESCRIPTION_LIST =
(LOAD_BALANCE = on)
(FAILOVER = on)
(DESCRIPTION =
(ADDRESS_LIST =
(LOAD_BALANCE=OFF)
(FAILOVER=ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = bomc)
(INSTANCE_NAME = bomc)
(FAILOVER_MODE=(TYPE=session)(METHOD=basic)(RETRIES=4)(DELAY=1))
)
)
(DESCRIPTION =
(ADDRESS_LIST =
(LOAD_BALANCE=OFF)
(FAILOVER=ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.132.111.14)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = bomc)
(INSTANCE_NAME = bomc)
(FAILOVER_MODE=(TYPE=session)(METHOD=basic)(RETRIES=4)(DELAY=1))
)
)
(DESCRIPTION =
(ADDRESS_LIST =
(LOAD_BALANCE=OFF)
(FAILOVER=ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.112.11.161)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = bomc)
(INSTANCE_NAME = bomc)
(FAILOVER_MODE=(TYPE=session)(METHOD=basic)(RETRIES=4)(DELAY=1))
)
)
)
关于其中的配置参数作用请查相关资料!
3. java jdbc连接
其中URL写为java:oracle:oci:@ha_db
OCI 只是一种连接方式,既然你使用 Java 来做客户端程序,为什么要使用 Native 方式的驱动?
你应该使用 java:oracle:thin:@ 的 thin 协议来连接数据库。
OCI 本身是为 C++, VB 这样的程序准备的。Java 版本的程序建议使用 thin 协议的驱动。
Java 驱动有4种类型,type 1 - type 4,现在已经基本上普及了type 4驱动,几乎所有的厂商都提供 type 4驱动,它是说服务器端和驱动程序之间是厂商内部网络通信格式,驱动程序和 java 程序之间是纯 java。而依赖厂商的 DLL 的驱动就是 type 2,它是要求在当前 path 变量路径或 java.library.path 参数的路径上能找到 oracle 驱动程序的 DLL。所以如果你坚持使用 oci 驱动,你需要把 oracle 的 BIN 目录 (可能还有其它目录,反正有Oracle 的 DLL 的目录你都得确认一下)添加到 PATH 变量中。
而且要记得,type 2 驱动跟版本之间的依赖关系比较大,可能它要求特定版本的 DLL,而 type 2 则不同,它本身不依赖 dll,驱动与服务器之间本来就是纯 java 版的,它本身代替了DLL 的功能,所以版本依赖关系小。
你的 -Djava.library.path 的路径是真实存在的 oracle 客户端目录么?里面说的那个 dll 能找到么?你的程序中 println(System.getProperty("java.library.path")) 得到的结果是什么?
先看看thin和oci的url写法上的区别:
jdbc:oracle:thin:@server ip: service
jdbc:oracle:oci:@service
1)从使用上来说,oci必须在客户机上安装oracle客户端或才能连接,而thin就不需要,因此从使用上来讲thin还是更加方便,这也是thin比较常见的原因。
2)原理上来看,thin是纯java实现tcp/ip的c/s通讯;而oci方式,客户端通过native java method调用c library访问服务端,而这个c library就是oci(oracle called interface),因此这个oci总是需要随着oracle客户端安装(从oracle10.1.0开始,单独提供OCI Instant Client,不用再完整的安装client)
3)它们分别是不同的驱动类别,oci是二类驱动, thin是四类驱动,但它们在功能上并无差异。
4)虽然很多人说oci的速度快于thin,但找了半天没有找到相关的测试报告。