日期:2014-05-16  浏览次数:20562 次

Oracle的oci和thin连接
Oracle的oci和thin连接
2010年04月27日 星期二 03:42 P.M.
Oracle的oci配置可以在ora92\network\admin\SAMPLE有sqlnet.ora和tnsnames.ora的样本(包含注释)

Oracle的oci和thin的不同
今天,在配置开发环境的时候,出现了一个问题。
按照常规,修改了平时填写Oracle SID或者SERVICE_NAME的地方,启动Jboss
报错:java.sql.SQLException: ORA-12154: TNS:could not resolve the connect identifier specified
不能识别指定的连接标识符……

仔细检查一遍,发现问题,在配置文件里面怎么看不到在哪设置ip地址跟端口号?
找原来的项目的连接标识符,对比如下:
原来的是jdbc:oracle:thin:@172.0.0.1:1521:orcl
现在的是jdbc:oracle:oci:@land
thin变成了oci,原来的ip地址跟端口号没了

立马反映过来,下面的land就是就是配置Oracle客户端时候的连接字符串,oci连接oracle方式类似于PLSQL Developer连接oracle,land包含了IP、端口、SID信息。
修改配置文件,把填的SID改成自己定义的服务别名,搞定!


总结:
1、使用oci方式连接,需要安装Oracle客户端(网上有精简版本的,down下来,配置一下环境变量就ok)。使用thin方式就不需要。因此,个人感觉还是thin方式方便。
2、原理上分析:thin方式是纯java实现tcp/ip的通讯;而oci方式,客户端通过native java method调用c library访问服务端,而这个c library就是oci(oracle called interface),因此这个oci总是需要随着oracle客户端安装
3、驱动类别不同,oci是二类驱动,thin是三、四类驱动。
4、性能方面,没研究过,有待发现。
今天有意了解一下区别,先看看thin和oci的url写法上的区别:
jdbc:oracle:thin:@server ip: service
jdbc:oracle:oci:@service
看来oci的还更加简洁,ip可以省掉不写了


Oracle的thin与oci连接方式
应用与oracle的连接分为thin和oci两种模式,前者不需要oracle客户端的支持,后者需要。
jdbc:oracle:thin:@youroraclehost:1521:yoursid
jdbc:oracle:thin:@(description=(address=(host=youroraclehost)(protocol=tcp)(port=1521))(connect_data=(SERVICE_NAME=yourservicename)))
jdbc:oracle:oci:@youroracle-tns-name
jdbc:oracle:oci:@(description=(address=(host=youroraclehost)(protocol=tcp)(port=1521))(connect_data=(SERVICE_NAME=yourservicename)))
昨天把UAT环境上的thin模式改为了oci模式,但是由于jboss的启动脚本有一处错误,导致jboss半天没有起来。这里记录一下使用oci模式需要注意的地方。
大部分情况下,jboss启动不起来是由于环境变量的问题。
LD_LIBRARY_PATH=$ORACLE_HOME/lib32
环境变量LD_LIBRARY_PATH是用来设置共享目标库的,linux系统会在搜索标准库之前搜索共享目标库java脚本 错误,而且这里面的函数也会override the functions in standard library
JAVA_OPTS="$JAVA_OPTS -Dprogram.name=$PROGNAME -Djava.library.path=$ORACLE_HOME/lib32"
这个是我们的java启动脚本。需要注意的是-Djava.library.path=$ORACLE_HOME/lib32,它告诉java其native library的搜索路径。
否则你会得到这个错误。
no ocijdbc9 in java.library.path
昨天就是这里错了-Djava.library.path=$ORACLE_HOME/lib32.2


ORACLE客户端远程连接服务器

   1. 通过SQL*NET协议,ORACLE客户端连服务器时一般需要配置sqlnet.ora和tnsnames.ora,init.ora。
   它们默认的目录在$ORACLE_HOME/network/admin 目录下
  
   也可以设置环境变量TNS_ADMIN指向你想用的sqlnet.ora和tnsnames.ora目录
   例如:
   TNS_ADMIN=/home/oracle/config/9.0.1;export TNS_ADMIN
  
   sqlnet.ora文件决定找数据库服务器别名的方式
  
   默认的参数有
   参数SQLNET.AUTHENTICATION_SERVICES= (NONE,NTS)表明用户连接Oracle服务器时使用哪种验证方式NONE表示Oracle身份验证,NTS表示操      作系统身份验证,两种方式可以并用。
     ORA_DBA组中的域用户和本地用户不需要Oracle用户名和密码就可以登录Oracle而且该组的用户登录数据库后都具有SYSDBA权限(多个实      例时,可以建立类似这样的组ORA_SID_DBA,其中SID指实例名)同理:ORA_OPER组中的成员具有SYSOPER角色的权限。
    登录方式 sqlplus “/ as sysdba”
    或者sqlplus nolog,然后SQL>connect / as sysdba
   
   NAMES.DEFAULT_DOMAIN = WORLD
   NAMES.DIRECTORY_PATH = (TNSNAMES, ONAMES, HOSTNAME)
   表明解析客户端连接时所用的主机字符串的方式
    TNSNAMES表示采用TNSNAMES.ORA文件来解析;
    ONAMES表示使用自己的名称服务器(Oracle Name Server)来解析,目前Oracle建议使用轻量目录访问协议LDAP来取代ONAMES;
    HOSTNAME表示使用host文件,DNS,NIS等来解析;
   如果你的ORACLE客户端和服务器默认的域名不一样,需要用#号注释第一行
   #NAMES.DEFAULT_DOMAIN = WORLD
   使它不起作用。
   NAMES.DIRECTORY_PATH指定找服务器别名的顺序 (本地的tnsnames.ora文件, 命名服务器, 主机名方式)
   服务器的sqlnet.ora里可以设置检查客户端是否alive的时间间隔
   sqlnet.expire_time = 10

init.ora中的Remote_Login_Passwordfile对身份验证的影响
    三个可选值:
    NONE:默