次のようJDBCなコードがあり、gemfireXD を として使用していDBます。
入力のリストに対するプロシージャの実行を並列化しようとしています。プロシージャにパラメーターとして渡すリストのサイズは固定されておらず、以下のコードでクエリを実行した後に決定されます。このリストはサイズが大きすぎる場合があります。
コード:
private static void executeProc (Connection cxn) throws SQLException {
Statement stmt = null;
try {
stmt = cxn.createStatement();
stmt.execute("select distinct field1 from Table1");
ResultSet rs = stmt.getResultSet();
List<String> fieldList = new ArrayList<String> ();
while (rs.next()) {
fieldList.add(rs.getString("field1"));
}
Array fieldArray = cxn.createArrayOf("VARCHAR", fieldList.toArray(new String[fieldList.size()]));
CallableStatement callableStmt = cxn.prepareCall("{CALL procedure1() ON TABLE Table1 WHERE field1 IN (?)}");
callableStmt.setArray(1, fieldArray);
callableStmt.execute();
} catch (SQLException e) {
e.printStackTrace();
}
}
エラー: コードの実行中に以下のランタイム エラーが発生しました。
実装されていない機能: createArrayOf(String, Object[])
質問:
gemfireXD のドキュメントには、setArray メソッドを使用してリストを渡して Data Aware プロシージャを実行できることが記載されています。しかし、実際の API に取り組んでいるとき、setAaary() メソッドはリストではなく配列オブジェクトを想定しています。
GemfireXD のドキュメントでは、 setArray() メソッドをサポートするドキュメント (1.4.0) で、このようなプロシージャ コールの例を示しています。ドキュメントからの直接的な例は次のとおりです。
// GemFire XD データ対応プロシージャの呼び出し。
CallableStatement callableStmt = connection.prepareCall("{CALL order_credit_check() ON TABLE Orders WHERE customerID IN (?)}"); callableStmt.setArray(1, <-顧客 ID のリスト->);
prepareStatement.setArray を呼び出して、クエリでパラメータを設定するにはどうすればよいですか?
望ましい結果を達成するための他の実装アプローチを提案してください。