jquery 経由で標準の $.ajax 呼び出しを使用して呼び出される次の PHP スクリプトを実行しています。この PHP スクリプトは、ストアド プロシージャを介して複数のレコードをデータベースに挿入します。この手順は単純な INSERT INTO です。
PHPスクリプトは
include_once '../Connections/define_connections.php';
$mysqli = new mysqli(DBHOST,DBUSER,DBPASS,DBNAME);
$mysqli->set_charset("utf8");
for ($q=0;$q<50000;$q++){
$varma = $mysqli->prepare("CALL insert_qq(?,?,?)");
$varma->bind_param('dds',$v1,$v2,$v3);
$v1 = '1';
$v2 = '2';
$v3 = '3';
$varma->execute();
};
$mysqli->close();
Mysqlプロシージャは
区切り記号 $$
CREATE DEFINER=`loopmap`@`%` PROCEDURE `insert_qq`(in latitude double,in longitude double,
in placename varchar(100))
BEGIN
insert into GEO_Structure values (default,default,default,default,latitude,longitude,
default,default,default,default,default,default,default,default,default,
default,default,default,default,default,default,default,default,default,default,default,
placename,default,default,default);
END
問題は、ループの数が約 10K の場合、このコードは問題なく動作しますが、その数を超えると、たとえばここに示すように 50K になると、いくつかの問題が発生することです。各レコードは 2 回挿入されます。これは、ストアド プロシージャがループごとに 2 回呼び出されることを示しています。
これにより、この場合、データベースに 100K レコードが生成されます。また、firebug が赤いエラーを返すため、何かが間違っていることを確認することもできます (ただし、発生したエラーについては何も指定されておらず、コードも説明もされていません)。
興味深いことに、ループが 10K に達すると、各レコードが正しく挿入され (ストアド プロシージャはループごとに 1 回だけ呼び出されます)、firebug はエラーをスローしません (成功を返します)。これが失敗し始める重要な数のループがあるようです。