ThinkPHP 3.2 中使用 addAll 方法一次性插入多条数据时出现 timeout 的问题怎么办?
作者:互联网
可以考虑以下几个解决方案:
-
增大数据库连接时间限制: 你可以在数据库配置文件中增加
DB_SQL_LOG
和DB_TIMEOUT
的设置,或者在数据库的配置文件中调整连接超时时间。例如,如果你使用 MySQL,可以在my.cnf
文件中调整wait_timeout
和interactive_timeout
的值。 -
分批插入: 考虑将数据拆分成多个批次进行插入。例如,每次插入 1000 条数据,确保不会超出超时时间:
$data = // 你的数据数组 $batchSize = 1000; // 每批插入的条数 $total = count($data); for ($i = 0; $i < $total; $i += $batchSize) { $batchData = array_slice($data, $i, $batchSize); M('YourModel')->addAll($batchData); }
PHP -
优化数据库设置: 确保你的数据库表的索引设置合理,减少不必要的索引。大量插入时,索引可能会导致性能下降。
-
关闭自动提交: 如果你的数据库支持事务,可以在插入之前关闭自动提交,增加插入的性能。注意,所有数据插入成功后需要手动提交事务:
$model = M('YourModel'); $model->startTrans(); // 开始事务 try { // 批量插入逻辑 $model->addAll($data); $model->commit(); // 提交事务 } catch (Exception $e) { $model->rollback(); // 回滚事务 // 处理异常 }
PHP -
使用
LOAD DATA INFILE
: 如果你的数据是从 CSV 文件或其他文件中读取的,考虑使用 MySQL 的LOAD DATA INFILE
命令导入数据,效率更高。
标签: 来源: