SSH+Oracle一括挿入データ・ノット


データを挿入するのは簡単な操作ですが、データ量を上げると、そう簡単ではありません.
    最近のプロジェクトでは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;
			}
		});
	}