我想通过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;
}