[pgpool-general-jp: 1195] Re: JDBC API の executeBatch() メソッドの実行について
Yugo Nagata
nagata @ sraoss.co.jp
2013年 9月 10日 (火) 15:40:03 JST
沖様
長田です。
情報提供ありがとうございます。エラーを再現することができました。
テーブルの not null 制約を外した場合、以下のようなプログラムでも
再現できることがわかりました。
stmt = connection.prepareStatement("insert into t_test(c2) values(?)");
for (int i = 0; i < 10; i++) {
Object param;
param = new java.util.Date();
stmt.setTimestamp(1, new java.sql.Timestamp(
((java.util.Date)param).getTime()));
stmt.addBatch();
}
stmt.executeBatch();
connection.commit();
原因につきましては、現在調査中です。
On Mon, 9 Sep 2013 21:06:13 +0900
沖賢治 <kenjio @ h-t.co.jp> wrote:
> 長田様
> お世話になっております。沖です。
>
> ご返信頂き、誠にありがとうございます。
>
> 抜粋ではございますが
> 以下にソースを記述致します。
>
> ################### テストしているテーブル構造 ######################
>
> CREATE TABLE t_test
> (
> c1 integer NOT NULL,
> c2 date NOT NULL,
> c3 integer NOT NULL,
> c4 integer NOT NULL,
> c5 integer NOT NULL,
> c6 timestamp with time zone DEFAULT now(),
> c7 timestamp with time zone,
> c8 integer,
> )
>
> ################### 実行している Java のソースの抜粋 ###############
>
> String url = "jdbc:postgresql://192.168.0.1:9999/test";
>
> Connection con = DriverManager.getConnection(url, "postgres", "123456");
> con.setAutoCommit(false);
> PreparedStatement stmt = con.prepareStatement(
> "insert into t_test(c1, c2, c3, c4, c5) values(?,?,?,?,?)");
> for (List paramList : rowParameterList) {
> for (int i = 0; i < paramList.size(); i++) {
> Object param = paramList.get(i);
> if (param instanceof Date) {
> stmt.setTimestamp(i + 1, new
> java.sql.Timestamp(((Date) param).getTime()));
> } else {
> stmt.setObject(i + 1, param);
> }
> }
> stmt.addBatch();
> }
> stmt.executeBatch();
>
> con.commit();
> stmt.close();
> con.close();
>
> ##############################################################
>
> またその後、調査を行っていて以下の事が分かりました。
>
> c6 のカラムをバインド変数で指定するように
> したところ、エラーが発生しないようになりました。
> (c6 には デフォルト値で now() が指定されており
> デフォルト値でINSERTを行う場合はエラーとなり、
> Java側で値を指定してINSERTするようにしたら
> 正常に実行できるようになりました。)
>
>
> 以上となります。
> 何卒、よろしくお願い致します。
>
> 2013年9月9日 19:05 Yugo Nagata <nagata @ sraoss.co.jp>:
> > はじめまして、長田です。
> > ご報告ありがとうございます。
> >
> > 以下の環境で現象の再現を試みましたが、pgpool-II 3.3.0 で executeBatch()
> > のエラーは発生させることはできませんでした。
> >
> > pgpool-II 3.3.0
> > postgreql 9.2.4
> > JDBCドライバー postgresql-9.2-1003.jdbc4.jar
> > Java 1.6.0_24 および 1.7.0
> >
> > お手数ですが、再現プログラムを提供いただけないでしょうか。
> >
> > On Fri, 6 Sep 2013 19:43:19 +0900
> > 沖賢治 <kenjio @ h-t.co.jp> wrote:
> >
> >> はじめまして、沖と申します。
> >> お世話になっております。
> >>
> >> 現在、pgpool 3.4.1 を利用していまして
> >> pgpool-II 3.3.0 へのアップグレードを検討しています。
> >> しかし、問題が発生して、困っています。
> >> ご意見いただければ幸いでございます。
> >>
> >> 【現在発生している問題】
> >> 弊社では、Javaベースのシステムを構築しているのですが
> >> JDBC APIのexecuteBatch()メソッドを実行すると
> >> 以下のエラーが出力され実行が行えません。
> >>
> >> java.lang.ArrayIndexOutOfBoundsException: 5
> >> at org.postgresql.core.v3.SimpleParameterList.setResolvedType(SimpleParameterList.java:269)
> >> at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1738)
> >> at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:405)
> >> at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2893)
> >> ・・・
> >>
> >> このエラーは、現在利用している pgpool 3.4.1 環境下では発生せず、
> >> pgpool-II 3.3.0 環境下では発生致します。
> >> また、pgpool-II 3.3.0 環境下でも JDBCの接続文字列に 「protocolVersion=2」
> >> を付加して接続を行うと正常に実行されます。
> >> 出来ましたら、
> >> pgpool-II 3.3.0 環境下でも、protocolVersion=2の指定なし(プロトコルバージョンV3)で
> >> 接続させてxecuteBatch()メソッドを動作できるようにしたいのですが
> >> なにか原因となる部分が想定できますでしょうか?
> >>
> >> 検証しました環境は、以下の通りとなります。
> >> pgpool-II 3.3.0
> >> postgreql 9.2.4
> >> JDBCドライバー postgresql-9.2-1003.jdbc4.jar
> >> Java 1.6.0_34-b04
> >>
> >> DBサーバは、2台構成で
> >> replication_mode = on
> >> load_balance_mode = on
> >> で設定しています。
> >>
> >> ※ pgpool 以外は、現在運用を行っている環境と同じ設定となっております。
> >>
> >>
> >> 以上となります。
> >> 何卒、よろしくお願い致します。
> >> _______________________________________________
> >> pgpool-general-jp mailing list
> >> pgpool-general-jp @ sraoss.jp
> >> http://www.sraoss.jp/mailman/listinfo/pgpool-general-jp
> >
> >
> > --
> > Yugo Nagata <nagata @ sraoss.co.jp>
--
Yugo Nagata <nagata @ sraoss.co.jp>
pgpool-general-jp メーリングリストの案内