2013-01-31 23 views
15

PreparedStatementを使用して2000+のパラメータ・マーカーを持つ大きなデータベース・コールを構築します。Java JDBC準備文の最大パラメータ・マーカ

イムは、私はAPIのドキュメントを検索しようとしたとGoogleが、これを構成する方法を見つけるcouldntのこのエラー

Caused by: java.sql.SQLException: Prepared or callable statement has more than 2000 parameter markers. 
    at net.sourceforge.jtds.jdbc.SQLParser.parse(SQLParser.java:1139) 
    at net.sourceforge.jtds.jdbc.SQLParser.parse(SQLParser.java:156) 
    at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.<init>(JtdsPreparedStatement.java:107) 
Caused by: java.sql.SQLException: Prepared or callable statement has more than 2000 parameter markers. 

を得ます。

この上限を上げることができるかどうかは知っていますか?私はそれが遅いデータベースコールになるだろうが、それは今のところうまくいくことを認識しています。

また、この問題は長期的には問題になりますが、バッチで実行する方が良いでしょうか?

答えて

15

あなたは2000年に立ち往生しているような縫い目があります。ここにはドライバーのソースがあります。

if (params != null && params.size() > 255 
    && connection.getPrepareSql() != TdsCore.UNPREPARED 
    && procName != null) { 
    int limit = 255; // SQL 6.5 and Sybase < 12.50 
    if (connection.getServerType() == Driver.SYBASE) { 
    if (connection.getDatabaseMajorVersion() > 12 || 
     connection.getDatabaseMajorVersion() == 12 && 
     connection.getDatabaseMinorVersion() >= 50) { 
     limit = 2000; // Actually 2048 but allow some head room 
    } 
    } else { 
    if (connection.getDatabaseMajorVersion() == 7) { 
     limit = 1000; // Actually 1024 
    } else if (connection.getDatabaseMajorVersion() > 7) { 
     limit = 2000; // Actually 2100 
    } 
    } 
    if (params.size() > limit) { 
    throw new SQLException(
     Messages.get("error.parsesql.toomanyparams", 
     Integer.toString(limit)), 
     "22025"); 
    } 
} 

Hereは、それを解決する方法の例とブログです。

+0

+1ありがとうございます。どちらのクラスはどのJavaバージョンからですか? – cowls

+2

jTDS1.3ファイルhttp://sourceforge.net/p/jtds/code/1228/tree/branches/jTDS%201.3%20%28stable%29/src/main/net/sourceforge/jtds/jdbc/ここにありますSQLParser.java#l1223 –

+0

十分な答えですか? –