JDBCでトランザクション
随分前だけど、Java + DBのシステムに本格的に携わり始めた時、JDBCでのトランザクションの使い方が分からなかった。けど、分かっちゃえば簡単だった。
Connectionオブジェクトに対してsetAutoCommit(false)を実行して、最後にcommit()メソッドを呼ぶ以外は通常のDBに対する処理と一緒。
こんな簡単な情報を探すのに結構時間がかかった気がする。随分前の話だったからかな。今は簡単な解説ページ(こんなページとか)がいくらでも見つかるのに。
詳しくはSunのこのページとか英語だけどサンプルコードとかは参考になると思う。日本語のドキュメントはどこだろ?
その他、トランザクションとは直接関係ないけど、StatementオブジェクトにはexecuteBatchというメソッドがあって、複数のSQLを一括で実行することが出来る。@ITのページ。
今開発してるシステムでは、独自のDBコネクションプーリングクラスを使ってるんだけど、PreparedStatementもそのクラスにキャッシュしておる。パラメータ違いの同じSQL(UPDATE)を実行する時にはこれをこれを使ってる。ブラウザからアップロードされたCSVファイルを読み込んでDBにデータを格納する場合とか。
疑似Javaコードはこんな感じ。例外処理省略
//MyConnectionクラスは独自のConnectionクラスのラッパー
MyConnection = myConn = ConnPool.getMyConn();
Connection conn = myConn.getConn();
//コネクションプーリングクラスからPreparedStatementを取得
//例えば “INSERT INTO tbl (username, password) VALUES(?,?)”
// みたいなSQL文がPreparedStatementの実際のSQLだとする
PreparedStatemsnt pstmt = myConn.getPstmt(“insert1line”);
// CSVファイルの処理
// この時点でCSVファイルはパース済みで、
// データクラス”csv”に使いやすい形で中身が格納されている。
while (csv.hasNext()) {
//1行取得
CsvLine aLine = csv.next();
//パラメータを取得&セット
Object[] params = csv.getParams();
for(int i=0; i
MyConnection = myConn = ConnPool.getMyConn();
Connection conn = myConn.getConn();
//コネクションプーリングクラスからPreparedStatementを取得
//例えば “INSERT INTO tbl (username, password) VALUES(?,?)”
// みたいなSQL文がPreparedStatementの実際のSQLだとする
PreparedStatemsnt pstmt = myConn.getPstmt(“insert1line”);
// CSVファイルの処理
// この時点でCSVファイルはパース済みで、
// データクラス”csv”に使いやすい形で中身が格納されている。
while (csv.hasNext()) {
//1行取得
CsvLine aLine = csv.next();
//パラメータを取得&セット
Object[] params = csv.getParams();
for(int i=0; i