perlスクリプトをSpeedyCGIスクリプトとして動作させる場合、グローバル変数の値は保持され続ける。なので、一度接続したデータベースハンドルを使い回すことでデータベースへの接続コストを削減できる。
テスト用スクリプト
perlスクリプトをSpeedyCGIスクリプトとして動作させる場合、グローバル変数の値は保持され続ける。なので、一度接続したデータベースハンドルを使い回すことでデータベースへの接続コストを削減できる。
テスト用スクリプト
接続時
my $dbh = DBI->connect(
'DBI:mysql:database=sandbox;host=localhost;mysql_read_default_file=/etc/mysql/my.cnf',
qw/id password/,
);
または接続後に
$dbh->{ mysql_enable_utf8 } = 1;
PERLでMySQLにデータを挿入する実験。
実験スクリプト
INSERT を100万回繰り返す。
for(1..1000000){ $sql = <<"EOM"; INSERT INTO `table_name` (`col1`,`col2`,`col3`,`col4`) VALUES ('10','11','12','13'); EOM $sth = $dbh->do($sql)|| die $dbh->errstr; }
結果:途中でサーバエラー
Server error!
The server encountered an internal error and was unable to complete your request.
Error message:
Premature end of script headers: xxxx.cgi
If you think this is a server error, please contact the webmaster.
Error 500
httpd/error_logの出力:
[Fri Feb 06 20:04:00 2009] [error] [client xx.xxx.xxx.xxx] Premature end of script headers: sql.cgi
挿入されたデータ:約83万行
httpd.confの設定が、TimeOut 60によるエラーか?
$COUNT = $dbh->selectrow_array("SELECT COUNT(*) FROM `テーブル名` WHERE `カラム` = '条件'");
$sql = "INSERT INTO `db_01` ( data1, data2 ) VALUES ( $data1, $data2 )"; $sth = $dbh->prepare( "$sql" ); $sth->execute(); $id = $sth->{mysql_insertid};
これで$idに「自分が追加した最新のauto_increment番号」が代入される
ただし下記のようにdoでは使えない。
$sql = "INSERT INTO `db_01` ( data1, data2 ) VALUES ( $data1, $data2 )"; $sth = $dbh->do( "$sql" ); $id = $sth->{mysql_insertid};