Множественная вставка ScalikeJdbc

Как выполнить несколько вставок в одной транзакции?

  def insertData(dataList: List[Data])(implicit session: DBSession = autoSession) = {

    // todo: this is probably opening and closing a connection every time?
    dataList.foreach(data => insertData(data))
  }

  def insertData(data: Data) = withSQL {
    val t = DataTable.column
    insert.into(DataTable).namedValues(
      d.name -> data.name,
      d.title -> data.title
    )
  }.update().apply()

Было бы неэффективно иметь разные транзакции для каждой вставки, если их число исчисляется тысячами и выше.

http://scalikejdbc.org/documentation/operations.html


person BAR    schedule 01.07.2015    source источник


Ответы (1)


Измените свой метод insertData следующим образом:

def insertData(data: Data)(implicit session: DBSession = AutoSession) = withSQL {
  val t = DataTable.column
  insert.into(DataTable).namedValues(
    d.name -> data.name,
    d.title -> data.title
  )
}.update().apply()

А затем используйте DB.localTx:

DB.localTx { implicit s =>
  dataList.foreach(data => insertData(data))
}
person Kazuhiro Sera    schedule 27.07.2015
comment
Таким образом, это будет выполнять одну транзакцию, в отличие от моей, которая будет создавать одну транзакцию для каждой вставки? - person BAR; 27.07.2015
comment
Да, принятие DBSession в качестве неявного параметра позволяет операциям присоединиться к одной и той же транзакции. - person Kazuhiro Sera; 13.08.2015
comment
Нужен ли блок DB.localTx? - person BAR; 20.08.2015
comment
Да, если вам нужно выполнить операции в рамках одной транзакции. - person Kazuhiro Sera; 20.08.2015
comment
Разве это не выполнит вставку dataList.length() раз? - person Kakaji; 04.07.2017
comment
@KazuhiroSera Я был бы очень признателен за ответ на вопрос @kakaji — не будет ли это выполнять вставку dataList.length() раз? - person Hagai; 09.07.2019