Пул соединений с базой данных с использованием временной таблицы

Я использую Apache dbcp для пула соединений и ibatis для выполнения транзакций базы данных с поддержкой Spring. Сценарий, который я пытаюсь тренировать:

  1. создать BasicDataSource с максимальным начальным подключением как 5

  2. Создать временную таблицу

  3. Записать большую часть записей во временную таблицу.
  4. Запишите записи в фактическую таблицу.

  5. Удалить временную таблицу

Проблема здесь в том, что шаги 2-5 выполняются в многопоточном режиме. Кроме того, поскольку я использую пул соединений, я не могу гарантировать, что шаги 2,3,4,5 получат тот же объект соединения из пула, и, следовательно, я вижу на шаге 3/4/5, что временная таблица XYZ не найдена.

Как я могу гарантировать, что я могу повторно использовать одно и то же соединение для 4 операций. Вот код для шагов 3 и 4. Я не собираюсь использовать глобальную временную таблицу.

@Transactional  
public final void insertInBulk(final List<Rows> rows) {  
getSqlMapClientTemplate().execute(new SqlMapClientCallback<Object>() {  
    public Object doInSqlMapClient(  
        SqlMapExecutor exe) throws SQLException {  
            executor.startBatch();  
            for (Rows row : rows) {  
                for (Object row : row.getMultiRows()) {  
                    exe.insert("##TEMPTABLE.insert", row);  
                }  
            }  
            exe.executeBatch();  
            return null;  
     }});  

}

public void copyValuesToActualTable() {  
    final Map<String, Object> procInput = new HashMap<String, Object>();  
    procInputMap.put("tableName", "MYTABLE");  
    getSqlMapClientTemplate().queryForObject("##TEMPTABLE.NAME", procInput);  
}  

Я думаю о дальнейшем улучшении дизайна, создав временную таблицу только один раз при инициализации соединения и вместо того, чтобы отбрасывать обрезать таблицу, но одну на потом, и у меня все еще будут проблемы с шагами 3 и 4. Причина временной таблицы в том, что у меня нет доступа ( разрешение) для прямого изменения фактической таблицы, но через временную таблицу.


person ajay rathod    schedule 25.08.2012    source источник
comment
Исправление ошибок в исходном коде   -  person Roman C    schedule 25.08.2012


Ответы (1)


На самом деле я бы создал временную таблицу (шаг 2) в основном потоке, а затем разбил бы рабочую нагрузку по вставке записей во временную таблицу (шаги 3 и 4) на фрагменты и создал поток для каждого фрагмента.

JDK 7 предоставляет ForkJoin для этого шага, который может вас заинтересовать. .

После завершения вставки во временную и фактическую таблицы снова удалите временную таблицу в основном потоке.

Таким образом, вам не нужно следить за тем, чтобы везде использовалось одно и то же соединение. Вы можете использовать разные объекты подключения к одной и той же базе данных и выполнять шаги 3 и 4 параллельно.

Надеюсь это поможет.

person Vikdor    schedule 25.08.2012