У меня есть подпружиненный пакет с потоками, шагами, считывателями, процессорами, записывающими устройствами, который копирует данные из одного источника БД в другой (являющийся БД Oracle). Пакет работает отлично и быстро с несколькими миллионами данных. Теперь я хочу использовать этот же точный метод ниже для записи тех же данных в БД PostgreSQL, поэтому вызов метода getSessionFactory()
возвращает соответствующую фабрику сеансов в зависимости от моих потребностей. Но проблема в том, что, кажется, ничего не происходит, или это ненормально очень долго.
Я хотел бы знать, почему существует такая разница. Есть ли какое-то ограничение на количество вставок, которые мы можем выполнять параллельно с PostgreSQL? Или что-то не так с этим кодом?
public void myMethod(List<MyObject> list) {
SessionFactory sessionFactory = getSessionFactory();
sessionFactory.getCurrentSession().doWork(connection -> {
StringBuilder stringBuilder = new StringBuilder("INSERT INTO \"SOME_TABLE\" (\"ID\", \"SOME_COLUMN\", \"UPDATED_AT\") VALUES (?, ?, ?)");
try (PreparedStatement preparedStatement = connection.prepareStatement(stringBuilder.toString())) {
int i = 0;
for (MyObject myObject : list) {
preparedStatement.setBigDecimal(1, new BigDecimal(myObject.getId()));
preparedStatement.setBigDecimal(2, new BigDecimal(myObject.getSomeColumnValue()));
preparedStatement.setDate(3, new Date(System.currentTimeMillis()));
preparedStatement.addBatch();
if (++i % 500000 == 0 || i == list.size()) {
preparedStatement.executeBatch();
}
}
}
});
}