Skip to content

Commit fe2220a

Browse files
committed
take into account call to db
1 parent eadaa66 commit fe2220a

File tree

5 files changed

+62
-25
lines changed

5 files changed

+62
-25
lines changed

DependencyInjection/Configuration.php

+1-2
Original file line numberDiff line numberDiff line change
@@ -221,10 +221,9 @@ private function getDbalConnectionsNode(): ArrayNodeDefinition
221221
->end()
222222
->booleanNode('disable_type_comments')->end()
223223
->scalarNode('server_version')->end()
224-
->integerNode('check_connection_timing')->end()
224+
->integerNode('check_connection_timing')->defaultValue(30)->end()
225225
->scalarNode('driver_class')->end()
226226
->scalarNode('wrapper_class')->end()
227-
->scalarNode('check_connection_frequency')->defaultValue(30)->end()
228227
->booleanNode('keep_slave')
229228
->setDeprecated(
230229
'doctrine/doctrine-bundle',

DependencyInjection/DoctrineExtension.php

+16-21
Original file line numberDiff line numberDiff line change
@@ -174,12 +174,6 @@ protected function dbalLoad(array $config, ContainerBuilder $container)
174174
$config['default_connection'] = reset($keys);
175175
}
176176

177-
if (! $container->hasParameter('kernel.runtime_mode') && ! $container->hasParameter('kernel.runtime_mode.worker')) {
178-
$container->removeDefinition('doctrine.listeners.doctrine_connection_listener');
179-
} else {
180-
$container->getDefinition('doctrine.orm.listeners.doctrine_connection_listener')->setArgument(1, $config['check_connection_timing']);
181-
}
182-
183177
$this->defaultConnection = $config['default_connection'];
184178

185179
$container->setAlias('database_connection', sprintf('doctrine.dbal.%s_connection', $this->defaultConnection));
@@ -202,13 +196,8 @@ protected function dbalLoad(array $config, ContainerBuilder $container)
202196
$connWithLogging = [];
203197
$connWithProfiling = [];
204198
$connWithBacktrace = [];
205-
$timingByConnection = [];
206-
$skipTiming = false;
207-
208-
if (! $container->hasParameter('kernel.runtime_mode') && ! $container->hasParameter('kernel.runtime_mode.worker')) {
209-
$container->removeDefinition('doctrine.listeners.doctrine_connection_listener');
210-
$skipTiming = true;
211-
}
199+
$timeToLiveByConnection = [];
200+
$connWithTimingCheck = [];
212201

213202
foreach ($config['connections'] as $name => $connection) {
214203
if ($connection['logging']) {
@@ -223,15 +212,13 @@ protected function dbalLoad(array $config, ContainerBuilder $container)
223212
}
224213
}
225214

226-
if (! $skipTiming) {
227-
$timingByConnection[] = ['name' => $connections[$name], 'timing' => $connection['check_connection_timing']];
215+
if ($connection['check_connection_timing']) {
216+
$connWithTimingCheck[] = $name;
228217
}
229218

230-
$this->loadDbalConnection($name, $connection, $container);
231-
}
219+
$timeToLiveByConnection[$name] = $connection['check_connection_timing'];
232220

233-
if (! $skipTiming) {
234-
$container->getDefinition('doctrine.orm.listeners.doctrine_connection_listener')->setArgument(1, $timingByConnection);
221+
$this->loadDbalConnection($name, $connection, $container);
235222
}
236223

237224
$container->registerForAutoconfiguration(MiddlewareInterface::class)->addTag('doctrine.middleware');
@@ -250,7 +237,8 @@ protected function dbalLoad(array $config, ContainerBuilder $container)
250237
}
251238
});
252239

253-
$this->registerDbalMiddlewares($container, $connWithLogging, $connWithProfiling, $connWithBacktrace);
240+
$this->registerDbalMiddlewares($container, $connWithLogging, $connWithProfiling, $connWithBacktrace, $connWithTimingCheck);
241+
$container->getDefinition('doctrine.connection.keep.alive_middleware')->setArgument(1, $timeToLiveByConnection);
254242
}
255243

