2010-11-21 9 views
2

Wenn ich 10 Abfragen habe, und jede Abfrage aktualisiert eine bestimmte Tabelle (d. H. 10 verschiedene Tabellen).Kann MySQL gleichzeitige Abfragen pro Verbindung unterstützen?

Kann ich eine mySQL-Verbindung öffnen, 10 Threads spawnen, behandelt jeder Thread eine Abfrage so, dass sie gleichzeitig ausgeführt werden können, statt nacheinander auszuführen.

Danke!

Antwort

5

Nein kann man nicht:

MySQL-Client-Bibliothek (mindestens native C ein) ist nicht Thread-sicher gleiche Verbindung von verschiedenen Threads zu verwenden. Sie müssen eine Verbindung pro Thread verwenden.

+0

Was passiert, wenn Sie mehrere asynchronen Abfragen aus dem gleichen Thread starten? –

0

Aufgrund der Funktionsweise des MySQL-Protokolls werden diese einzeln an den Server gesendet, wenn nur eine Verbindung offen ist.

1

Wenn Sie nur parallel laufende Aktualisierungs-/Einfügeabfragen benötigen (asynchron in Bezug auf die MySQL-API), können Sie die Abfragen INSERT DELAYED und UPDATE LOW_PRIORITY verwenden.

0

Es existiert keine Datei „log.conn.txt“ erstellt, so gibt es keinen Konflikt zwischen gleichzeitigen Anfragen an die einzelnen MySQL-Client-Verbindung:

<? 
declare(ticks=1); 
pcntl_signal(SIGUSR1, create_function('$signo', 'sleep(1);while (($pid=pcntl_wait(@$status, WNOHANG))>0) {}'));//protect against zombie children 
$pdo=new PDO('mysql:host=192.168.0.2;port=3306;dbname=baseinfo', 'dev', 'dev', 
      array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, 
        PDO::MYSQL_ATTR_INIT_COMMAND=>'set names utf8' 
       ) 
      ); 
for ($i=0; $i<20; ++$i) 
    {if (($pid=pcntl_fork())===-1) 
     {//... 
     continue; 
     } 
    else if ($pid) 
      {$pids[]=$pid; 
      pcntl_wait($status, WNOHANG); //protect against zombie children, one wait vs one child 
      } 
    else if ($pid===0) 
      {ob_start();//prevent output to main process 
      register_shutdown_function(create_function('$pars', 'ob_end_clean();posix_kill(posix_getppid(), SIGUSR1);posix_kill(getmypid(), SIGKILL);'), array());//to kill self before exit();, or else the resource shared with parent will be closed 
      for ($j=0; $j<200; ++$j) 
       {try 
        {file_put_contents('log.'.$i.'.txt', $pdo->query('select partner_login from base_account where id=100')->fetch(PDO::FETCH_COLUMN, 0)."\t".time().substr(microtime(),2,6)."\n", FILE_APPEND); 
        } 
       catch (Exception $e) 
         {if ($pdo->getAttribute(PDO::ATTR_SERVER_INFO)==='MySQL server has gone away') 
          {file_put_contents('log.conn.txt', time().substr(microtime(),2,6).":{$i}:{$j} lost\n", FILE_APPEND); 
          $pdo=&new PDO('mysql:host=192.168.0.2;port=3306;dbname=baseinfo', 'dev', 'dev', 
             array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, 
               PDO::MYSQL_ATTR_INIT_COMMAND=>'set names utf8' 
              ) 
             ); 
          } 
         } 
       usleep(50000); 
       } 
      exit();//avoid foreach loop in child process 
      } 
    } 
//wait all child to end, avoid close db connection before all children self killed 
foreach ($pids as $p) 
     {pcntl_waitpid($p, $status); 
     } 
?> 
+0

Schade, manchmal 2 oder 3 untergeordnete Prozesse blockiert bei der Kommunikation mit MySQL Client, und diese untergeordneten Prozesse nie enden, "PDO :: ATTR_TIMEOUT" wird das Problem nicht beheben – diyism

Verwandte Themen