Fix database connection pool exhaustion (#2494)

- Add PDO::ATTR_PERSISTENT => true to reuse database connections
- Handle 'too many connections' errors gracefully with HTTP 503
- Maintain backward compatibility with minimal code changes

Fixes MySQL error 1040 crashes during high load periods.
This commit is contained in:
Dieter Reinert
2025-08-04 16:04:02 +02:00
committed by GitHub
parent 44de692807
commit 29fdcb7e6a

View File

@@ -27,12 +27,21 @@ class PSDatabase {
$this->db = new PDO(
"mysql:dbname={$this->database};host={$this->server};charset={$this->charset}",
$this->username,
$this->password
$this->password,
[PDO::ATTR_PERSISTENT => true]
);
$this->db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (Exception $e) {
$this->db->exec("SET SESSION wait_timeout = 7200");
} catch (PDOException $e) {
if (strpos($e->getMessage(), '1040') !== false || strpos($e->getMessage(), 'Too many connections') !== false) {
http_response_code(503);
header('Content-Type: text/plain');
die("Database temporarily unavailable due to high load. Please try again in a few minutes.");
}
// hide passwords and stuff from stacktrace
throw new ErrorException($e->getMessage());
} catch (Exception $e) {
throw new ErrorException($e->getMessage());
}
}
}