− 11 MySQLのデータを集計する

  前回は、DataReaderで取り出したデータをDataAdapterで書き出す処理を作って動かしてみた。その結果は非常に不安定で、うまく動く時もあれば、動かない時もある。件数も毎回違った所でエラー終了してしまうという、どににも困った結果となった。理由はタイムアウトなのだが、これを回避するやり方が見当たらない。どうすれば?・・・という所までだった。

 いつまでも困っていないで、処理のログを見てみる。すると、エラーになっているのは必ず、データ読み込みの部分である事がわかった。Microsoftによれば「DataReaderの処理をしている間は処理が忙しく・・・」と書かれている。大量データ処理時に軽く動くDataReaderは悪くないのだが。多分SQL文が発行されてから、データが集計されてVisualBasicにデータセットが戻されるまでに要する時間、これがタイムアウトの大きな原因なのだろう。それなら。

 SQL処理をコマンドラインから動かしたり、TeraTermで動かしたりする場合にはタイムアウトは起きていない。という事は、タイムアウトはVisualBasicかConnecterNetの問題だ。ということは、コマンドラインからSQL文を発行して、その結果つくられたテキストファイルをVisualBasicで取り込めば良いのではないか?テストしてみる価値があるのでは?という事で、SQLを発行するバッチファイルを作成する処理を作ってみた。ソースは以下のようになる。

'
MyFL = Trim(Myhdr) & "bat\mmdata.bat"
Try
    Kill(MyFL)
    Kill(Trim(Myhdr) & "data\bundata.txt")
    Kill(Trim(Myhdr) & "data\bundata2.txt")
Catch ex As Exception
End Try
'ファイルの準備
FileNum = FreeFile()
FileOpen(FileNum, MyFL, OpenMode.Output)
'
Wkdata = "mysql -e " & """" & "select t.kigyo, t.mise, t.busdt, min(t.bumon) as tbumon, m.bunrui," & _
" sum(t.suryo) as tsuryo, sum(t.uriage) as turiage, sum(t.dscqty) as tdscqty, sum(t.dsprat) as tdsprat" & _
" from TMAST m right outer join " & Mtt & " t on m.kigyo=t.kigyo and m.scancd=t.scancd" & _
" where t.busdt>='" & Kaisi & "' and t.busdt<='" & Syuryo & "'" & _
" group by t.kigyo, t.mise, t.busdt, m.bunrui" & """" & " -uusername -ppassword -hyyy.xxx.zzz.aaa master" & _
" > " & Trim(Myhdr) & "data\bundata.txt"
PrintLine(FileNum, Wkdata)
Wkdata = "start /wait /min " & Trim(Myhdr) & "obj\sleep.exe 5"
PrintLine(FileNum, Wkdata)
Wkdata = "start /wait /min " & Trim(Myhdr) & "obj\makBbh3.exe " & Kaisi & " " & Syuryo
PrintLine(FileNum, Wkdata)
Wkdata = "start /wait /min " & Trim(Myhdr) & "obj\sleep.exe 5"
PrintLine(FileNum, Wkdata)
'========================ここまでが一回目です=============================  

===以下略

 つまり、動かすバッチファイルを一度削除しておいて、SQL文を作成。上には書かれていないが、最後に「System.Diagnostics.Process.Start(Trim(Myhdr) & "bat\mmdata.bat")」 のような文を書いてバッチフアィルを起動すれば、途中で一度中間ファイルを使う事になるが、うまく集計できるのではないか?(なお、Sleep.exeはVB6にて作成した時間待ち合わせをするだけの処理です。ファイルに対して遅延書き込みなどを行っている場合も考えられるのでパラメータで示した秒数の間処理中断するためのものです)
 実際に作られるバッチファイルは以下のようになります。

