sql >> Databasteknik >  >> RDS >> Mysql

PDO - Infoga stor array till MySQL-databas

Även om jag fortfarande tvivlar på att transaktioner och/eller batchbilagor är en hållbar lösning på ditt resursanvändningsproblem, är de fortfarande en bättre lösning än att förbereda massiva uttalanden som Dave har föreslagit.

Ge dessa ett försök och se om de hjälper.

Följande antar att PDO:s felhanteringsläge är inställt på att ge undantag. T.ex.:$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); Om du av någon anledning inte kan använda undantagsläget måste du kontrollera returen av execute() varje gång och kasta ditt eget undantag.

Enskild transaktion:

$sql = $db->prepare("INSERT INTO players (name, level, vocation, world, month, today, online) VALUES (:name, :level, :vocation, :world, :time, :time, :online) ON DUPLICATE KEY UPDATE level = :level, vocation = :vocation, world = :world, month = month + :time, today = today + :time, online = :online");

$db->beginTransaction();
try {
    foreach ($players as $player) {
        $sql->execute([
            ":name" => $player->name,
            ":level" => $player->level,
            ":vocation" => $player->vocation,
            ":world" => $player->world,
            ":time" => $player->time,
            ":online" => $player->online
        ]);
    }
    $db->commit();
} catch( PDOException $e ) {
    $db->rollBack();
    // at this point you would want to implement some sort of error handling
    // or potentially re-throw the exception to be handled at a higher layer
}

Batchtransaktioner:

$batch_size = 1000;
for( $i=0,$c=count($players); $i<$c; $i+=$batch_size ) {
    $db->beginTransaction();
    try {
        for( $k=$i; $k<$c && $k<$i+$batch_size; $k++ ) {
            $player = $players[$k];
            $sql->execute([
                ":name" => $player->name,
                ":level" => $player->level,
                ":vocation" => $player->vocation,
                ":world" => $player->world,
                ":time" => $player->time,
                ":online" => $player->online
            ]);
        }
    } catch( PDOException $e ) {
        $db->rollBack();
        // at this point you would want to implement some sort of error handling
        // or potentially re-throw the exception to be handled at a higher layer
        break;
    }
    $db->commit();
}


  1. SqlDateTime.MinValue !=DateTime.MinValue, varför?

  2. Autentisering med gammalt lösenord stöds inte längre, använd 4.1-lösenord

  3. Infoga och uppdatera CSV-fildata i MySQL-tabellen med PHP

  4. MySQL- Varför fungerar inte LAST_INSERT_ID() för mig?