在功能Scala代码使用JDBC PreparedStatement.addBatch(Using

2019-09-23 01:49发布

我需要从一个数据库中读取几百万行,并将其写入到另一个。 我想用PreparedStatement.addBatch做到大批量(也许1000行)写入。 我并不需要他们的交易。 我写在斯卡拉2.9.2我的代码。

这样做的一个方法如下:

val sourceResultSet = ...
val targetStatement = targetConnection.prepareStatement(...)
var rowCount = 0
while (sourceResultSet.next()) {
  // Read values from sourceResultSet and write them to targetStatement
  targetStatement.addBatch()
  rowCount += 1
  if (rowCount % 1000 == 0) {
    targetStatement.executeBatch()
    rowCount = 0
  }
}

我怎么能做到这一点的一个功能更强大的方式,不使用var rowCount ? 我还需要考虑RAM的使用; 我读几百万行,因此任何解决方案,涉及都在同一时间在内存中源行的将失败。

Answer 1:

什么类型sourceResultSet ? 我根据您的使用情况假设一个Iterator /流,但无论哪种方式,你可以使用Scala的集合的take一次抢1000元(这适用于列表,集合迭代器,流等)。 要做到这一点更多的功能(尽管副作用的而已,所以不是纯粹的功能性),定义一个内联函数:

def processSource(sourceResultSet: Iterator): Unit = {
  if(sourceResultSet.hasNext) {
    sourceResultSet.take(1000).foreach(row => /* Add to batch */)
    targetStatement.executeBatch()
    processResult(sourceResultSet) // How you handle the recursion depends on what sourceResultSet is
  }
}

val sourceResultSet = ...
val targetStatement = targetConnection.prepareStatement(...)
processSource(sourceResultSet)

只要sourceResultSet是懒惰(流或迭代),这将避免它加载到内存在一次。



文章来源: Using JDBC PreparedStatement.addBatch in functional Scala code