ACE多线程技术和OCCI连接池技术的应用测试

主要功能是使用数据库连接池和多线程技术用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;
}
 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值