Get the Pooled connection class set up.

This commit is contained in:
Dave Smith-Hayes 2024-09-23 19:53:27 -04:00
parent 4a66af0f2b
commit 07b73e7f7f
3 changed files with 53 additions and 0 deletions

View File

@ -2,6 +2,7 @@
namespace Slovocast\Infrastructure\Database; namespace Slovocast\Infrastructure\Database;
use React\Mysql\MysqlClient;
use Slovocast\Infrastructure\Api\Database\ConnectionPoolInterface; use Slovocast\Infrastructure\Api\Database\ConnectionPoolInterface;
use Slovocast\Infrastructure\Api\Database\PooledConnectionInterface; use Slovocast\Infrastructure\Api\Database\PooledConnectionInterface;
@ -13,6 +14,15 @@ class ConnectionPool implements ConnectionPoolInterface
const int DEFAULT_WAIT_TIMEOUT = 100; const int DEFAULT_WAIT_TIMEOUT = 100;
private array $idleConnections; private array $idleConnections;
private array $activeConnections; private array $activeConnections;
private ConnectionPoolConfig $config;
public function __construct(ConnectionPoolConfig $config)
{
$this->config = $config;
for ($i = 0; $i < $config->getTotalConnections(); $i++) {
$this->idleConnections[] = new MysqlClient($this->config->getDsn());
}
}
public function getTotalIdleConnections(): int public function getTotalIdleConnections(): int
{ {

View File

@ -2,14 +2,18 @@
namespace Slovocast\Infrastructure\Database; namespace Slovocast\Infrastructure\Database;
use React\Mysql\MysqlClient;
class ConnectionPoolConfig class ConnectionPoolConfig
{ {
public function __construct( public function __construct(
public readonly string $username, public readonly string $username,
public readonly string $password, public readonly string $password,
public readonly string $database, public readonly string $database,
public readonly string $host,
protected int $port = 3306, protected int $port = 3306,
protected int $poolWaitTimeout = ConnectionPool::DEFAULT_WAIT_TIMEOUT, protected int $poolWaitTimeout = ConnectionPool::DEFAULT_WAIT_TIMEOUT,
protected int $totalConnections = 10,
) { } ) { }
public function getPort(): int public function getPort(): int
@ -21,4 +25,20 @@ class ConnectionPoolConfig
{ {
return $this->poolWaitTimeout; return $this->poolWaitTimeout;
} }
public function getTotalConnections(): int
{
return $this->totalConnections;
}
public function getDsn(): string
{
return sprintf(
"%s:%s@%s/%s",
rawurlencode($this->username),
rawurlencode($this->password),
$this->host,
$this->database
);
}
} }

View File

@ -0,0 +1,23 @@
<?php
namespace Slovocast\Infrastructure\Database;
use React\Mysql\MysqlClient;
use Slovocast\Infrastructure\Api\Database\ConnectionPoolInterface;
use Slovocast\Infrastructure\Api\Database\PooledConnectionInterface;
class PooledConnection extends MysqlClient implements PooledConnectionInterface
{
protected ConnectionPoolInterface $connectionPool;
public function setConnectionPool(ConnectionPoolInterface $connectionPool): self
{
$this->connectionPool = $connectionPool;
return $this;
}
public function release(): void
{
$this->connectionPool->releaseConnection($this);
}
}