container->has(EventDispatcherInterface::class)) { $this->dispatcher = $this->container->get(EventDispatcherInterface::class); } if ($this->container->has(StdoutLoggerInterface::class)) { $this->logger = $this->container->get(StdoutLoggerInterface::class); } } public function release(): void { try { $this->lastReleaseTime = microtime(true); $events = $this->pool->getOption()->getEvents(); if (in_array(ReleaseConnection::class, $events, true)) { $this->dispatcher?->dispatch(new ReleaseConnection($this)); } } catch (Throwable $exception) { $this->logger?->error((string) $exception); } finally { $this->pool->release($this); } } public function getConnection() { try { return $this->getActiveConnection(); } catch (Throwable $exception) { $this->logger?->warning('Get connection failed, try again. ' . $exception); return $this->getActiveConnection(); } } public function check(): bool { $maxIdleTime = $this->pool->getOption()->getMaxIdleTime(); $now = microtime(true); if ($now > $maxIdleTime + $this->lastUseTime) { return false; } $this->lastUseTime = $now; return true; } public function getLastUseTime(): float { return $this->lastUseTime; } public function getLastReleaseTime(): float { return $this->lastReleaseTime; } abstract public function getActiveConnection(); }