私のプロジェクトは春のトランザクションマネージャーで休止状態を使用しており、私のデータベースはpostgresです(無関係かもしれません)。
私は大きなxmlファイルを読み込んで、それらからオブジェクトを構築しようとしています(オブジェクトは大きくありませんが、量は大きいです)。それらをデータベースに挿入します。
万が一オブジェクトの 1 つがデータベースの制約に違反すると、プロセス全体が停止します。データベースの制約に違反するものをスキップするにはどうすればよいですか? または、IDなどをログファイルに記録しますか?
質問の更新:
私はSOをブラウズしてきましたが、バッチ挿入にはステートレスセッションを使用することをお勧めしますが、それでも同じ問題が発生し、挿入が停止することがわかりました:
May 26, 2012 4:45:47 PM org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: ERROR: duplicate key value violates unique constraint "UN_FK"
Detail: Key (fid)=(H1) already exists.
簡単にするために、xml を解析して db に挿入するためのコードの関連部分を次に示します。
//class field
@Autowired
private SessionFactory sessionFactory;
@Override
public void startDocument() throws SAXException {
session = sessionFactory.getCurrentSession();
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equalsIgnoreCase("FILM")) {
movie.setCategory(category);
movie.setAdded(new Date());
session.insert(movie);
}
}
私は app-ctx でこのプロパティhibernate.jdbc.batch_size
を 100 に設定しています。これを避けるために、挿入前に選択する必要がありますか?
更新 2:
セッションの代わりに使用するStatelessSession
と、約20回の挿入が発生し、例外や何もなく処理が無期限に停止します。
20という数字は、Tomcatとの接続をプールしているためだと思いますmaxActive="20"
.
バウンティの更新:
誰かが解決策を提供してくれるのを本当に楽しみにしています(可能であれば防御的な選択なしで)。statelessSession または単にセッションを使用します。