2012-03-24 3 views
8

私は、高性能のバッチクエリのDBをしたい、別のCUSTOMER_IDに基づいて照会する例のSQL:JDBC高パフォーマンスのためのバッチクエリ

select order_id, 
     cost 
from customer c 
    join order o using(id) 
where c.id = ... 
order by 

私はJDBC文を使用してそれを行うするかどうかはわかりません。私はこの目的のためにストアドプロシージャを使うことができると知っていますが、SPの代わりにJavaアプリケーションにsqlを書くことができればはるかに優れています。
JavaクライアントとMySQL DBにDBCPを使用しています。

+1

「バッチクエリ」とまったく同じ意味ですか? 'c.id in(...)'を使って複数の顧客を得ることができます。 –

+0

"顧客のための複数の結果セット"の意味を理解していません。 –

+0

@a_horse_with_no_name 1つの顧客に対して1つの結果セットがあることを意味します。戻り行を混在させないでください。 – superche

答えて

8

JDBC Specification 4.0は、バッチ更新のためのメカニズムを説明しています。そのため、JDBCのバッチ機能を挿入または更新の目的で使用することができます。これは仕様の第14章で説明されています。

AFAIK選択バッチのメカニズムはありません。なぜなら、他の人が推薦しているように、クエリーを適切に構成することで、一度にすべての行を簡単に取得できるからです。

int[] ids = { 1, 2, 3, 4 }; 
StringBuilder sql = new StringBuilder(); 
sql.append("select jedi_name from jedi where id in("); 
for (int i = 0; i < ids.length; i++) { 
    sql.append("?"); 
    if(i+1 < ids.length){ 
     sql.append(","); 
    } 
} 
sql.append(")"); 
System.out.println(sql.toString()); 

try (Connection con = DriverManager.getConnection(...)) { 

    PreparedStatement stm = con.prepareStatement(sql.toString()); 
    for(int i=0; i < ids.length; i++){ 
     stm.setInt(i+1, ids[i]); 
    } 

    ResultSet rs = stm.executeQuery(); 
    while (rs.next()) { 
     System.out.println(rs.getString("jedi_name")); 
    } 

} catch (SQLException e) { 
    e.printStackTrace(); 
} 

出力

select jedi_name from jedi where id in(?,?,?,?) 
Luke, Obiwan, Yoda, Mace Windu 

あなたはバッチ-select文のようなものが必要であることを考えるだろう、なぜ何らかの理由はありますか?

+1

私の現在の理論は、選択(ResultSetの場合など)あなたが行く次の数行は、選択肢のために無料でバッチ処理されます。 FWIW – rogerdpack

+1

@rogerdpack [fetchSize](http://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html#setFetchSize-int-)プロパティを意味しますか?それはおそらく動作しますが、ドキュメンテーションはそれがデータベースのヒントに過ぎないと述べています。それは必ずしもすべてのドライバーが実装するわけではありません。 –

+0

ねえ、リンクありがとう!フォロワーのために、Postgresでは自動コミット(奇妙なもの)が必要なように見えます:http://stackoverflow.com/questions/1468036/java-jdbc-ignores-setfetchsize – rogerdpack

0

あなたのSQL文は本当に問題ではありません(あなたのDBが扱えるように多くのネストされた結合を使用できます)。以下は、基本的なJavaの例です(DBCPではありません)。かなり類似しているDBCPの例については、exampleをチェックアウトすることができます。

Connection connect = DriverManager.getConnection(YOUR_CONNECTION_STRING); 
// Statements allow to issue SQL queries to the database 
Statement statement = connect.createStatement(); 

ResultSet resultSet = statement.executeQuery("select order_id, cost 
               from customer c 
               join order o using(id) 
               where c.id = ... 
              order by"); 
+1

私は、1つのDBクエリ、SQL文のような複数の結果を取得することを意味するバッチクエリを実行したい:select order_id、customerからのコストc join order o(id)where c.id = 123 order by; select order_id、customer from cost c(id)を使用して、次の順序で結合します。 – superche

+0

'executeQuery()'に引数としてコンパイルされたSQL文を入力することができます。例:2つのクエリを1つにまとめることができます – aviad

関連する問題