MySQL Socket отказывается от подключения после тысяч последовательных подключений - PullRequest
3 голосов
/ 05 февраля 2011

В настоящее время я пытаюсь заполнить базу данных MySQL5.1 на текущей машине с Ubuntu> 5 000 000 записей. Из-за архитектуры программы для каждого оператора INSERT открывается и закрывается новое соединение с базой данных. Я знаю, что это дорогостоящая операция, но для ее изменения потребуется изменить лут-код, поэтому я бы предпочел этого избежать.

Проблема Я сталкиваюсь с тем, что через некоторое время (обычно около 12 секунд, но это число увеличивается после некоторых повторных попыток) этот процесс не может подключиться к базе данных Больше. Другие процессы могут без проблем подключаться к базе данных.

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

Вопрос : Существует ли ограничение на количество последовательных подключений к сокету, которые могут быть открыты в данный период времени?

Вот упрощенный Perl-скрипт (на самом деле программа на Java), которая приводит к той же проблеме (переменные базы данных не включены):

# ...
my $i = 0;
my $DBH = 0;
for ($i = 0;$i < $MAX; ++$i) {
  $DBH = DBI->connect("DBI:mysql:$DBNAME:$DBHOST:$DBPORT", $DBUSER, $DBPW)
    or die ("Error - Connection to database failed: \n   $i times ok\n".DBI->errstr);

  $DBH -> disconnect;
  if ($i % 10000 == 0) {
    print $i. " ";
  }
}

Вопрос : Есть предложения / идеи?

Ответы [ 2 ]

1 голос
/ 08 февраля 2011

попробуйте увеличить число разрешенных соединений в /etc/mysql/my.cnf?

max_connections        = 300

, если php, заменить все экземпляры mysql_connect () на mysql_pconnect ()?

0 голосов
/ 08 февраля 2011

Поскольку кажется, что вы очень быстро открываете и закрываете сокеты TCP, возможно, вы накапливаете сокеты в состоянии TIME_WAIT (см. здесь ), а в Linux это может привести к тому, что процесс завершится из файловых дескрипторов.(в то время как в Windows это, скорее всего, проявится во всех процессах на одном и том же блоке, которые не могут подключиться, а не только в одном процессе, поскольку для каждого процесса нет ограничений на сокеты).

Запустите netstat как на клиентском компьютере, на котором выполняется код вставки, так и на сервере, на котором размещена БД.

Если вы накапливаете сокеты в TIME_WAIT, то что вам нужно сделать, зависит от того, что вам нужно сделатьгде они (клиент или сервер).

...