Я использую insert_batch()
для массового ввода 10000+ строк в таблицу в базе данных. Я делаю некоторые тесты, и я заметил, что иногда все 10.000+ строк вставлены правильно, но в некоторых случаях я пропускаю более 100 строк в общем подсчете моей таблицы.
Полевые данные в записях, которые у меня есть, в порядке, поскольку я использую одни и те же данные для каждого из моих тестов, и большую часть времени у меня нет проблем. Например, я попытался 20 раз вставить те же данные в мою базу данных, и в 19 раз все строки будут вставлены правильно, но в это время я пропущу 100 или, возможно, больше строк.
Функция для insert_batch()
следует:
protected function save_sms_to_database() { //insert_Batch $datestring = "%Y-%m-%d %h:%m:%s"; $time = time(); $datetime = mdate($datestring, $time); $this->date_sent = $datetime; foreach ($this->destinations as $k => $v) { $sms_data[$k] = array( 'campaign_id' => $this->campaign_id, 'sender_id' => $this->from, 'destination' => $v, 'token' => md5(time() . 'smstoken' . rand(1, 99999999999)), 'message' => $this->body, 'unicode' => $this->unicode, 'long' => $this->longsms, 'credit_cost' => $this->eachMsgCreditCost, 'date_sent' => $this->date_sent, 'deleted' => 0, 'status' => 1, 'scheduled' => $this->scheduled, ); } $this->ci->db->insert_batch('outgoingSMS', $sms_data); if ($this->ci->db->affected_rows() > 0) { // outgoingSMS data were successfully inserted return TRUE; } else { log_message('error', $this->campaign_id.' :: Could not insert sms into database'); log_message('error', $this->ci->db->_error_message()); return FALSE; // sms was not inserted correctly } }
Как мне отладить insert_batch()
для такого случая?
Я внесли некоторые изменения в DB_active_rec.php
чтобы выполнить некоторую регистрацию во время insert_batch, и до сих пор я не могу успешно воспроизвести проблему, чтобы увидеть, что происходит неправильно. Но поскольку проблема возникла вначале 2-3 раза, и я не сделал серьезных изменений в своей логике, чтобы исправить ее, я не могу оставить ее так, как я не доверяю функции insert_batch()
для создания insert_batch()
.
Я также добавляю функцию codeigniter insert_batch ():
public function insert_batch($table = '', $set = NULL) { $countz = 0; if ( ! is_null($set)) { $this->set_insert_batch($set); } if (count($this->ar_set) == 0) { if ($this->db_debug) { //No valid data array. Folds in cases where keys and values did not match up return $this->display_error('db_must_use_set'); } return FALSE; } if ($table == '') { if ( ! isset($this->ar_from[0])) { if ($this->db_debug) { return $this->display_error('db_must_set_table'); } return FALSE; } $table = $this->ar_from[0]; } // Batch this baby for ($i = 0, $total = count($this->ar_set); $i < $total; $i = $i + 100) { $sql = $this->_insert_batch($this->_protect_identifiers($table, TRUE, NULL, FALSE), $this->ar_keys, array_slice($this->ar_set, $i, 100)); //echo $sql; $this->query($sql); $countz = $countz + $this->affected_rows(); } $this->_reset_write(); log_message('info', "Total inserts from batch:".$countz); return TRUE; }
Последний log_message()
с полными вставками из пакета также показывает проблему, поскольку, когда у меня меньше вложений, чем ожидалось, я получаю также не ожидаемое количество вставок.
Мне нужно подумать о другом, чтобы вставить тысячи строк в мою базу данных без ввода кода.
кто-нибудь знает какие-то проблемы? Может быть, это связано с жестким диском или памятью системы во время отсутствия производительности? Это старый компьютер с 1 ГБ оперативной памяти.
EDIT: В соответствии с требованиями я делаю здесь пример инструкции INSERT с 9 строками, которые создаются с insert_batch()
функции insert_batch()
INSERT INTO `outgoingSMS` (`campaign_id`, `credit_cost`, `date_sent`, `deleted`, `destination`, `long`, `message`, `scheduled`, `sender_id`, `status`, `token`, `unicode`) VALUES ('279',1,'2013-08-02 02:08:34',0,'14141415151515',0,'fd',0,'sotos',1,'4d270f6cc2fb32fb47f81e8e15412a36',0), ('279',1,'2013-08-02 02:08:34',0,'30697000000140',0,'fd',0,'sotos',1,'9d5a0572f5bb2807e33571c3cbf8bd09',0), ('279',1,'2013-08-02 02:08:34',0,'30697000000142',0,'fd',0,'sotos',1,'ab99174d88f7d19850fde010a1518854',0), ('279',1,'2013-08-02 02:08:34',0,'30697000000147',0,'fd',0,'sotos',1,'95c48b96397b21ddbe17ad8ed026221e',0), ('279',1,'2013-08-02 02:08:34',0,'306972233469',0,'fd',0,'sotos',1,'6c55bc3181be50d8a99f0ddba1e783bf',0), ('279',1,'2013-08-02 02:08:34',0,'306972233470',0,'fd',0,'sotos',1,'d9cae1cbe7eaecb9c0726dce5f872e1c',0), ('279',1,'2013-08-02 02:08:34',0,'306972233474',0,'fd',0,'sotos',1,'579c34fa7778ac2e329afe894339a43d',0), ('279',1,'2013-08-02 02:08:34',0,'306972233475',0,'fd',0,'sotos',1,'77d68c23422bb11558cf6fa9718b73d2',0), ('279',1,'2013-08-02 02:08:34',0,'30697444333',0,'fd',0,'sotos',1,'a7fd63b8b053b04bc9f83dcd4cf1df55',0)
Это была заполненная вставка.