Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Usenet -> c.d.o.server -> Re: OCI concurrent access example
the following sample works on my system
Solaris 2.7, Oracle 8.0.5.1
markus
/********************************************************** **********************************************************/#include <iostream>
using namespace std;
#define ORA_USER "system"
#define ORA_PW "yourpw"
#define ORA_CONNECT "dbora1" // connect string from TNS ora file
void ORA_DispError( char *pszFile,
char *pszFunc, int nLineNo, OCIError *errhp, sword status )
char *pszOraStatus = NULL; char *ora_status_tbl[] = { "OCI_SUCCESS" , /* index 0 */
"OCI_SUCCESS_WITH_INFO", /* 1 */
"OCI_NEED_DATA", /* 2 */
"OCI_NO_DATA", /* 3 */
"OCI_ERROR", /* 4 */
"OCI_INVALID_HANDLE", /* 5 */
"OCI_STILL_EXECUTING", /* 6 */
"OCI_CONTINUE", /* 7 */
"OCI_unknown" /* 8 */
};
case OCI_SUCCESS: pszOraStatus = ora_status_tbl[0]; break; case OCI_SUCCESS_WITH_INFO: pszOraStatus = ora_status_tbl[1]; break; case OCI_NEED_DATA: pszOraStatus = ora_status_tbl[2]; break; case OCI_NO_DATA: pszOraStatus = ora_status_tbl[3]; break; case OCI_ERROR: pszOraStatus = ora_status_tbl[4]; break; case OCI_INVALID_HANDLE: pszOraStatus = ora_status_tbl[5]; break; case OCI_STILL_EXECUTING: pszOraStatus = ora_status_tbl[6]; break; case OCI_CONTINUE: pszOraStatus = ora_status_tbl[7]; break; default: pszOraStatus = ora_status_tbl[8]; break;
if ( status != OCI_ERROR && status != OCI_NO_DATA ) {
printf( "status: %s\n", pszOraStatus ); printf( "file : %s line : %d\n", pszFile, nLineNo );}
OCIErrorGet ( (dvoid *) errhp, (ub4) 1, (text *) NULL, (sb4*)&errcode,
errbuf, (ub4) sizeof(errbuf), (ub4) OCI_HTYPE_ERROR ); printf( "file : %s line : %d\n", pszFile, nLineNo ); printf( "error : %s\n text: %s\n", pszOraStatus, errbuf );}
void check_status( sword ora_status )
{
switch( ora_status )
{
case OCI_SUCCESS: case OCI_SUCCESS_WITH_INFO: cout << "OCI: success" << endl; break; default: cout << "OCI: ERROR" << endl;
int main( void )
{
int ii = 0;
OCIEnv *envhp; OCIServer *srvhp; OCIError *errhp; OCISvcCtx *svchp; OCISession*authp; sword status;
cout << "start..." << endl;
OCIInitialize((ub4) OCI_THREADED, NULL, NULL, NULL, NULL);
for( ii=0; ii < 10; ii++ )
{
OCIEnvInit(&envhp, OCI_DEFAULT, 0, (dvoid **)0);
status = OCIHandleAlloc((dvoid *)envhp, (dvoid **)&errhp, OCI_HTYPE_ERROR,0, (dvoid **) 0);
if (status != OCI_SUCCESS) cerr << "Alloc Error Hndl failed" << endl; status = OCIHandleAlloc((dvoid *) envhp, (dvoid **) &srvhp,OCI_HTYPE_SERVER, (size_t) 0, (dvoid **) 0); check_status(status); status = OCIHandleAlloc((dvoid *) envhp, (dvoid **) &svchp,OCI_HTYPE_SVCCTX, (size_t) 0, (dvoid **) 0); check_status(status); cout << "OCIServerAttach..."; // This is the call that hangs!! periodically //
status = OCIServerAttach(srvhp, errhp, (text*)ORA_CONNECT,strlen(ORA_CONNECT), OCI_DEFAULT);
cout << "returned" << endl; check_status(status); status = OCIAttrSet((dvoid *) svchp, OCI_HTYPE_SVCCTX, (dvoid *)srvhp,(ub4) 0, OCI_ATTR_SERVER, (OCIError *) errhp); check_status(status); status = OCIHandleAlloc((dvoid *) envhp, (dvoid **)&authp, (ub4)OCI_HTYPE_SESSION, (size_t) 0, (dvoid **) 0); check_status(status); status = OCIAttrSet((dvoid *) authp, (ub4) OCI_HTYPE_SESSION, (dvoid *) ORA_USER, (ub4) strlen((char *)ORA_USER), (ub4) OCI_ATTR_USERNAME, errhp); check_status(status); status = OCIAttrSet((dvoid *) authp, (ub4) OCI_HTYPE_SESSION, (dvoid *) ORA_PW, (ub4) strlen((char *)ORA_PW), (ub4) OCI_ATTR_PASSWORD, errhp); status = OCISessionBegin(svchp, errhp, authp, OCI_CRED_RDBMS, (ub4) OCI_DEFAULT); cout << "OCISessionBegin" << endl; check_status(status); ORA_DispError( __FILE__, "main", __LINE__,errhp,status ); status = OCIAttrSet((dvoid *) svchp, (ub4) OCI_HTYPE_SVCCTX, (dvoid *) authp, (ub4) 0, (ub4) OCI_ATTR_SESSION, errhp); check_status(status);
/// Clean up and disconnect
status = OCISessionEnd(svchp, errhp, authp, (ub4) OCI_DEFAULT); check_status(status); status = OCIServerDetach(srvhp, errhp, OCI_DEFAULT); check_status(status); status = OCIHandleFree(authp, OCI_HTYPE_SESSION); check_status(status); status = OCIHandleFree(srvhp, OCI_HTYPE_SERVER); check_status(status); status = OCIHandleFree(svchp, OCI_HTYPE_SVCCTX); check_status(status); status = OCIHandleFree(errhp, OCI_HTYPE_ERROR); check_status(status); if (envhp) { status = OCIHandleFree(envhp, OCI_HTYPE_ENV); if (status != OCI_SUCCESS) cerr << "Release Oracle environment handle failed"; }
cout << "### end ###" << endl;
}
Simeon Bailey wrote:
> > "Markus M. Mueller" wrote: > > > Have you tried, to give each thread a dedicated connection? > > In my application each thread has even it's own OCIEnv pointer. > > > > give it a try. > > No Luck, I simplified it to just connecting an disconnecting in a loop and it > still hangs > This is simple stuff. > It is almost exactly oracle example code! > > OCIInitialize((ub4) OCI_THREADED, NULL, NULL, NULL, NULL); > while (1) { > > OCIEnvInit(&envhp, OCI_DEFAULT, 0, (dvoid **)0); > > status = OCIHandleAlloc((dvoid *)envhp, (dvoid **)&errhp, OCI_HTYPE_ERROR, > 0, (dvoid **) 0); > if (status != OCI_SUCCESS) > cerr << "Alloc Error Hndl failed" << endl; > > status = OCIHandleAlloc((dvoid *) envhp, (dvoid **) &srvhp, > OCI_HTYPE_SERVER, (size_t) 0, (dvoid **) 0); > check_status(status); > > status = OCIHandleAlloc((dvoid *) envhp, (dvoid **) &svchp, > OCI_HTYPE_SVCCTX, (size_t) 0, (dvoid **) 0); > check_status(status); > > // This is the call that hangs!! periodically > status = OCIServerAttach(srvhp, errhp, (text *)0, 0, OCI_DEFAULT); > check_status(status); > > status = OCIAttrSet((dvoid *) svchp, OCI_HTYPE_SVCCTX, (dvoid *)srvhp, > (ub4) 0, OCI_ATTR_SERVER, (OCIError *) errhp); > check_status(status); > > status = OCIHandleAlloc((dvoid *) envhp, (dvoid **)&authp, (ub4) > OCI_HTYPE_SESSION, (size_t) 0, (dvoid **) 0); > check_status(status); > > status = OCIAttrSet((dvoid *) authp, (ub4) OCI_HTYPE_SESSION, > (dvoid *) "snoopdogg", (ub4) strlen((char *)"snoopdogg"), > (ub4) OCI_ATTR_USERNAME, errhp); > check_status(status); > > status = OCIAttrSet((dvoid *) authp, (ub4) OCI_HTYPE_SESSION, > (dvoid *) "thepass", (ub4) strlen((char *)"thepass"), > > status = OCISessionBegin(svchp, errhp, authp, OCI_CRED_RDBMS, > (ub4) OCI_DEFAULT); > check_status(status); > > status = OCIAttrSet((dvoid *) svchp, (ub4) OCI_HTYPE_SVCCTX, > (dvoid *) authp, (ub4) 0, > (ub4) OCI_ATTR_SESSION, errhp); > check_status(status); > > /// Clean up and disconnect > > status = OCISessionEnd(svchp, errhp, authp, > (ub4) OCI_DEFAULT); > check_status(status); > > status = OCIServerDetach(srvhp, errhp, OCI_DEFAULT); > check_status(status); > > status = OCIHandleFree(authp, OCI_HTYPE_SESSION); > check_status(status); > > status = OCIHandleFree(srvhp, OCI_HTYPE_SERVER); > check_status(status); > > status = OCIHandleFree(svchp, OCI_HTYPE_SVCCTX); > check_status(status); > > status = OCIHandleFree(errhp, OCI_HTYPE_ERROR); > check_status(status); > > if (envhp) { > status = OCIHandleFree(envhp, OCI_HTYPE_ENV); > if (status != OCI_SUCCESS) > cerr << "Release Oracle environment handle failed"; > } > }Received on Thu Sep 02 1999 - 03:37:13 CDT
![]() |
![]() |