Пул подключений к Mysql

Я хочу реализовать пул соединений в Php аналогичным образом, который работает в Java.

Зачем мне это нужно:

Давайте рассмотрим поток

Step1: Connection To Db --- Resource Id #12
Step2:  some computation... time taking .3 seconds
Step3: Query on Solr .... timing taking 2 seconds
Step4: Connection To Db --- Resource Id #12 (i am using same resource id)
Step5: Exit

Хотя на шаге 4 я использую тот же ресурс БД, что и на шаге 1. Однако соединение перейдет в состояние сна для step2 и step3 и, следовательно, не может быть использовано любым другим процессом PHP (другими клиентами) до выхода.

Решение:

  1. использовать mysql_close каждый раз после запуска запроса: Недостаток: необходимо подключаться каждый раз и, следовательно, отнимает много времени

  2. Создайте Java-сервис для обработки запросов (возможно, но слишком много времени, и я ищу другое решение, где мне нужно перенести запросы)

  3. Нужно исследовать ретранслятор SQL как сторонние, но я не уверен, что это будет успехом, и не многие хорошие компании использовали его

  4. mysql_pconnect не решает мой случай.

Пожалуйста, предложите

-1

Решение

Одним из способов применения методов масштабируемости к этой модели пула является возможность оперативного изменения распределения пула. Если у вас есть конкретная постоянная ссылка, которая по какой-то причине чрезвычайно популярна, вы можете переместить ведомых из основного пула в пул комментариев, чтобы выручить его. Изолировав нагрузку, вы смогли повысить гибкость. Вы можете добавить подчиненные устройства в любой пул, переместить их между пулами и, в конце концов, установить требуемую производительность на текущем уровне трафика.

Есть еще одно преимущество, которое вы получаете от пула баз данных MySQL, — это гораздо более высокая частота обращений к кешу запросов. MySQL (и большинство систем баз данных) имеют встроенный кеш запросов. Этот кеш содержит результаты последних запросов. Если тот же запрос выполняется повторно, кэшированные результаты могут быть возвращены быстро.

Если у вас есть 20 ведомых баз данных и вы выполняете один и тот же запрос два раза подряд, у вас есть только 1/20 шанса попасть на одного и того же ведомого и получить кешированный результат. Но отправляя определенные классы запросов на меньший набор серверов, вы можете значительно увеличить вероятность попадания в кэш и получить более высокую производительность.

Вам нужно будет обрабатывать пулы баз данных в вашем коде — естественное расширение базового кода балансировки нагрузки в части 1. Давайте посмотрим, как мы могли бы расширить этот код для обработки произвольных пулов баз данных:

<?php
class DB {
// Configuration information:
private static $user = 'testUser';
private static $pass = 'testPass';
private static $config = array(
'write' =>
array('mysql:dbname=MyDB;host=10.1.2.3'),
'primary' =>
array('mysql:dbname=MyDB;host=10.1.2.7',
'mysql:dbname=MyDB;host=10.1.2.8',
'mysql:dbname=MyDB;host=10.1.2.9'),
'batch' =>
array('mysql:dbname=MyDB;host=10.1.2.12'),
'comments' =>
array('mysql:dbname=MyDB;host=10.1.2.27',
'mysql:dbname=MyDB;host=10.1.2.28'),
);

// Static method to return a database connection to a certain pool
public static function getConnection($pool) {
// Make a copy of the server array, to modify as we go:
$servers = self::$config[$pool];
$connection = false;

// Keep trying to make a connection:
while (!$connection && count($servers)) {
$key = array_rand($servers);
try {
$connection = new PDO($servers[$key],
self::$user, self::$pass);
} catch (PDOException $e) {}

if (!$connection) {
// Couldn’t connect to this server, so remove it:
unset($servers[$key]);
}
}

// If we never connected to any database, throw an exception:
if (!$connection) {
throw new Exception("Failed Pool: {$pool}");
}

return $connection;
}
}
// Do something Comment related
$comments = DB::getConnection('comments');
. . .

?>
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector