• 締切済み

INSERT処理について

JAVA初心者です。 ただ今、DB2サーバを用いての業務をしております。 そこで質問なのですが、JAVAでDB2のあるテーブルにC言語でいう構造体配列を一括でINSERTする方法があるのでしょうか? 今、1件ずつINSERTしているのでパフォーマンスが遅くて大変困っています。 よろしくお願いします。

  • Java
  • 回答数2
  • ありがとう数1

みんなの回答

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.2

>C言語でいう構造体配列を一括でINSERTする方法があるのでしょうか? の意味がよくわかりません。具体的にどのような処理を行いたいのでしょうか?1構造体=1レコードという前提がない限り、こう書かれてもよくわからないと思います。 また >パフォーマンスが遅くて大変困っています。 パフォーマンスが悪くなっているのは本当にJavaに原因があるのでしょうか? JavaでINSERTを発行しているようですが、本当にJava側で処理する必要があるのでしょうか?ストアド等を使ってDB側で実行させることで解決できるかもしれません。 他には、INSERT毎にConnectionを張ったり、PreparedStatementを使っていなかったりなどプログラム的な要因やDBのパフォーマンス調整が悪かったり、DBサーバのスペックの問題など他の要因も考えられます。 パフォーマンスを劣化させている部分をもう少し詳しく調べてみてはいかがでしょうか?

回答No.1

addBatch()メソッドを使えば大分パフォーマンスはよくなると思います。 詳しくはAPIを見てください。

t-miyaaan
質問者

お礼

addBatch()メソッドを使用したところ改善されました。 ありがとうございました。

関連するQ&A

  • 異なるデータベースでのINSERTについて

    ただいま、PostgreSQL、VB6.0を使用して開発中です。 日々レコードが追加される、A_DBにあるAテーブルのデータを バックアップとして、まったく構造の同じ、B_DBにあるBテーブルに差分をINSERTするようにしたいのですが、どのようにコードを記述すればよろしいでしょうか? イメージ的には下記に近いのですが… http://ziddy.japan.zdnet.com/qa691870.html http://ziddy.japan.zdnet.com/qa1099610.html 初心者なので、不十分なところがあるかも知れませんが、ご回答よろしくお願いします。

  • PostgreSQLへのinsert処理

    PostgreSQLのinsert処理でエラーが発生します。 最初に作ったDBではうまくいっていたのですが、AccessからODBC接続した際に日本語の項目が文字化けしていたため、文字コードの問題かと思い、文字コードを「EUC_JP」で指定したDBとテーブルを作り直し、再度実行してみたところ、「PostgreSQL query failed: ERROR: Invalid EUC_JP character sequence found (0x8365)」というエラーが発生し、insert処理が実行されませんでした。insertする項目をバラけさせて確認したところ、日本語の内容の部分でエラーが発生していました。 Accessの文字化けの件と併せて調べていますが、原因が今ひとつ分かりません。どなたか回答よろしくお願いします。

    • ベストアンサー
    • PHP
  • JAVAでテーブルの中身を見て、処理を分岐させるには

    JAVA初心者です。 JAVAで、ファイルから読み込んだデータをMySQLのテーブルに格納したいのですが、 すでにテーブルにある(キーが同じ)ならば、updateをし、 テーブル内同じキーのものがなければ、insertをしたいのですが、分岐条件の部分をどうやってかいたらよいのかわからず、上手くかけません。 select count(*) from table where key=00000; を使うのかなと思うのですが、 どうやって書いたらいいのかわかりません。 どなたか教えてください!

    • ベストアンサー
    • Java
  • insertを高速化させたい

    問題:insertが遅い。20件程度の情報をテーブルにinsertするのに、30秒以上かかる。 環境:Windows XP, MYSQL(TABLE1のidにはindexつき) 仕様:textdata.csvを開き、idを取得する。取得したidをgetid変数に入れる。    取得したidがTABLE1に無いか調べる。idが無ければinsert。    あれば読み飛ばす。textdata.csvのidが無くなれば終わり。 con = CREATEOLEOBJ("ADODB.Connection") //ここでCSVファイルを開き、idを取得しループさせる getidSQL = "Select * from TABLE1 where id = '" + getid + "';" RS = con.Execute(getidSQL) If RS.EOF Then //DB登録--------------------------------------------------------------------------------------- str = "INSERT INTO TABLE1 (id) values('" + getid + "');" con.Execute(str) //DB登録終了------------------------------------------------------------------------------------ endif //CSVループ ちなみに、DBにinsertせずに、かわりにテキストファイルに書き込む方法だと一瞬で挿入が完了します。 これをDBに書き込む時に高速化を図りたいのですが、何か良い方法はないでしょうか?

  • SQL文について

    開発言語:VB2010 DB:SqlServer2005 及び ACCESS2007 SQLサーバーのテーブルをAccessのテーブルへINSERTしたいのですが、 一文で行う事は可能でしょうか? (テーブルの構造は全く同じです) 同じDB内であれば、下記のような感じで出来ると思うんですが。 +----------------------------------+ INSERT into Atest_ACCESS SELECT * FROM Btest_SQL Where OperationDate => 2011/09/05 +----------------------------------+ 出来るのあればどのようにすれば良いのが教えて頂けると幸いです。 よろしくお願い致します。

  • TruncateしたテーブルへのInsertの遅さが気になる

    こんにちわ。 日次処理として、毎晩ワークテーブルをTruncateしてInsertしなおすというプログラムを数年前に作りました。 このプログラムはVB6、ADO、OLE DBプロバイダはOracleのものを使っています。 他のテーブルからSelectし、それを元に1レコードずつInsert文を作っては実行を繰り返す処理で正直遅いのですが、このプログラムの動作が不思議です。 日々数十万件のInsertを行っているのですが、ログを確認すると最初の2万件のInsertには40分掛かるわりに最後の2万件は5分で終わるのです。 今まで処理時間の遅さが問題になることもなく、バグもなく動いているしであまり気にしていなかったのですが、最近なぜこのような動きになるのか気になってきました。 最初も最後もSelect結果に偏りはなく、Insert文を作る処理に掛かっている時間は同じようなものかと思います。 とすると、遅いのはDBでのInsert処理か?と考えています。 レコード件数が少ないうちのInsertには時間が掛かるものなんでしょうか? だとするとそれはなぜ? 別に処理速度を速くしたいとか言うことではなく、なぜInsertの処理時間にこれほどの差が生じるのかが気になっています。 なおこのテーブルは主キー以外に索引を作っていません。 Insert文を作る際の元になるデータは論理的な単位ごとにSelectします。1回がだいたい数十件ぐらいです。 またその論理的な単位の分のデータをInsertしおわるごとにcommitしています(数十件ごとのcommitになります)。

  • insert処理でDATE型を追加したい

    環境はxp、apache2、php5、Postgresql8.2です。 1台のPCをサーバ&クライアントにしています。 ただ今PHPとPostgresqlの勉強をしています。 いつも質問に答えてくれてありがとうございます。 以下のようなテーブルに insert処理でデータを追加したいと思っています。 --------------------------- CREATE TABLE m_lecturehistory ( lecturecode text, lecturedate date, ・ ・ ・ --------------------------- $sql = "insert into m_lecturehistory (lecturecode, lecturedate ) values ('{$line[0]}','2008/1/1');"; このようにしてinsert処理をすれば正常に追加できます。 ただ、以下のようにして 変数からDATE型に追加しようとするとエラーになります。 --------------------------- $line[1] = "2008/1/1"; $sql = "insert into m_lecturehistory (lecturecode, lecturedate ) values ('{$line[0]}',"{$line[1]}");"; 対処方法をご存じでしたら、 ご教示して頂けたら幸いです。

  • DB2 INSERT時の格納順序

    DB2 UDBで以下のようなINSERT文を発行した場合、 insert into TABLE_A values(行1), (行2), (行3); テーブルへの格納順序が、 行1 行2 行3 のようにならないこともありますか? AIXにDBサーバーがある、 Webアプリケーションからの、 INSERT文です。 ちなみに、 クラスター索引などは 使われていません。 ご教示お願いします。

  • SQL Server 2000 - bulk insert

    SQL Server 2000でのbulk insert とはどういうものなのでしょうか? csvなどをテーブルに一括で更新できてしまうものでイメージはよいのでしょうか?csvにヘッダーがある場合除くなどもできたりするのでしょうか? できれば、具体的なコマンドの書き方もご教示ください。 よろしくお願いします。

  • Sybase IQでのINSERT速度改善

    リアルタイムにデータが発生し、Sybase IQ(15.2)のテーブルに随時レコード追加する処理のパフォーマンス改善をしたいです。 Javaでプログラムを書いていて、1スレッドで処理をしていたのですが、レコード総数が多くなってきたせいか処理が重くなってきました。 ですので複数スレッド・コネクションでINSERT文を実行するように修正したところ、以下のエラーが発生しました。 「SQL Anywhere エラー -210 : テーブル名 のローは、ユーザ '別のユーザ' によってロックされています。」 INSERTしているだけなのですが、テーブル全体をロックしているのかエラーが発生してしまいます。 数十件くらいのINSERT文をバッチ処理(executeBatch)で実行するということを、各スレッドで数秒間隔で行っています。UPDATEは一切行いません。 Sybase IQで、複数のコネクションで並列してINSERT文を実行するということはできないのでしょうか? また他に改善方法がありましたら教えてください。

専門家に質問してみよう