年近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
- 年近40的我又开始了写代码的工作,重新写了一个C++的数据库连接池的类,个人觉得挺方便的
- 写了一个简单的数据库连接池
- 开始写我的剥壳了.......
- 开始写我的博客了
- 我的博客开始写了!
- 为了工作方便写的的一个代码生成器
- 写了一个自己都觉得陌生的程序
- 自己写了一个简单的mysql数据库连接类
- 重新写了一个简单的日志类
- 这是一个让我写了近5个小时的程序
- 我写了一个英文的comments
- 我又开始写博客了,此处是华丽的分隔线。
- 觉得应该开始重新规划自己的人生了
- 结束了近一个星期的VC数据库编程,我觉得有必要总结一下
- 我又写了个空心的等边三角形
- 我要开始写我的blog日志了
- 我开始写我的博文了
- 从现在起 我开始写我自己的技术博客了
- 迟玖沿置孔脊付颇壮驮
- window7下配置IOS开发环境 搭建模拟器
- 使用Storm实现实时大数据分析
- 转 -- linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )
- 创建并启动 Java 线程
- 年近40的我又开始了写代码的工作,重新写了一个C++的数据库连接池的类,个人觉得挺方便的
- android使用Xuitls上传文件(服务端实现为java)
- Android断点调试Service
- ORACLE用SYS登录报ORA-28009:connection as SYS should be as SYSDBA OR SYSOPER解决方法
- 第一次作业:源代码计算器
- qtcreator调试 提示ptrace 不允许的操作 解决办法
- Best Time to Buy and Sell Stock(JAVA)--动态规划
- ios配置总结
- 快速幂取余