Относительно пакетных вставок в спящем режиме в зависимых таблицах в одной транзакции - PullRequest
0 голосов
/ 06 июля 2019

У меня есть две таблицы tab1 (id, col1, col2), а затем еще одна tab2 (id, col3, col4, tab_id). Столбец id этой первой таблицы является внешним ключом для столбца "tab_id" второй таблицы tab2. Теперь я получу входной Json, который будет хранить данные в tab1, но для таблицы tab2 будет 10000 записей. Я хочу сделать несколько вставок для обеих таблиц, но в одной транзакции, используя hibernate или пакетные вставки JDBC. Так что сначала нужно 1. Одна транзакция для tab1 и tab2, т. Е. В случае сбоя обе транзакции необходимо откатить 2. Пакетные вставки для таблицы tab2, так как не хотят попадать в базу данных 10000 раз из-за проблем с производительностью. Я попытался использовать приведенный ниже код, но это не помогло. Есть идеи, как мне этого добиться

Expected results to have data in tab1 and tab2 simultaneously in a single transaction and batch inserts in tab2 table



int batch_size=1200;

session = HibernateSessionFactory.getSession();

tx = session.beginTransaction();
Tab1 tab1= new Tab1 (); 
Integer structId =repo.getNextRecordId("Tab1"); //IN build method to get max(Id)+1 from the tab1 table
tab1.setId(structId);
tab1.setCol1(structInfo.getName());
tab1.setCol2(structInfo.getModule();
session.save(tab1);

List<DbObj>  mappingDetails = structInfo.getMappingDetails();
if(mappingDetails!=null && mappingDetails.size()>0){
    int recordCounter = 0;
    for(DbObj dbObj: mappingDetails){
        recordCounter++;
        Tab2 tab2= new Tab2();
        tab2.setTab1Id(structId );
        tab2.setCOl3(dbObj.getCol3);
        tab2.setCol4(dbObj.getCol4);
        session.save(tab2);                                                       
        if (recordCounter % batchSize == 0){
            session.clear();
            session.close();
        }
    }

}

tx.commit();
...