我正在尝试使用libpqxx库开发一个非常简单直接的连接池。我对c++还很陌生,对指针和引用仍然很迷惑。这个类的行为非常简单:拥有一个带有一些初始化连接的向量,并在需要时将连接弹出和推送到向量上。由于指针和引用的错误实现,代码中有许多错误。你能给我一些提示吗?
编辑:我设法修复了所有的编译错误。当我运行main函数时,它给了我一个分段错误。
class DbPool {公共:
pqxx::result runQuery(const string& query) {
connection *conn = getCon();
work trans(*conn);
result res = trans.exec(query);
trans.commit();
releaseCon(conn);
return res;
}
DbPool(uint32_t max_cons) {
for (uint32_t i = 0; i < max_cons; i++) {
connection* con = createCon();
m_freeCons.push_back(shared_ptr < connection > (con));
}
}私有:
connection * createCon() {
connection * conn =
new connection(
"user='ak' password='rootpassword' dbname='bips_office' hostaddr='127.0.0.1' port='5432'");
return conn;
}
void releaseCon(connection *con) {
m_freeCons.push_back(shared_ptr < connection > (con));
}
connection* getCon() {
shared_ptr < connection > conn = *(m_freeCons.end() - 1);
m_freeCons.pop_back();
return conn.get();
}
vector<shared_ptr<connection> > m_freeCons;};
int main(int argc, char *argv[]) {
DbPool *pool = new DbPool(5);
result res = pool->runQuery("SELECT COUNT (*) from captures");
return 0;
}发布于 2012-09-21 18:00:29
如果你担心设计问题,这里是我的5分钱:
m_freeCons.push_back(*con); - *取消引用指向connection的指针通常不是一个给成员提供可修改句柄的好主意(就像你在getCon方法中所做的那样--至少,如果可能的话,返回一个connection const *而不是shared_ptr而不是原始指针-这样你就不必担心释放内存;或者使用Boost.PointerContainer;另请参阅here.return &(*conn)?这将解除对指针conn的引用,然后再次获取它的地址。相反,您可以简单地编写return conn!在回答你用shared_ptrs重写的问题时:你仍然需要用new创建连接,并在它周围包装一个shared_ptr;例如,对于createCon:
connection * createCon(){
connection * conn = new connection("user='ak' password='rootpassword' dbname='bips_office' hostaddr='127.0.0.1' port='5432'");
return conn;
}和
connection* con = createCon();
m_freeCons.push_back(shared_ptr<connection>(con));在其他地方也是如此。
发布于 2016-01-02 03:41:48
受你的帖子的启发,我在我自己的项目中使用了这个简单的连接池。我使用std::stack。推送和弹出。除了在添加连接时使用try-catch外,不进行错误检查。对于postgresql-db。
Database.hpp:
#include <stack>
#include <pqxx/pqxx>
class Database {
private:
const std::string connectionString = "dbname=db user=usr hostaddr=127.0.0.1 port=5432";
std::stack<pqxx::connection *> dbpool;
public:
Database(const unsigned int);Database.cpp:
#include "Database.hpp"
Database::Database(const unsigned int connections) {
for (int i = 0; i < connections; ++i) {
try {
auto* dbconn = new pqxx::connection(connectionString);
dbpool.emplace(dbconn);
} catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
}
}
}main.cpp:
#include "Database.hpp"
int main(int argc, char* argv[]) {
Database database {10};
auto *D = dbpool.top();
dbpool.pop();
const std::string query = "select * from mytable";
pqxx::nontransaction N(*D);
pqxx::result R(N.exec(query));
for (pqxx::result::const_iterator c = R.begin(); c != R.end(); ++c) {
std::cout << c[1].as<std::string>() << std::endl;
};
dbpool.push(D);
}https://stackoverflow.com/questions/12528199
复制相似问题