使用方法:
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__ #define OTL_ORA11G_R2 // Compile OTL 4.0/OCI11.2 #define OTL_STL // Turn on 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::mutex mutex_; 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__