Я использую Apache dbcp для пула соединений и ibatis для выполнения транзакций базы данных с поддержкой Spring. Сценарий, который я пытаюсь тренировать:
создать BasicDataSource с максимальным начальным подключением как 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. Причина временной таблицы в том, что у меня нет доступа ( разрешение) для прямого изменения фактической таблицы, но через временную таблицу.