mysql -e "select t.kigyo, t.mise, t.busdt, min(t.bumon) as tbumon, m.bunrui, sum(t.suryo) as tsuryo, sum(t.uriage) as turiage, sum(t.dscqty) as tdscqty, sum(t.dsprat) as tdsprat from TMAST m right outer join TP1101 t on m.kigyo=t.kigyo and m.scancd=t.scancd where t.busdt>='2011-01-09' and t.busdt<='2011-01-12' group by t.kigyo, t.mise, t.busdt, m.bunrui" -uusername -ppassword -hxxx.yyy.zzz.aaa master > E:\linux\henkan\data\bundata.txt
start /wait /min E:\linux\henkan\obj\sleep.exe 5
start /wait /min E:\linux\henkan\obj\makBbh3.exe 2011-01-09 2011-01-12
start /wait /min E:\linux\henkan\obj\sleep.exe 5
mysql -e "select t.kigyo, t.mise, t.busdt, min(t.bumon) as tbumon, m.lbun, sum(t.suryo) as tsuryo, sum(t.uriage) as turiage, sum(t.dscqty) as tdscqty, sum(t.dsprat) as tdsprat from TMAST m right outer join TP1101 t on m.kigyo=t.kigyo and m.scancd=t.scancd where t.busdt>='2011-01-09' and t.busdt<='2011-01-12' group by t.kigyo, t.mise, t.busdt, m.lbun" -uusername -ppassword -hxxx.yyy.zzz.aaa master > E:\linux\henkan\data\hindata.txt
start /wait /min E:\linux\henkan\obj\sleep.exe 5
start /wait /min E:\linux\henkan\obj\makBbh4.exe 2011-01-09 2011-01-12
start /wait /min E:\linux\henkan\obj\sleep.exe 5

 Windowsのマシンから LinuxのMySQLを動かしてデータを取り込みする際に、使っていなくてもマシンにMySQLがインストールされている必要がある。これが無いとMySQLの起動自体が出来ないので仕方が無い。私 はXamppをインストールして動かしてみた。なお、システムの環境変数にMySQLの場所も書き込んでおく必要がある。私の環境では、「C:\xampp\mysql\bin」 を追加してある。
 見てもらうとわかるが、makBbh3.exeではbundata.txtが入力ファイルとなり、分類別売り上げテーブルに書き出しし、makBbh4.exeは、hindata.txtが入力ファイルとなり、品種別売り上げテーブルに書き出すようになっている。これを動かすと、以下のようなログが得られた。

2011-01-13-17:54:21 mkBbhs バッチ作成します。おまち下さい。開始日=2011-01-09 終了日=2011-01-12
2011-01-13-17:54:21 mkBbhs 分類別データ作成バッチ作成終了。
2011-01-13-17:54:21 mkBbhs 品種バッチ作成します。おまち下さい。開始日=2011-01-09 終了日=2011-01-12
2011-01-13-17:54:21 mkBbhs 品種別データ作成バッチ作成終了。
2011-01-13-17:55:51 mkBbh3 を起動します。おまち下さい。開始日=2011-01-09 終了日=2011-01-12
2011-01-13-17:56:22 mkBbh3 を書き出します。おまち下さい。入力= 33610 出力= 8350 更新= 25260
2011-01-13-17:56:46 mkBbh3 の書き出しが終了しました
2011-01-13-17:58:08 mkBbh4 品種設定を起動します。おまち下さい。開始日=2011-01-09 終了日=2011-01-12
2011-01-13-17:59:25 mkBbh4 品種設定を書き出します。おまち下さい。入力= 92608 出力= 22834 更新= 69774
2011-01-13-18:00:34 mkBbh4 品種設定の書き出しが終了しました

 前回は5万件程度の入力件数でタイムアウトになってしまったが、今回は10万件程度でも問題なく動いてくれている。もっとも、入力がただのテキストファイルであれば、タイムアウトするのはよっぽどの事だろう。このような形で今回の予定だったファイルの書き出しは完了。あとはPHPでデータを取り出す部分だが、この部分はまた別の機会があった時にでも書こうと思う。

 プログラムの内容を上のように書くと、インデントされていない為に読みづらくなってしまいます。この為、内容をPDF化したものをつけてあります。必要ならこちらを参照してみて下さい 。mkBbhsPDFファイル。mkBbh3PDFファイル。mkBbh4は省略。ちなみに、このファイルはVisualBasic 2005 Expressの内容をOpenOffice.Org2.4のWriterに貼り付けし PDFにエクスポートしたものです。テキストコピー可の形で作成していますので、そのまま使用することも可能です。

「市民の目」トップページへ戻る