qq_44527692 2024-03-18 10:42 采纳率: 12.5%
浏览 30
已结题

occi的线程池创建

我想通过httplib创建一个post请求,然后创建occi的连接池创建10个连接,然后通过接受body的sql语句,往连接池里面添加sql语句进行查询,并接受返回值,返回给客户端,但是我不知道为什么我创建的代码使用后,总是会报各种错,有ORA-24550: signal received,ORA-21500: internal error code等其他的,我估计是连接池的创建有问题,能帮我修改下代码或者帮我重写个occi的连接池使用吗


#include "httplib.h"
#include "rapidjson/document.h"
#include <occi.h>
#include <condition_variable>
#include <iostream>
#include <mutex>
#include <queue>
#include <vector>

#pragma comment(lib, "oraocci12.lib")

using namespace oracle::occi;
using namespace std;

class ConnectionPool1 {
private:
    Environment *env;
    vector<Connection*> connections;
    queue<Connection*> availableConnections;
    mutex mtx;
    condition_variable cv;
    bool stop;

public:
    ConnectionPool1(int numConnections) : stop(false) {
        env = Environment::createEnvironment();

        for (int i = 0; i < numConnections; ++i) {
            Connection *conn = env->createConnection("admin", "admin", "192.168.111.121:1521/orcl");
            connections.push_back(conn);
            availableConnections.push(conn);
        }
    }

    Connection* getConnection() {
        unique_lock<mutex> lock(mtx);
        while (availableConnections.empty()) {
            cv.wait(lock);
        }

        Connection* conn = availableConnections.front();
        availableConnections.pop();
        return conn;
    }

    void releaseConnection(Connection* conn) {
        unique_lock<mutex> lock(mtx);
        availableConnections.push(conn);
        cv.notify_one();
    }

    void stopPool() {
        stop = true;
        for (auto &conn : connections) {
            env->terminateConnection(conn);
        }
        Environment::terminateEnvironment(env);
    }

    string executeSQL(Connection* conn, const string& sql) {
        try {
            Statement* stmt = conn->createStatement(sql);
            ResultSet* rs = stmt->executeQuery();
            OCCI_STD_NAMESPACE::vector<oracle::occi::MetaData> columnMetaData = rs->getColumnListMetaData();
            unsigned int columnCount = columnMetaData.size();

            std::cout << "Number of columns: " << columnCount << std::endl;
            if (columnCount == 0) {
                stmt->closeResultSet(rs);
                conn->terminateStatement(stmt);
                return "ture";
            }

            string sql_sj;
            sql_sj += "[\n";
            while (rs->next()) {
                sql_sj += "{\n";
                for (int i = 1; i <= columnCount; i++) {
                    sql_sj += '"';
                    sql_sj += columnMetaData[i - 1].getString(oracle::occi::MetaData::ATTR_NAME);
                    sql_sj += "\":\"";
                    std::string outputString;
                    string aa = rs->getString(i);
                    for (char c : aa) {
                        if (c == '"') {
                            outputString += '\\'; // Add backslash
                        }
                        outputString += c;
                    }
                    sql_sj += outputString;
                    sql_sj += '"';
                    if (i != columnCount)
                        sql_sj += ',';
                    sql_sj += "\n";
                }
                sql_sj += "}\n";
            }
            sql_sj += ']';
            cout << sql_sj << endl;
            conn->terminateStatement(stmt);
            return sql_sj;
        }
        catch (SQLException &ex) {
            cerr << "Exception caught: " << ex.what() << endl;
            // Handle connection error here
            env->terminateConnection(conn);
            Connection* newConn = env->createConnection("admin", "admin", "192.168.111.121:1521/orcl");
            unique_lock<mutex> lock(mtx);
            connections.push_back(newConn);
            availableConnections.push(newConn);
            return "false";
        }
    }

    ~ConnectionPool1() {
        stopPool();
    }
};

int main() {
    ConnectionPool1 connPool(10);
    using namespace httplib;

    Server svr;
    //用于获取sql的内容
    svr.Post("/database/sqlcx", (Server::Handler)[&](const Request &req, Response &res)
    {
        string body = req.body;
        std::cout << req.body << std::endl;

        std::string sql;
        rapidjson::Document document;
        document.Parse(body.c_str());

        if (document.HasParseError()) {
            std::cout << "Failed to parse JSON string." << std::endl;
            return 1;
        }
        if (document.HasMember("sql")) {
            std::cout << "sql: " << document["sql"].GetString() << std::endl;
            sql = document["sql"].GetString();
        }
        Connection* conn = connPool.getConnection();
        string aa = connPool.executeSQL(conn, sql);
        res.set_content(aa, "text/plain");  // Replace with your SQL query
    
        if(aa != "false")
        // Release the connection back to the pool
        connPool.releaseConnection(conn);
    });

    svr.listen("0.0.0.0", 8950);
    return 0;
}

  • 写回答

20条回答 默认 最新

  • threenewbee 2024-03-18 10:49
    关注
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月25日
  • 创建了问题 3月18日