MySQL Socket在数千次连续连接后拒绝连接

时间:2011-02-05 00:14:40

标签: mysql sockets ubuntu connection database-connection

我目前正在尝试在当前的Ubuntu机器上填充一个带有> 5,000,000个条目的MySQL5.1数据库。 由于程序的体系结构,对于每个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 个答案:

答案 0 :(得分:1)

尝试在/etc/mysql/my.cnf中提高允许的连接数量?

max_connections        = 300

如果php,将mysql_connect()的所有实例更改为mysql_pconnect()?

答案 1 :(得分:0)

由于您似乎非常快速地打开和关闭TCP套接字,您可能正在累积TIME_WAIT状态的套接字(请参阅here),而在Linux上这可能会导致进程耗尽文件描述符(而在Windows上,这可能表现在同一个盒子上的所有进程都无法连接而不仅仅是单个进程,因为没有每个进程套接字限制)。

在运行插入代码的客户端计算机和容纳数据库的服务器上运行netstat

如果要在TIME_WAIT中累积套接字,那么您需要做什么取决于它们的位置(客户端或服务器)。