1

我的应用程序正在使用 ADODB 同时连接到 2 个 MySQL 数据库。应用程序正在下载大文件;这需要很多时间,所以会发生“mysql has gone away”错误。

我知道 MySQL 允许使用可以使用 mysql_options() 启用的自动重新连接,但我不知道如何将此功能应用于 ADODB 适配器。

    $DB = NewADOConnection('mysql');
    $DB->Connect(DB_HOST, DB_LOGIN, DB_PASSWORD, DB_DBNAME);

谢谢你的时间!

PS:可能我应该问如何从 $DB 获取 DB 处理程序变量?如果我可以从 ADODO 获取数据库连接处理程序作为 $handler 我可以使用 mysql_options($handler, MYSQL_OPT_RECONNECT, 1); 但是如果我应该在连接之前调用 mysql_options() 我怎么能得到 $handler (根据 MySQL 参考http://dev.mysql.com/doc/refman/5.0/en/mysql-options.html

4

1 回答 1

0

要设置 mysql 选项,可以使用 dsn。这是我一直使用的连接模板:

$options = '';
if ($driver == 'mysql' OR $driver == 'mysqli')
{
  if ($params['pconnect'] === TRUE)
  {
    $options .= '?persist';
  }
  $flags = MYSQL_CLIENT_COMPRESS;
  $options .= (empty($options)?'?':'&')."clientflags=$flags";
}

$dsn = "{$driver}://{$username}:{$password}@{$hostname}/{$database}{$options}";

if ($driver == 'sqlite')
{
  if ($params['pconnect'] === TRUE)
  {
    $options = '?persist';
  }
  $database = urlencode($database);
  $dsn = "{$driver}://{$database}{$options}";
}

$adodb =& ADONewConnection($dsn);

if ($adodb)
{
  //set fetch mode
  $adodb->SetFetchMode(ADODB_FETCH_BOTH);

  //character set
  if ($driver == 'mysql' OR $driver == 'mysqli')
  {
    if (isset($params['char_set']) AND $params['char_set']
        AND isset($params['dbcollat']) AND $params['dbcollat'])
    {
      $charset    = $adodb->qstr($params['char_set']);
      $collation  = $adodb->qstr($params['dbcollat']);
      $adodb->Execute("SET NAMES $charset COLLATE $collation");
    }
  }
  if ($debug)
  {
    @ob_start();
    $adodb->debug = TRUE;
  }
}

sqlite如果您只将其用于 MySQL,则可以省略驱动程序条件块。显然,PHP MySQL 客户端只支持有限的选项,这里是列表。你可以试试 MySQLi,它有更多的选择

您是否尝试过持久连接?

于 2010-01-31T04:43:05.140 回答