2016-09-02 10 views
1

ojdbcを使用してoracleデータベースに接続し、表を問い合せ、別の表の別の表にjava.sql.resultSetのレコードを挿入しようとするプログラムがscalaにあります。 jdbc接続。jdbc java.sql.preparedstatement挿入時の行の複製

//conn1 to oracle: java.sql.Connection = [email protected] 
//conn2 to another non-oracle database: java.sql.Connection = [email protected] 

Oracleテーブルから取得する結果での私の試み:JDBC経由で別のデータベースやテーブルへの結果からレコードを挿入しようとするため

val stmt1 = conn1.createStatement() 
stmt1.setFetchSize(3000) 
val sql1 = "select userid from nex.users" 
val result = stmt1.executeQuery(sql1) 

やコード:

val insert_sql = "insert into test.users (userid) values (?)" 
val ps = conn2.prepareStatement(insert_sql) 
val batchSize = 3000 
var count = 0 
while (result.next) { 
    ps.setInt(1, result.getInt(1)) 
    ps.addBatch() 
    count += 1 
    if (count % batchSize == 0) ps.executeBatch() 
} 

何ですstumping meこれはjdbcを使用する多くの例ではまったく同じ構文ですが、2番目のテーブルでは最初のテーブルから元の行数の4倍を見ています。

select userid, count(*) from test.users group by userid 


1 4 
2 4 
3 4 
4 4 
5 4 
6 4 
etc 
+0

あなたは 'test.users'テーブルの前にコードを実行する空でしたか? – copeg

+0

はい、私はいつでもテーブルを切り捨てて、コードで何か新しいものを試して、0行があることを確認します – tchoedak

+0

あなたには明らかな質問は残念ですが、 'select userid、count(*)をnex.usersグループby userid'は、そのテーブルでユニークなユーザーIDですか? – hsl

答えて

0

問題は、私がそうでなければ次のバッチは、前のバッチの上に積み上げになるだろう、実行し、すべての後にps.clearBatch()を実行するために必要なことでした。 executeBatchをより頻繁に呼び出す必要のある大きなテーブルでこれを試すと、重複行の量はx倍になります。最終的なコードは似ていますが、ps.clearBatch()となります。

val ps = conn2.prepareStatement(insert_sql) 
val batchSize = 3000 
var count = 0 
while (result.next) { 
    ps.setInt(1, result.getInt(1)) 
    ps.addBatch() 
    count += 1 
    if (count % batchSize == 0) 
     ps.executeBatch() 
     ps.clearBatch() 
} 
0

はい、clearBatchがありません。

executeBatch()は最後にclearBatch()を呼び出します。 しかし、他の実装ではまったく同じであるという保証はありません。必要に応じて

はまた、私が答えるのをtchoedakするマイナー微妙な追加を作っています:)

ps.executeBatch(); 
conn2.commit(); 
ps.clearBatch();