Comments 4
public function query(..., string $query, array $params = []): array {
$this->connectionPool->freeConnection($connection);
}
У вас на каждый SQL-запрос используется своё подключение, это не будет работать с транзакциями, в реальном приложении это нельзя использовать. В течение всей обработки веб-запроса должно использоваться одно подключение.
Лучше сделать так: для всех изменяющих действий сделать INSERT в таблицу log в той же транзакции, сделать откат транзакции по флагу в GET-параметре с вероятностью 30%, и после завершения бенчмарка проверять, что добавилось то что нужно и ничего не откатилось из-из отката в параллельном запросе. Для UPDATE и DELETE можно добавить предварительный SELECT строки, потому что в приложении обычно надо проверить 404 и 403. Тогда бенчмарки будут иметь практический смысл. Можно проверять 3 сценария отдельно - только запись, только чтение, и поровну. Мне кажется, чем больше операций записи, тем ближе производительность будет к обычному подходу, но наверно все равно немного лучше из-за отсутствия установки подключения к БД. Вопрос в том, насколько. Если разница в пределах 10%, то может и не стоит добавлять из-за этого архитектурную сложность.
Не помню, спрашивал ли уже - а на английском этих статей нету? Они заслуживают куда более широкой аудитории, чем полудохлый Хабр.
CRUD на PHP с использованием файберов и пула соединений с PostgreSQL