我的 Codeigniter 应用程序有问题。它接受一个 xml 作为输入,并将其存储在 mariadb 数据库中。 xml 有一个树结构,它由数据库上的大约 10 个表映射。 该应用程序基于单个事务,具有最终提交和发生异常时的回滚。
如果是小 xml,我没有问题,但我尝试导入 200M xml,但我遇到了问题,因为 35 分钟后插入事务无故死亡,我找不到任何错误日志。 我在 apache、mariadb 和 codeigniter 中搜索过日志,但没有出现错误或异常。
我在 mariadb 设置中增加了最大执行 mariadb 设置一些变量,并且我还在 config.php 和 php.ini 中增加了 sess_time_to 更新。
xml 具有树结构,在其中一个表中插入大约 35000 次后它就会停止。 我打印了 mariadb 查询,我注意到它会在每个事务中多次锁定 ci_session 表,也许在 codeigniter 中设置了最大连接数? 应用程序在 table13 中的最后一次插入时停止,其中插入了大约 50000 条记录。 该代码显示了插入物的结构,其中显示了一些 annidated 插入物。我认为并发访问尚未插入的数据存在问题,但我没有日志。会话处于活动状态。 谢谢。
config.php
$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ci_sessions_'.preg_replace('/[^a-z0-9]/i', '', crypt($_SERVER['DOCUMENT_ROOT'], $config['encryption_key']) );
$config['sess_expiration'] = 180000; #72000;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 180000; #18000;
$config['sess_regenerate_destroy'] = FALSE;
mariadb
max_allowed_packet=33554432
代码
try {
$this->db->trans_begin();
// INSERT
$sc_table1 = array(
...
);
$sc_table1_id = $this->table1_model->insert($sc_table1);
if (!$sc_table1_id) {
$error = $this->db->error();
$message = $error['message'];
log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT SCHEDE sc_table1]: $message");
throw new Exception($message);
}
// INSERT
$sc_table2 = array(
'sc_table1_id' => $sc_table1_id,
....
);
$sc_table2_id = $this->table2_model->insert($sc_table2);
log_message('debug', "table1 | DB - 001 | sc_table2 inserted into DB");
if (!$sc_table2_id) {
$error = $this->db->error();
$message = $error['message'];
log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table3 sc_table2]: $message");
throw new Exception($message);
}
// INSERT sc_table3
$sc_table3 = $xml->table3;
$sc_table3->sc_table1_id = $sc_table1_id;
$sc_table3->sc_table2_id = $sc_table2_id;
$table3_id = $this->table3_model->insert($sc_table3);
if (!$table3_id) {
$error = $this->db->error();
$message = $error['message'];
log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table3 sc_table3]: $message");
throw new Exception($message);
}
log_message('debug', "table1 | DB - 002 | sc_table3 inserted into DB");
// INSERT
// ----------------------------------------------------------------------------------------
$xml_table4 = $xml->table4;
// municipality validation
$uxxx = $this->table1_model->get_user_istat_code_admin();
$sc_table5 = array(
'sc_table1_id' => $sc_table1_id,
...
);
$sc_table5_id = $this->table5_model->insert($sc_table5);
if (!$sc_table5_id) {
$error = $this->db->error();
$message = $error['message'];
log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table4 sc_table5]: $message");
throw new Exception($message);
}
// INSERT sc_table2
$table2 = $xml->table4->xpath($namespacePrefixes["opengis"].':Polygon')[0];
. $sc_table2 = array(
'sc_table1_id' => $sc_table1_id,
...
);
$sc_table2_id = $this->table2_model->insert($sc_table2);
if (!$sc_table2_id) {
$error = $this->db->error();
$message = $error['message'];
log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table4 sc_table2]: $message");
throw new Exception($message);
}
// INSERT sc_table4
$sc_table4 = clone $xml_table4;
$sc_table4->sc_table1_id = $sc_table1_id;
$sc_table4->sc_table5_id = $sc_table5_id;
$sc_table4->sc_table2_id = $sc_table2_id;
$sc_table4_id = $this->table4_model->insert($sc_table4);
if (!$sc_table4_id) {
$error = $this->db->error();
$message = $error['message'];
log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table4 sc_table4]: $message");
throw new Exception($message);
}
log_message('debug', "table1 | DB - 003 | sc_table4 inserted into DB");
// INSERT sc_City
$cities = $xml_table4->City;
$i = 0;
foreach ($cities as $city) {
$sc_City = array(
'sc_table1_id' => $sc_table1_id,
'SC_table4_id' => $sc_table4_id,
'ln' => $xml->table4->xpath('City')[$i]->attributes()['ln'],
'City' => $city,
);
$sc_City_id = $this->City_model->insert($sc_City);
if (!$sc_City_id) {
$error = $this->db->error();
$message = $error['message'];
log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table4 sc_City]: $message");
throw new Exception($message);
}
$i++;
}
// INSERT table6
// ----------------------------------------------------------------------------------------
foreach ($xml->table6 as $xml_table6) {
// INSERT sc_table6
$sc_table6 = clone $xml_table6;
$sc_table6->sc_table1_id = $sc_table1_id;
$sc_table6_id = $this->table6_model->insert($sc_table6);
if (!$sc_table6_id) {
$error = $this->db->error();
$message = $error['message'];
log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table6 sc_table6]: $message");
throw new Exception($message);
}
// table6_table7
$xml_table6_table7 = $xml_table6->table6_table7;
// INSERT sc_table5
$sc_table5 = array(
'sc_table1_id' => $sc_table1_id,
);
$sc_table5_id = $this->table5_model->insert($sc_table5);
if (!$sc_table5_id) {
$error = $this->db->error();
$message = $error['message'];
log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table6 table6_table7 sc_table5]: $message");
throw new Exception($message);
}
// INSERT sc_table6_table7
$sc_table6_table7 = clone $xml_table6->table6_table7;
$sc_table6_table7_id = $this->table6_table7_model->insert($sc_table6_table7);
if (!$sc_table6_table7_id) {
$error = $this->db->error();
$message = $error['message'];
log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table6 sc_table6_table7]: $message");
throw new Exception($message);
}
// table6table8
$xml_table6table8 = $xml_table6->table6table8;
// INSERT sc_table5
$sc_table5 = array(
'sc_table1_id' => $sc_table1_id,
);
$sc_table5_id = $this->table5_model->insert($sc_table5);
if (!$sc_table5_id) {
$error = $this->db->error();
$message = $error['message'];
log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table6 table6table8 sc_table5]: $message");
throw new Exception($message);
}
// INSERT sc_table6table8
$sc_table6table8 = clone $xml_table6->table6table8;
$sc_table6table8->sc_table1_id = $sc_table1_id;
$sc_table6table8->sc_table6_id = $sc_table6_id;
$sc_table6table8->sc_table5_id = $sc_table5_id;
$sc_table6table8_id = $this->table6table8_model->insert($sc_table6table8);
if (!$sc_table6table8_id) {
$error = $this->db->error();
$message = $error['message'];
log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table6 sc_table6table8]: $message");
throw new Exception($message);
}
}
// INSERT table9
// ----------------------------------------------------------------------------------------
foreach ($xml->table9 as $xml_table9) {
// INSERT sc_table9
$sc_table9 = clone $xml_table9;
$sc_table9->sc_table1_id = $sc_table1_id;
$sc_table9_table6 = $this->table6_model->getByCode($sc_table9->table6Code, $sc_table1_id);
if (!isset($sc_table9_table6)) {
$message = 'table6 Code "' . $sc_table9->table6Code . '" not found';
log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table9 sc_table9]: $message");
throw new Exception($message);
}
unset($sc_table9->table6Code); // Foreign Key
$sc_table9->sc_table6_id = $sc_table9_table6->id;
$sc_table9_id = $this->table9_model->insert($sc_table9);
if (!$sc_table9_id) {
$error = $this->db->error();
$message = $error['message'];
log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table9 sc_table9]: $message");
throw new Exception($message);
}
// table9table10
$xml_table9table10 = $xml_table9->table9table10;
// INSERT sc_table5
$sc_table5 = array(
'sc_table1_id' => $sc_table1_id
);
$sc_table5_id = $this->table5_model->insert($sc_table5);
if (!$sc_table5_id) {
$error = $this->db->error();
$message = $error['message'];
log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table9 table9table10 sc_table5]: $message");
throw new Exception($message);
}
// INSERT sc_table9table10
$sc_table9table10 = clone $xml_table9->table9table10;
$sc_table9table10->sc_table1_id = $sc_table1_id;
$sc_table9table10->sc_table9_id = $sc_table9_id;
$sc_table9table10->sc_table5_id = $sc_table5_id;
$sc_table9table10->sc_gml_Point_id = $sc_gml_Point_id;
$sc_table9table10_id = $this->table9table10_model->insert($sc_table9table10);
if (!$sc_table9table10_id) {
$error = $this->db->error();
$message = $error['message'];
log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table9 sc_table9table10]: $message");
throw new Exception($message);
}
//OTHER 3 INSERT
}
// INSERT table11
// ----------------------------------------------------------------------------------------
foreach ($xml->table11 as $xml_table11) {
// INSERT sc_table11
$sc_table11 = clone $xml_table11;
$sc_table11->sc_table1_id = $sc_table1_id;
$sc_table11_table9 = $this->table9_model->getByCode($sc_table11->table9ID, $sc_table1_id);
if (!isset($sc_table11_table9)) {
log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table11 sc_table11]: $message");
throw new Exception($message);
}
$sc_table11_id = $this->table11_model->insert($sc_table11);
if (!$sc_table11_id) {
$error = $this->db->error();
$message = $error['message'];
log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table11 sc_table11]: $message");
throw new Exception($message);
}
//OTHER 2 INSERT
// table11table12
foreach ($xml_table11->table11table12 as $xml_table11table12) {
// INSERT sc_table5
$sc_table5 = array(
'sc_table1_id' => $sc_table1_id,
'ValidityStartDate' => $validityStartDate,
'ValidityEndDate' => $validityEndDate,
'Source' => $xml_table4->Source,
'Scale' => $xml_table4->Scale,
);
$sc_table5_id = $this->table5_model->insert($sc_table5);
if (!$sc_table5_id) {
$error = $this->db->error();
$message = $error['message'];
log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table11 table11table12 sc_table5]: $message");
throw new Exception($message);
}
// INSERT sc_table11table12
$sc_table11table12 = clone $xml_table11table12;
$sc_table11table12_id = $this->table11table12_model->insert($sc_table11table12);
if (!$sc_table11table12_id) {
$error = $this->db->error();
$message = $error['message'];
log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table11 sc_table11table12]: $message");
throw new Exception($message);
}
}
// table13
foreach ($xml_table11->table13 as $xml_table13) {
$sc_table5 = array(
'sc_table1_id' => $sc_table1_id,
'ValidityStartDate' => $validityStartDate,
'ValidityEndDate' => $validityEndDate,
'Source' => $xml_table4->Source,
'Scale' => $xml_table4->Scale,
);
$sc_table5_id = $this->table5_model->insert($sc_table5);
if (!$sc_table5_id) {
$error = $this->db->error();
$message = $error['message'];
log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table11 table13 sc_table5]: $message");
throw new Exception($message);
}
// INSERT sc_table13
$sc_table13 = clone $xml_table13;
$sc_table13_table11table12 = $this->table11table12_model->getByCode($sc_table13->table11table12ID, $sc_table1_id);
if (!isset($sc_table13_table11table12)) {
$message = 'Light Spot table12 ID "' . $sc_table13->table11table12ID . '" not found';
log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table11 sc_table13]: $message");
throw new Exception($message);
}
unset($sc_table13->table11table12ID);
$sc_table13->sc_table11table12_id = $sc_table13_table11table12->id;
//log_message('debug', 'table1 | Upload | OK | H table13ID: '.$sc_table13->table13ID.' '.time());
$sc_table13_id = $this->table13_model->insert($sc_table13);
if (!$sc_table13_id) {
$error = $this->db->error();
$message = $error['message'];
log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table11 sc_table13]: $message");
throw new Exception($message);
}
}
}
} catch
(Exception $e) {
$this->db->trans_rollback();
$this->response($message, REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
die;
}
try {
$this->db->trans_commit();
}
catch (Exception $e) {
log_message('error', 'Commit failed');
//$this->db->trans_rollback();
}
}
$this->set_response('success', REST_Controller::HTTP_OK);;