256244
/**
@@ -1201,7 +1189,8 @@ private function registerDbalMiddlewares(
12011189
ContainerBuilder $container,
12021190
array $connWithLogging,
12031191
array $connWithProfiling,
1204-
array $connWithBacktrace
1192+
array $connWithBacktrace,
1193+
array $connWithTimingCheck
12051194
): void {
12061195
$loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
12071196
$loader->load('middlewares.xml');
@@ -1217,5 +1206,11 @@ private function registerDbalMiddlewares(
12171206
$debugMiddlewareAbstractDef
12181207
->addTag('doctrine.middleware', ['connection' => $connName]);
12191208
}
1209+
1210+
$checkTimingMiddlewareAbstractDef = $container->getDefinition('doctrine.connection.keep.alive_middleware');
1211+
foreach ($connWithTimingCheck as $connName) {
1212+
$checkTimingMiddlewareAbstractDef
1213+
->addTag('doctrine.middleware', ['connection' => $connName, 'priority' => 10]);
1214+
}
12201215
}
12211216
}

Middleware/ConnectionKeepAlive.php

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
namespace Doctrine\Bundle\DoctrineBundle\Middleware;
4+
5+
use Doctrine\DBAL\Driver;
6+
use Doctrine\DBAL\Driver\Middleware;
7+
use Symfony\Bridge\Doctrine\ConnectionTimingWeakMap;
8+
use Symfony\Bridge\Doctrine\Middleware\ConnectionKeepAliveDriver;
9+
10+
class ConnectionKeepAlive implements Middleware, ConnectionNameAwareInterface
11+
{
12+
private \ArrayObject $connectionExpiries;
13+
private string $connectionName;
14+
private array $timeToLiveByConnection;
15+
16+
/**
17+
* @param array<string, int> $timeToLiveByConnection
18+
*/
19+
public function __construct(
20+
\ArrayObject $connectionExpiries,
21+
array $timeToLiveByConnection,
22+
string $connectionName = 'default'
23+
) {
24+
$this->timeToLiveByConnection = $timeToLiveByConnection;
25+
$this->connectionName = $connectionName;
26+
$this->connectionExpiries = $connectionExpiries;
27+
}
28+
29+
public function setConnectionName(string $name): void
30+
{
31+
$this->connectionName = $name;
32+
}
33+
34+
public function wrap(Driver $driver): Driver
35+
{
36+
return new ConnectionKeepAliveDriver($driver, $this->connectionExpiries, $this->timeToLiveByConnection, $this->connectionName);
37+
}
38+
}

Resources/config/dbal.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,9 @@
101101
<tag name="controller.service_arguments" />
102102
</service>
103103

104-
<service id="doctrine.listeners.doctrine_connection_listener" class="Symfony\Bridge\Doctrine\Listener\ConnectionListener">
104+
<service id="doctrine.listeners.doctrine_connection_listener" class="Symfony\Bridge\Doctrine\DoctrineConnectionListener">
105+
<argument type="service" id="connection.timing" />
105106
<argument type="service" id="service_container" />
106-
<argument /> <!-- check timing -->
107107
<tag name="kernel.event_subscriber" />
108108
</service>
109109

Resources/config/middlewares.xml

+5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
66

77
<services>
8+
<service id="connection.timing" class="Symfony\Bridge\Doctrine\ConnectionTiming"/>
89
<service id="doctrine.dbal.logging_middleware" class="Doctrine\DBAL\Logging\Middleware" abstract="true">
910
<argument type="service" id="logger" />
1011
<tag name="monolog.logger" channel="doctrine" />
@@ -17,5 +18,9 @@
1718
<argument type="service" id="doctrine.debug_data_holder" />
1819
<argument type="service" id="debug.stopwatch" on-invalid="null" />
1920
</service>
21+
<service id="doctrine.connection.keep.alive_middleware" class="Doctrine\Bundle\DoctrineBundle\Middleware\ConnectionKeepAlive" abstract="true">
22+
<argument type="service" id="connection.timing" />
23+
<argument /> <!-- check timing -->
24+
</service>
2025
</services>
2126
</container>

0 commit comments

Comments
 (0)