diff --git a/src/Illuminate/Database/Connection.php b/src/Illuminate/Database/Connection.php index 584dd9957dde..723b586ec251 100755 --- a/src/Illuminate/Database/Connection.php +++ b/src/Illuminate/Database/Connection.php @@ -624,6 +624,18 @@ public function unprepared($query) }); } + /** + * Get the number of open connections for the database. + * + * @return int|null + */ + public function threadCount() + { + $query = $this->getQueryGrammar()->compileThreadCount(); + + return $query ? $this->scalar($query) : null; + } + /** * Execute the given callback in "dry run" mode. * @@ -1347,6 +1359,16 @@ public function getDriverName() return $this->getConfig('driver'); } + /** + * Get a human-readable name for the given connection driver. + * + * @return string + */ + public function getDriverTitle() + { + return $this->getDriverName(); + } + /** * Get the query grammar used by the connection. * diff --git a/src/Illuminate/Database/Console/DatabaseInspectionCommand.php b/src/Illuminate/Database/Console/DatabaseInspectionCommand.php index f5ba9036e6ef..621a2f3a4387 100644 --- a/src/Illuminate/Database/Console/DatabaseInspectionCommand.php +++ b/src/Illuminate/Database/Console/DatabaseInspectionCommand.php @@ -3,12 +3,8 @@ namespace Illuminate\Database\Console; use Illuminate\Console\Command; +use Illuminate\Database\Connection; use Illuminate\Database\ConnectionInterface; -use Illuminate\Database\MariaDbConnection; -use Illuminate\Database\MySqlConnection; -use Illuminate\Database\PostgresConnection; -use Illuminate\Database\SQLiteConnection; -use Illuminate\Database\SqlServerConnection; use Illuminate\Support\Arr; abstract class DatabaseInspectionCommand extends Command @@ -19,18 +15,12 @@ abstract class DatabaseInspectionCommand extends Command * @param \Illuminate\Database\ConnectionInterface $connection * @param string $database * @return string + * + * @deprecated */ protected function getConnectionName(ConnectionInterface $connection, $database) { - return match (true) { - $connection instanceof MySqlConnection && $connection->isMaria() => 'MariaDB', - $connection instanceof MySqlConnection => 'MySQL', - $connection instanceof MariaDbConnection => 'MariaDB', - $connection instanceof PostgresConnection => 'PostgreSQL', - $connection instanceof SQLiteConnection => 'SQLite', - $connection instanceof SqlServerConnection => 'SQL Server', - default => $database, - }; + return $connection->getDriverTitle(); } /** @@ -38,21 +28,12 @@ protected function getConnectionName(ConnectionInterface $connection, $database) * * @param \Illuminate\Database\ConnectionInterface $connection * @return int|null + * + * @deprecated */ protected function getConnectionCount(ConnectionInterface $connection) { - $result = match (true) { - $connection instanceof MySqlConnection => $connection->selectOne('show status where variable_name = "threads_connected"'), - $connection instanceof PostgresConnection => $connection->selectOne('select count(*) as "Value" from pg_stat_activity'), - $connection instanceof SqlServerConnection => $connection->selectOne('select count(*) Value from sys.dm_exec_sessions where status = ?', ['running']), - default => null, - }; - - if (! $result) { - return null; - } - - return Arr::wrap((array) $result)['Value']; + return $connection->threadCount(); } /** diff --git a/src/Illuminate/Database/Console/MonitorCommand.php b/src/Illuminate/Database/Console/MonitorCommand.php index d87a441c015c..7975b82dee93 100644 --- a/src/Illuminate/Database/Console/MonitorCommand.php +++ b/src/Illuminate/Database/Console/MonitorCommand.php @@ -85,9 +85,11 @@ protected function parseDatabases($databases) $maxConnections = $this->option('max'); + $connections = $this->connection->connection($database)->threadCount(); + return [ 'database' => $database, - 'connections' => $connections = $this->getConnectionCount($this->connection->connection($database)), + 'connections' => $connections, 'status' => $maxConnections && $connections >= $maxConnections ? 'ALERT' : 'OK', ]; }); diff --git a/src/Illuminate/Database/Console/ShowCommand.php b/src/Illuminate/Database/Console/ShowCommand.php index 1d4aff3398b5..4431c363fe6c 100644 --- a/src/Illuminate/Database/Console/ShowCommand.php +++ b/src/Illuminate/Database/Console/ShowCommand.php @@ -45,9 +45,10 @@ public function handle(ConnectionResolverInterface $connections) $data = [ 'platform' => [ 'config' => $this->getConfigFromDatabase($database), - 'name' => $this->getConnectionName($connection, $database), + 'name' => $connection->getDriverTitle(), + 'connection' => $connection->getName(), 'version' => $connection->getServerVersion(), - 'open_connections' => $this->getConnectionCount($connection), + 'open_connections' => $connection->threadCount(), ], 'tables' => $this->tables($connection, $schema), ]; @@ -159,6 +160,7 @@ protected function displayForCli(array $data) $this->newLine(); $this->components->twoColumnDetail(''.$platform['name'].'', $platform['version']); + $this->components->twoColumnDetail('Connection', Arr::get($platform['config'], 'connection')); $this->components->twoColumnDetail('Database', Arr::get($platform['config'], 'database')); $this->components->twoColumnDetail('Host', Arr::get($platform['config'], 'host')); $this->components->twoColumnDetail('Port', Arr::get($platform['config'], 'port')); diff --git a/src/Illuminate/Database/MariaDbConnection.php b/src/Illuminate/Database/MariaDbConnection.php index 721641b66c1c..ebd33a15b9b5 100755 --- a/src/Illuminate/Database/MariaDbConnection.php +++ b/src/Illuminate/Database/MariaDbConnection.php @@ -12,6 +12,14 @@ class MariaDbConnection extends MySqlConnection { + /** + * {@inheritdoc} + */ + public function getDriverTitle() + { + return 'MariaDB'; + } + /** * Determine if the connected database is a MariaDB database. * diff --git a/src/Illuminate/Database/MySqlConnection.php b/src/Illuminate/Database/MySqlConnection.php index 147551338fd7..66a668cd19db 100755 --- a/src/Illuminate/Database/MySqlConnection.php +++ b/src/Illuminate/Database/MySqlConnection.php @@ -14,6 +14,14 @@ class MySqlConnection extends Connection { + /** + * {@inheritdoc} + */ + public function getDriverTitle() + { + return $this->isMaria() ? 'MariaDB' : 'MySQL'; + } + /** * Escape a binary value for safe SQL embedding. * diff --git a/src/Illuminate/Database/PostgresConnection.php b/src/Illuminate/Database/PostgresConnection.php index 8f1d098907c2..06fa2e1d8e48 100755 --- a/src/Illuminate/Database/PostgresConnection.php +++ b/src/Illuminate/Database/PostgresConnection.php @@ -12,6 +12,14 @@ class PostgresConnection extends Connection { + /** + * {@inheritdoc} + */ + public function getDriverTitle() + { + return 'PostgreSQL'; + } + /** * Escape a binary value for safe SQL embedding. * diff --git a/src/Illuminate/Database/Query/Grammars/Grammar.php b/src/Illuminate/Database/Query/Grammars/Grammar.php index 63e624bcaf17..3478de3b2509 100755 --- a/src/Illuminate/Database/Query/Grammars/Grammar.php +++ b/src/Illuminate/Database/Query/Grammars/Grammar.php @@ -1429,6 +1429,16 @@ protected function compileLock(Builder $query, $value) return is_string($value) ? $value : ''; } + /** + * Compile a query to get the number of open connections for a database. + * + * @return string|null + */ + public function compileThreadCount() + { + return null; + } + /** * Determine if the grammar supports savepoints. * diff --git a/src/Illuminate/Database/Query/Grammars/MariaDbGrammar.php b/src/Illuminate/Database/Query/Grammars/MariaDbGrammar.php index ca17399fe0dd..da51125b9774 100755 --- a/src/Illuminate/Database/Query/Grammars/MariaDbGrammar.php +++ b/src/Illuminate/Database/Query/Grammars/MariaDbGrammar.php @@ -33,6 +33,16 @@ public function compileJsonValueCast($value) return "json_query({$value}, '$')"; } + /** + * Compile a query to get the number of open connections for a database. + * + * @return string + */ + public function compileThreadCount() + { + return 'select variable_value as `Value` from information_schema.global_status where variable_name = \'THREADS_CONNECTED\''; + } + /** * Determine whether to use a legacy group limit clause for MySQL < 8.0. * diff --git a/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php b/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php index 397dbe54e24b..f2823fd8e8d8 100755 --- a/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php +++ b/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php @@ -478,6 +478,16 @@ protected function compileDeleteWithoutJoins(Builder $query, $table, $where) return $sql; } + /** + * Compile a query to get the number of open connections for a database. + * + * @return string + */ + public function compileThreadCount() + { + return 'select variable_value as `Value` from performance_schema.session_status where variable_name = \'threads_connected\''; + } + /** * Wrap a single string in keyword identifiers. * diff --git a/src/Illuminate/Database/Query/Grammars/PostgresGrammar.php b/src/Illuminate/Database/Query/Grammars/PostgresGrammar.php index bbb11284e72b..232c824d1b1f 100755 --- a/src/Illuminate/Database/Query/Grammars/PostgresGrammar.php +++ b/src/Illuminate/Database/Query/Grammars/PostgresGrammar.php @@ -649,6 +649,16 @@ public function compileTruncate(Builder $query) return ['truncate '.$this->wrapTable($query->from).' restart identity cascade' => []]; } + /** + * Compile a query to get the number of open connections for a database. + * + * @return string + */ + public function compileThreadCount() + { + return 'select count(*) as "Value" from pg_stat_activity'; + } + /** * Wrap the given JSON selector. * diff --git a/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php b/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php index c084308b74ba..9d42682a5384 100755 --- a/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php +++ b/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php @@ -497,6 +497,16 @@ public function compileSavepointRollBack($name) return 'ROLLBACK TRANSACTION '.$name; } + /** + * Compile a query to get the number of open connections for a database. + * + * @return string + */ + public function compileThreadCount() + { + return 'select count(*) Value from sys.dm_exec_sessions where status = N\'running\''; + } + /** * Get the format for database stored dates. * diff --git a/src/Illuminate/Database/SQLiteConnection.php b/src/Illuminate/Database/SQLiteConnection.php index ce9286fa2911..bccd33118118 100755 --- a/src/Illuminate/Database/SQLiteConnection.php +++ b/src/Illuminate/Database/SQLiteConnection.php @@ -31,6 +31,14 @@ public function __construct($pdo, $database = '', $tablePrefix = '', array $conf $this->configureSynchronous(); } + /** + * {@inheritdoc} + */ + public function getDriverTitle() + { + return 'SQLite'; + } + /** * Enable or disable foreign key constraints if configured. * diff --git a/src/Illuminate/Database/SqlServerConnection.php b/src/Illuminate/Database/SqlServerConnection.php index a0644bf5c75a..19f7bb8afbf3 100755 --- a/src/Illuminate/Database/SqlServerConnection.php +++ b/src/Illuminate/Database/SqlServerConnection.php @@ -14,6 +14,14 @@ class SqlServerConnection extends Connection { + /** + * {@inheritdoc} + */ + public function getDriverTitle() + { + return 'SQL Server'; + } + /** * Execute a Closure within a transaction. * diff --git a/tests/Integration/Database/ConnectionThreadsCountTest.php b/tests/Integration/Database/ConnectionThreadsCountTest.php new file mode 100644 index 000000000000..abf53c91df92 --- /dev/null +++ b/tests/Integration/Database/ConnectionThreadsCountTest.php @@ -0,0 +1,19 @@ +threadCount(); + + if ($this->driver === 'sqlite') { + $this->assertNull($count, 'SQLite does not support connection count'); + } else { + $this->assertGreaterThanOrEqual(1, $count); + } + } +}