Reuse MySQL connections within requests
This commit is contained in:
+27
-4
@@ -804,6 +804,7 @@ public:
|
||||
// never cache these opaque handles across requests.
|
||||
std::vector<SQLite*> sqlite_handles;
|
||||
std::vector<MySQL*> mysql_handles;
|
||||
std::vector<MySQL*> mysql_request_pool;
|
||||
#endif
|
||||
~WasmWorkspace()
|
||||
{
|
||||
@@ -820,7 +821,7 @@ public:
|
||||
for(auto* db : sqlite_handles)
|
||||
if(db)
|
||||
delete db; // ~SQLite disconnects
|
||||
for(auto* db : mysql_handles)
|
||||
for(auto* db : mysql_request_pool)
|
||||
if(db)
|
||||
delete db; // ~MySQL disconnects
|
||||
#endif
|
||||
@@ -2409,11 +2410,32 @@ private:
|
||||
String op = request["op"].to_string();
|
||||
if(op == "connect")
|
||||
{
|
||||
MySQL* db = new MySQL();
|
||||
bool ok = db->connect(request["host"].to_string(), request["username"].to_string(), request["password"].to_string());
|
||||
String host = request["host"].to_string();
|
||||
String username = request["username"].to_string();
|
||||
String password = request["password"].to_string();
|
||||
MySQL* db = 0;
|
||||
for(auto* pooled : self->mysql_request_pool)
|
||||
if(pooled && pooled->connection && pooled->request_host == host && pooled->request_username == username && pooled->request_password == password)
|
||||
{
|
||||
db = pooled;
|
||||
break;
|
||||
}
|
||||
bool ok = db != 0;
|
||||
if(!db)
|
||||
{
|
||||
db = new MySQL();
|
||||
db->request_pooled = true;
|
||||
db->request_host = host;
|
||||
db->request_username = username;
|
||||
db->request_password = password;
|
||||
ok = db->connect(host, username, password);
|
||||
if(ok && db->connection)
|
||||
self->mysql_request_pool.push_back(db);
|
||||
}
|
||||
u64 handle = 0;
|
||||
if(ok && db->connection)
|
||||
{
|
||||
db->request_leases++;
|
||||
self->mysql_handles.push_back(db);
|
||||
handle = self->mysql_handles.size();
|
||||
}
|
||||
@@ -2443,7 +2465,8 @@ private:
|
||||
}
|
||||
else if(op == "disconnect" && db)
|
||||
{
|
||||
delete db;
|
||||
if(db->request_leases > 0)
|
||||
db->request_leases--;
|
||||
self->mysql_handles[(size_t)handle - 1] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user