SSH+Oracle一括挿入データ・ノット
データを挿入するのは簡単な操作ですが、データ量を上げると、そう簡単ではありません.
最近のプロジェクトではSSH+oracleデータベースを使用し,C 3 P 0接続プールを使用して,ある動作を実行するときに2テーブルに1万個ずつデータを挿入するよう要求している.そこでjdbc方式で挿入した.
まずsequenceを取得し、データベースにデータを挿入します.テスト時間、クラッシュして3分近くかかりました(2つのテーブルのsequenceを取得するのに時間がかかりました)、後で以前に似たようなプロジェクトをしたことを考えて、プライマリ・キーの自己増加の戦略を使って、プライマリ・キーを自己増加に変更しました.もう一度テストして、まだ3秒もかかりません.このコードを後で参照するために記録します.
ちなみに、ストレージ・プロシージャ(特に複数のテーブル・プラグイン・データを操作する)を使用すると、効率が向上します.
テーブルは省略されます.次はsequenceです.
これがoracleが自己増加を実現するトリガですTB_IDはテーブルのプライマリ・キーです.
次に、データ交換レイヤのコードを示します.
最近のプロジェクトではSSH+oracleデータベースを使用し,C 3 P 0接続プールを使用して,ある動作を実行するときに2テーブルに1万個ずつデータを挿入するよう要求している.そこでjdbc方式で挿入した.
まずsequenceを取得し、データベースにデータを挿入します.テスト時間、クラッシュして3分近くかかりました(2つのテーブルのsequenceを取得するのに時間がかかりました)、後で以前に似たようなプロジェクトをしたことを考えて、プライマリ・キーの自己増加の戦略を使って、プライマリ・キーを自己増加に変更しました.もう一度テストして、まだ3秒もかかりません.このコードを後で参照するために記録します.
ちなみに、ストレージ・プロシージャ(特に複数のテーブル・プラグイン・データを操作する)を使用すると、効率が向上します.
テーブルは省略されます.次はsequenceです.
create sequence SEQ_TEST
minvalue 1
maxvalue 999999999999999999999999999
start with 126661
increment by 1
cache 20;
これがoracleが自己増加を実現するトリガですTB_IDはテーブルのプライマリ・キーです.
create or replace trigger TRI_TEST
before insert on tb_ticket_log
for each row
declare
begin
select SEQ_TEST.Nextval into:new.TB_ID from dual;
end TRI_TEST;
次に、データ交換レイヤのコードを示します.
public void save(final List list)
throws HibernateException, SQLException {
this.getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Connection conn = session.connection();
PreparedStatement ps = null;
PreparedStatement _ps = null;
String sql = "INSERT INTO TB1(column,...) VALUES (?,...)";
String _sql = "INSERT INTO TB2(column,...) VALUES(?,...)";
ps = conn.prepareStatement(sql);
_ps = conn.prepareStatement(_sql);
for (int i = 0; i < list.size(); i++) {
ps.setString(1, "");
//ps.set...
ps.addBatch();
_ps.setString(1, "");
//_ps.set...
_ps.addBatch();
// session, 。
if (i % 10000 == 0) {
ps.executeBatch();
_ps.executeBatch();
session.flush();
session.close();
}
}
ps.executeBatch();
_ps.executeBatch();
ps.close();
_ps.close();
session.flush();
session.close();
return null;
}
});
}