年近40的我又开始了写代码的工作,重新写了一个C++的数据库连接池的类,个人觉得挺方便的

来源:互联网 发布:r语言生成随机矩阵 编辑:程序博客网 时间:2024/04/29 02:47

使用方法:

std::string select(){try{Framework::database db;const char* sql="select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual";// 重载了*otl_stream o(100, sql, *db);while (!o.eof()){std::string s("");o >> s;return s;}}catch(otl_exception& p){  }return "";}int main(int argc, char** argv){// 初始化数据库连接池Framework::database::initialize("BILL/BILL@crm", 5);// 执行查询操作std::string s = select();printf("pool size = %d result = %s\n", Framework::database::size(), s.c_str());Framework::database::finished();return 0;}


//  Header.h//  Created by xuwn on 15/2/10.#ifndef __POOL_HPP__#define __POOL_HPP__#defineOTL_ORA11G_R2 // Compile OTL 4.0/OCI11.2#defineOTL_STL// Turnon STL features#include "mutex.hpp"#include "otlv4.h"#include <vector>/* how to use * example for use pool and databse  *//*std::string select(){try{Framework::database db;const char* sql="select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual";otl_stream o(100, sql, *db);while (!o.eof()){std::string s("");o >> s;return s;}}catch(otl_exception& p){  }return "";}int main(int argc, char** argv){Framework::database::initialize("BILL/BILL@crm", 5);std::string s = select();printf("pool size = %d result = %s\n", Framework::database::size(), s.c_str());Framework::database::finished();return 0;}*/namespace Framework{const int MAX_SIZE = 255;const int MIN_SIZE = 5;template <class T>class pool : public std::vector<T>{private:typedef typename std::vector<T>::iterator iterator;protected://public: pool() { }~pool() { }protected:T dequeue(){Framework::guard<Framework::mutex> guard(mutex_);iterator it = std::vector<T>::begin();if (it != std::vector<T>::end()) {object_ = (T)*it;std::vector<T>::erase(it);}return object_;}void enqueue(T v){Framework::guard<Framework::mutex> guard(mutex_);std::vector<T>::push_back(v);}private:pool(const pool& src);pool& operator=(const pool& src);private:Framework::mutexmutex_;T object_;friend class        <span style="white-space:pre"></span>database;};static pool<otl_connect*> *instance = NULL;class database{public:static void initialize(const char* connect_string, int size=5){if (instance) return ;instance = new pool<otl_connect*>;otl_connect::otl_initialize(1);size = (size > MIN_SIZE && size < MAX_SIZE) ? size : MIN_SIZE;for (int i = 0; i < size; i++){   otl_connect* connect = new otl_connect;try{connect->rlogon(connect_string);instance->enqueue(connect);}catch (...){if (connect) delete connect;throw;}}}/*  计算池的大小 */    static int size()    {        return instance->size();    }    /* 断开数据库连接,销毁分配的内存     */    static void finished()    {    pool<otl_connect*>::iterator it = instance->begin();    for (; it != instance->end(); ++it)    {    otl_connect* o = (otl_connect*)*it;    o->logoff();    delete o;    }        delete instance;    }public:database(){db_ = instance->dequeue();}~database(){  if (db_) instance->enqueue(db_);}public:otl_connect* operator->(){   return db_;  }otl_connect& operator*(){   return *db_;  }private:otl_connect* db_;};} // end namespace#endif // end __POOL_HPP__




0 0