从网络上扒别人的文章已经很久了,近日原创了一些代码,主要功能是使用数据库连接池和多线程技术用OCCI访问ORACLE,贴出来和大家共同学习.
#undef ACE_HAS_STANDARD_CPP_LIBRARY
#define ACE_HAS_STANDARD_CPP_LIBRARY 1
#include "ace/OS.h"
#include "ace/Log_Msg.h"
#include "ace/Task.h"
#include <iostream>
#include "occi.h"
using namespace std;
using namespace oracle::occi;
class OcciPool_handler
{
public:
/**
* Constructor for the OcciPool_handler.
*/
OcciPool_handler()
{
env_ = Environment::createEnvironment(Environment::DEFAULT);
}
/**
* Destructor for the OcciPool_handler.
*/
~OcciPool_handler()
{
env_->terminateConnectionPool(connPool_);
Environment::terminateEnvironment(env_);
}
/*
* Create the OCCI pool
*/
int create_pool()
{
const string szpoolUserName = "work";
const string szpoolPassword = "work";
const string szconnectString = "ysdb";
unsigned int nmaxConn = 16;
unsigned int nminConn = 3;
unsigned int nincrConn = 2;
connPool_ = env_->createConnectionPool(szpoolUserName, szpoolPassword,
szconnectString, nminConn, nmaxConn, nincrConn);
try
{
if (connPool_)
{
ACE_DEBUG((LM_DEBUG, ACE_TEXT("SUCCESS -createConnectionPool/n")));
return 1;
}
else
{
ACE_DEBUG((LM_DEBUG, ACE_TEXT("FAILURE -createConnectionPool/n")));
return -1;
}
}
catch (SQLException ex)
{
cout << "Exception thrown for createConnectionPool" << endl;
cout << "Error number: " << ex.getErrorCode() << endl;
cout << ex.getMessage() << endl;
return -1;
}
}
/*
* pull a connection
*/
Connection *pull_connection()
{
const string szusername = "work";
const string szpassWord = "work";
Connection *con;
try
{
if (connPool_)
{
ACE_Guard < ACE_Thread_Mutex > guard(this->mutex_);
ACE_DEBUG((LM_DEBUG, ACE_TEXT(
"(%t) Create connection from the occi pool./n")));
con = connPool_->createConnection(szusername, szpassWord);
}
else
{
cout << "OCCI pool must be created in advance." << endl;
return NULL;
}
if (con)
{
ACE_DEBUG((LM_DEBUG, ACE_TEXT("SUCCESS -createConnectionPool/n")));
return con;
}
else
{
ACE_DEBUG((LM_DEBUG, ACE_TEXT("FAILURE -createConnectionPool/n")));
return NULL;
}
}
catch (SQLException ex)
{
cout << "Exception thrown for createConnection" << endl;
cout << "Error number: " << ex.getErrorCode() << endl;
cout << ex.getMessage() << endl;
return NULL;
}
}
/*
* push a Connection
*/
void push_connection(Connection *con)
{
try
{
if (connPool_)
{
ACE_Guard < ACE_Thread_Mutex > guard(this->mutex_);
ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%t) Releace connection to the occi pool./n")));
connPool_->terminateConnection(con);
}
else
cout << "OCCI pool must be created in advance." << endl;
}
catch (SQLException ex)
{
cout << "Exception thrown for createConnection" << endl;
cout << "Error number: " << ex.getErrorCode() << endl;
cout << ex.getMessage() << endl;
}
}
private:
Environment *env_;
ConnectionPool *connPool_;
ACE_Thread_Mutex mutex_;
};
class Task_handler: public ACE_Task < ACE_MT_SYNCH > //sub children thread
{
public:
Task_handler(OcciPool_handler *pool): pool_(pool){
}
virtual int svc(void)
{
ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%t) Handler Thread running/n")));
Connection *con;
if (con = pool_->pull_connection())
{
ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%t) OCCI connection require sucessfully./n")));
}
else
{
ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%t) OCCI connection require failure./n")));
return -1;
}
Statement *localStatement = con->createStatement(
"select ioid_db,ioid_id0,ioid_type,ioid_rev,to_char(created_time,'yyyymmdd'),to_char(mod_time,'yyyymmdd'),read_access,write_access, ""staff_id,parent_id,region_level,region_name,area_code,description ""from ls6_para.region_t where region_level = :f1 order by IOID_ID0");
if (localStatement == NULL)
return -1;
localStatement->setInt(1, 3);
ResultSet *rst = NULL;
try
{
rst = localStatement->executeQuery();
}
catch (SQLException &e)
{
OutputDebugString(e.getMessage().data());
con->terminateStatement(localStatement);
return -2;
}
if (rst == NULL)
{
con->terminateStatement(localStatement);
return -3;
}
ResultSet::Status localStatus = rst->next();
if (localStatus == ResultSet::END_OF_FETCH)
{
return -3;
}
else
{
try
{
while (rst->next())
{
cout << rst->getInt(1) << "/t";
cout << rst->getInt(2) << "/t";
cout << rst->getString(3) << "/t";
cout << rst->getInt(4) << "/t";
cout << rst->getString(5) << "/t";
cout << rst->getString(6) << "/t";
cout << rst->getInt(7) << "/t";
cout << rst->getInt(8) << "/t";
cout << rst->getString(9) << "/t";
cout << rst->getInt(10) << "/t";
cout << rst->getInt(11) << "/t";
cout << rst->getString(12) << "/t";
cout << rst->getString(13) << "/t";
cout << rst->getString(14) << endl;
}
}
catch (SQLException &ex)
{
cout << "Exception thrown for displayAllRows" << "/n";
cout << "Error number: " << ex.getErrorCode() << "/n";
cout << ex.getMessage() << "/n";
}
}
localStatement->closeResultSet(rst);
con->terminateStatement(localStatement);
pool_->push_connection(con);
return 0;
}
private:
OcciPool_handler *pool_;
};
int ACE_TMAIN(int, ACE_TCHAR *[])
{
enum
{
NUM_USES = 4
};
OcciPool_handler *occipool = new OcciPool_handler();
if (occipool->create_pool())
{
ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P) OCCI pool create sucessly./n")));
}
Task_handler *task = new Task_handler(occipool);
task->activate(THR_NEW_LWP | THR_JOINABLE, NUM_USES);
ACE_Thread_Manager::instance()->wait();
delete task;
delete occipool;
return 0;
}