@SqlBatch делает несколько вставок в jdbi sql object API

public interface UserDBDao {
    @SqlBatch ("INSERT INTO user (id, name) VALUES (:user.id, :user.name)")
    void createAllUsers(@BindBean("user") List<User> users);
}

Когда я пытаюсь вставить несколько строк, используя описанный выше метод, даже после использования @SqlBatch он выполняет несколько запросов на вставку. Журнал Sql выглядит следующим образом

2019-12-18T09:33:41.375486Z    22 Query SET autocommit=0
2019-12-18T09:33:41.376469Z    22 Query SELECT @@session.transaction_read_only
2019-12-18T09:33:41.376791Z    22 Query INSERT INTO user (id, name) VALUES (1000, 'a0')
2019-12-18T09:33:41.377059Z    22 Query INSERT INTO user (id, name) VALUES (1001, 'a1')
2019-12-18T09:33:41.377248Z    22 Query INSERT INTO user (id, name) VALUES (1002, 'a2')
2019-12-18T09:33:41.377427Z    22 Query INSERT INTO user (id, name) VALUES (1003, 'a3')
2019-12-18T09:33:41.377618Z    22 Query commit
2019-12-18T09:33:41.377903Z    22 Query SET autocommit=1

Как вставить все записи одним нажатием?


person Abhishek N    schedule 18.12.2019    source источник


Ответы (1)


Как вы можете видеть из журнала, он открывает транзакцию и делает это за один раз. Так что в основном вы все равно добиваетесь «одного нажатия». К сожалению, вы не можете объединить несколько вставок в одну, если вы не хотите делать это самостоятельно с помощью прямых запросов JDBC или расширения *Dialect.

person Alexey    schedule 18.12.2019
comment
Привет, @Alexey, спасибо за ответ. Есть ли разница между 1. открытием транзакции и ее отправкой с использованием нескольких операторов и 2. использованием одного оператора вставки с точки зрения времени и ресурсов. - person Abhishek N; 18.12.2019
comment
Привет. Если у вас стабильное соединение с базой данных с низким пингом, разницы почти нет. Если это не станет вашим виновником, я бы не пошел на оптимизацию, так как это потребует больше усилий по сравнению с результатом, который вы получите. - person Alexey; 18.12.2019
comment
Таким образом, с помощью @SqlBatch мое приложение dropwizard откроет одно соединение, передаст все данные и закроет его правильно. Он не будет открывать соединение для каждой вставки и закрывать его правильно. Я прав? - person Abhishek N; 18.12.2019
comment
Да, это правда. Транзакции живут внутри одного соединения, если dropwizard закрывает соединение после каждого запроса, транзакция будет потеряна. - person Alexey; 18.12.2019