Oracle DB挂起来自Spark和Java的最后一个请求

vsaztqbk  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(103)

请帮帮忙,我很无助。
我使用Spark和ojdbc 8 -12.2.0.1驱动程序从Oracle读取数据。
将提取大小设置为5000。一切都运行良好,直到最后一刻,以获得最后一批5000记录和过程只是挂起。
我还尝试使用Scala和ojdbc 11:23.2.0.0库实现简单的阅读器。
同样的事情。无论我设置了什么样的提取大小,一切都很好,直到最后一段数据,Oracle DB根本没有响应。
例如:我查询一个包含499条记录的数据子集,我将获取大小设置为100,我收到了前400条记录,但最后99条记录的请求挂起而没有响应。
我尝试在Scala代码中使用Connection. setNetworkServer来中断连接,如果Oracle在过去10秒内没有响应。事实上,Oracle没有对最后一个请求做出回应。
可能是什么原因呢?

gajydyqb

gajydyqb1#

我无法解释客户端驱动程序库的奇怪行为,但我知道问题的原因:
Oracle DB表SampleTable,列batch_id VARCHAR2(10)。
当发送带有使用数值的过滤器的查询时,问题再次出现。例如:

SELECT * FROM SampleTable WHERE batch_id = 10

假设有25条记录,我们的提取大小是10,我们将收到20条记录,然后进程挂起。
如果我们将request改为使用正确的条件类型string而不是number,那么问题就消失了:

SELECT * FROM SampleTable WHERE batch_id = '10'

现在我们可以毫无问题地获取所有25条记录。
以下是Scala示例代码:

package com.sample

import java.sql.Connection
import oracle.jdbc.pool.OracleDataSource

object App {
  
  def main(args : Array[String]) {
    val query = "SELECT * FROM SampleTable WHERE batch_id = '10'"
    // Failing query: "SELECT * FROM SampleTable WHERE batch_id = 10"

    val ods = new OracleDataSource()
    ods.setURL("jdbc:oracle:thin:@//{oracle_db_host}:{port}/{database}")
    ods.setUser("username")
    ods.setPassword("password")

    val connection = ods.getConnection()
    val statement = connection.createStatement()

    statement.setFetchSize(10)

    val resultSet : java.sql.ResultSet = statement.executeQuery(query)
    resultSet.next()

    var num = 0
    do {
      num += 1
      println("Record number: " + num)
    } while (resultSet.next)
  }
}

使用Maven dependecy构建:

<dependency>
   <groupId>com.oracle.database.jdbc</groupId>
   <artifactId>ojdbc11</artifactId>
   <version>23.2.0.0</version>
</dependency>

相关问题