#ifdef WIN32
# include
# define sleep(x) Sleep(x*1000)
#else
# include
#endif
#include
#include
#include
#include
#include
#include "sqlgbase.h"
#define isSuc(result) ((result) == SQL_SUCCESS || (result) ==
SQL_SUCCESS_WITH_INFO)
#define FOR_TIMES 50
#define CON_NUM 50
SQLHANDLE henv;
int seg;
#ifdef WIN32
GBase 8a 程序员手册ODBC 篇
南大通用数据技术股份有限公司
- 61 -
CRITICAL_SECTION thread_quit_lock;
#define THREAD_ID() GetCurrentThreadId()
#else
pthread_mutex_t thread_quit_lock;
#define THREAD_ID() pthread_self()
#endif
void getError(SQLSMALLINT type, SQLHANDLE handle)
{
SQLCHAR sqlstate[1024];
SQLCHAR errormes[1024];
SQLINTEGER numerror;
SQLSMALLINT errlen;
SQLGetDiagRec(type, handle, 1, sqlstate, &numerror, errormes,
1024, &errlen);
printf("sqlstate:%s\terrmsg:%s\terrno:%d\n",sqlstate,
errormes, numerror);
}
char* connStr = "DRIVER=GBase 8a ODBC 8.3
Driver;UID=gbase;PWD=gbase20110531;"
"SERVER={192.168.9.173;192.168.9.174;192.168.9.175};DATABASE
=test; PORT=5258;"
"GCLUSTER_ID=aaa;POOL_MAX_ACTIVE_SIZE=70;POOL_MAX_IDLE=65;"
"POOL_INIT_SIZE=10;"
"POOL_TEST_BORROW=0;"
"POOL_LBS=1;"
"POOL_CHECKOUT_TIMEOUT=5000;"
"POOL_MANAGER=1;"
"POOL_TEST_INVALID_CONN_PERIOD=2000;"
"POOL_KEEP_IDLE=1; POOL_MIN_IDLE=12;"
GBase 8a 程序员手册ODBC 篇
- 62 -
南大通用数据技术股份有限公司
"POOL_CLEAR_OVERDUE=1; POOL_USED_LIFE=400000;
POOL_IDLE_LIFE=0;";
#ifdef WIN32
DWORD WINAPI thread_bf(LPVOID arg)
#else
int thread_bf(void* arg)
#endif
{
SQLHDBC hdbc;
SQLHANDLE hsmt;
int sret = 0;
int i =0 ;
clock_t t1, t2;
time_t t;
int rc = 0;
while(i < FOR_TIMES)
{
t1 = t2 = clock();
SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
sret = SQLDriverConnect(hdbc,
NULL, connStr, SQL_NTS,NULL,
0, NULL, 0);
if (!isSuc(sret))
{
getError(SQL_HANDLE_DBC, hdbc);
}
else
{
t2 = clock();
time(&t);
printf("thread id %u\t\tconnect success! use %lu
msec\t%s.\n",THREAD_ID(), (t2 - t1), ctime(&t));
rc = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hsmt);
if (rc == SQL_SUCCESS)
{
GBase 8a 程序员手册ODBC 篇
南大通用数据技术股份有限公司
- 63 -
SQLExecDirect(hsmt,
"show
databases",
strlen("show
databases"));
SQLFreeHandle(SQL_HANDLE_STMT, hsmt);
}
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
}
i++;
}
#ifdef WIN32
EnterCriticalSection(&thread_quit_lock);
seg--;
LeaveCriticalSection(&thread_quit_lock);
#else
pthread_mutex_lock(&thread_quit_lock);
seg--;
pthread_mutex_unlock(&thread_quit_lock);
#endif
return 0;
}
void t1_bf()
{
SQLHDBC hdbc;
int rc = 0, i = 0;
#ifdef WIN32
InitializeCriticalSection(&thread_quit_lock);
#else
pthread_mutex_init(&thread_quit_lock, NULL);
#endif
SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);
SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_O
DBC3,0);
GBase 8a 程序员手册ODBC 篇
- 64 -
南大通用数据技术股份有限公司
seg = CON_NUM;
while(i{
#ifdef WIN32
CreateThread(NULL, 0, thread_bf, NULL, 0, NULL);
#else
pthread_t thread;
pthread_create(&thread, 0, thread_bf, NULL);
#endif
i++;
}
while(seg > 0)sleep(1);
SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
rc
=
SQLDriverConnect(hdbc,
NULL,
connStr,
SQL_NTS,NULL,
0,
NULL,
0);
if (!isSuc(rc))
{
getError(SQL_HANDLE_DBC, hdbc);
return;
}
SQLSetConnectAttr(hdbc, SQL_ATTR_GBASE_POOL_FREE,
SQL_FREE_GBASE_POOL, NULL);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}