是采用Tuxedo进行编程,在tpsvrinit函数中加入和ORACLE连接的操作部分,其函数内容如下:OCIInitialize(OCI_DEFAULT|OCI_OBJECT,(dvoid *)0,0,0,0);
OCIEnvInit(&tpcenv, OCI_DEFAULT, 0, (dvoid **)0);
OCIHandleAlloc((dvoid *)tpcenv, (dvoid **)&tpcsrv, OCI_HTYPE_SERVER, 0 , (dvoid **)0);
OCIHandleAlloc((dvoid *)tpcenv, (dvoid **)&errhp, OCI_HTYPE_ERROR, 0 , (dvoid **)0);
OCIHandleAlloc((dvoid *)tpcenv, (dvoid **)&tpcsvc, OCI_HTYPE_SVCCTX, 0 , (dvoid **)0);
for (;;) {
      rval = OCIServerAttach(tpcsrv, errhp, (text *)0, 0,OCI_DEFAULT);
      if (rval == OCI_SUCCESS || rval == OCI_SUCCESS_WITH_INFO)
           break;
      OCIERROR(errhp, rval);
      sleep(1);
   }由于在执行OCIServerAttach函数时出错,因此不断的在sqlnet.log中出现如下错误:Fatal NI connect error 12545, connecting to:
 (DESCRIPTION=(ADDRESS=(PROTOCOL=beq)(PROGRAM=/opt/oracle/bin/oracle)(ARGV0=oracletpccraw80)(ARGS='(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))')(DETACH=NO))(CONNECT_DATA=(CID=(PROGRAM=tpccfmlw)(HOST=node122)(USER=oracle))))原因应该是设置连接的数据库sid和hostname错误了。实际上我需要连接的数据库的hostname是128.5.30.111,SID是tpccraw80。而我写的tnsnames.ora中的内容是按照正确格式设置的:tpcc =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL= TCP)(Host= 128.5.30.111)(Port= 1521))
    (SDU=14600)
    (CONNECT_DATA = (SERVICE_NAME = tpccraw80))
  )
想问各位大侠,如何修改tnsnames.ora或者是OCI调用使我的程序能正确的连接到Oracle数据库?

解决方案 »

  1.   

    楼主,你的Tuxedo服务端代码是写在Windows主机还是Linux主机上的?
      

  2.   

    我记得好像还得配置一个ubb文件吧。
    服务启动的时候,一般是通过ubbconfig文件里的数据库配置信息来连接数据库的吧:
    OPENINFO="Oracle_XA:Oracle_XA+SqlNet=tpccraw80+Acc=P/username/password+SesTm=120+MaxCur=5+LogDir=."
    好象是这个。
    另外,你用于访问数据库的用户,应该得赋一个事务处理的权限吧:
    grant select on DBA_PENDING_TRANSACTIONS to username;
      

  3.   

    谢谢你的提醒,我是在Linux主机上,ubb配置文件我是配置了的,但是没有你所说的那一行。但是我通过更改OCI代码也已经解决了这个问题,具体的更改就是把上述代码中的
    OCIServerAttach(tpcsrv, errhp, (text *)0, 0,OCI_DEFAULT);
    更改为
    OCIServerAttach(tpcsrv, errhp, "tpcc",sizeof("tpcc"),OCI_DEFAULT);//tnsnames.ora中要连接的数据库的别名
      

  4.   

    不一定是连接数据库sid和hostname错误,我觉得就是tnsnames.ora的问题,tnsnames.ora有时很严格的,多一个空格都会无法解析,比如你的tpcc前面多一个空格,就可能导致连不上数据库
      

  5.   

    oci连接数据库要告诉程序连接哪个数据库,一般的调用方法都是从tnsnames.ora中根据tnsname去获取要连接的数据库信息
      

  6.   

    通过楼主现在的现象判断,不是tnsnames.ora的问题。
    因为他改完代码之后,就好用了。
    如果是tnsnames.ora的问题,改完代码也不会好用。
      

  7.   

    咱俩用的模式可能是不一样的。
    你看我的ubb里:
    *GROUPS
    DEFAULT: 
    GROUP1 LMID=SITE1 GRPNO=1
            OPENINFO="Oracle_XA:Oracle_XA+SqlNet=实例名
             +Acc=P/user/psd+SesTm=120+MaxCur=80+LogDir=./log"