हालांकि मुझे अभी भी संदेह है कि लेन-देन और/या बैच इंसर्ट आपकी संसाधन उपयोग समस्या का एक व्यवहार्य समाधान है, फिर भी वे डेव द्वारा सुझाए गए बड़े बयानों को तैयार करने की तुलना में एक बेहतर समाधान हैं।
इन्हें आज़माएं और देखें कि क्या ये मदद करते हैं।
निम्नलिखित मानता है कि पीडीओ का त्रुटि प्रबंधन मोड अपवादों को फेंकने के लिए सेट है। उदाहरण:$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
यदि, किसी कारण से, आप अपवाद मोड का उपयोग नहीं कर सकते हैं, तो आपको execute()
की वापसी की जांच करनी होगी हर बार और अपना अपवाद फेंकें।
एकल लेन-देन:
$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
}
बैच लेनदेन:
$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();
}