Не удается подключиться к базе данных после перезапуска с помощью oracle.jdbc.{Соединение с оракулом}

#oracle #scala #jdbc

Вопрос:

В настоящее время я работаю над проектом Scala. Эта программа может работать нормально, но когда эта программа выполняется во время перезапуска базы данных, она выдает ошибку, которая в основном означает, что она не может подключиться к базе данных (если я прав).

Я уже указал на проблему, отладив ее, и проблема, похоже, возникает при выполнении этой строки:

 rs = psmt.executeQuery()  // error happens here
 

Вот весь код: ОТРЕДАКТИРОВАНО

 def SomeNameOfDef2(sql: String, paramList: List[String]): immutable.HashMap[String, String] = {
    CallConn   //Open Connection

    var ret = immutable.HashMap[String, String]()
    val psmt = con.prepareStatement(sql)
    var rs: ResultSet = null
    var ErrorChecker : String = "" //NEW FLAG HERE
    try {
      var i = 0
      for (p <- paramList ){
        i  = 1
        psmt.setString(i, p)
      }
//NEW WHILE LOOP METHOD IN FINALLY CLAUSE, IF ERROR WAS ENCOUNTERED AT FIRST TRY   
if (psmt != null amp;amp; !psmt.isClosed()){
        try {
          ErrorChecker = "FALSE"

          rs = psmt.executeQuery()

        }catch {
            case e: Throwable =>

            ErrorChecker = "TRUE"
        }finally {
          while (ErrorChecker == "TRUE"){
            try {
              ErrorChecker = "FALSE"
              CallConn
              rs = psmt.executeQuery()
            }catch {
              case e: Throwable =>

              ErrorChecker = "TRUE"
            }finally {
              if (ErrorChecker == "TRUE"){
                //DO NOTHIING CONTINUE WHILE LOOP
              }else {
                ErrorChecker = "FALSE"
              }
            }
          }
        }
      }

      if (rs != null amp;amp; !rs.isClosed() amp;amp; rs.next)
        for (col <- 1 to rs.getMetaData.getColumnCount )
          ret  = rs.getMetaData.getColumnLabel(col).toLowerCase -> rs.getString( col )
    } finally{
      try {
        rs.close()
      } catch {
      case e: Throwable =>
        log.error(e,"Error encountered here1")
      }
      try {
        psmt.close()
      } catch {
        case e: Throwable =>
          log.error(e,"Error encountered here2")
      }
    }
    ret
  }
 

Ошибка, вызванная:

 [05-08-2021,14:32:20.500] - RECONNECTION_ATTEMPT_INTERVAL is missing, defaulting to 1000ms
[05-08-2021,14:32:21.515] - java.sql.SQLException: ORA-28547: connection to server failed, probable Oracle Net admin error

[05-08-2021,14:32:21.515] - RECONNECTION_ATTEMPT_INTERVAL is missing, defaulting to 1000ms
[05-08-2021,14:32:22.531] - java.sql.SQLException: ORA-28547: connection to server failed, probable Oracle Net admin error

[05-08-2021,14:32:22.531] - RECONNECTION_ATTEMPT_INTERVAL is missing, defaulting to 1000ms
[05-08-2021,14:32:23.562] - java.sql.SQLException: ORA-28547: connection to server failed, probable Oracle Net admin error

[05-08-2021,14:32:23.562] - RECONNECTION_ATTEMPT_INTERVAL is missing, defaulting to 1000ms
[05-08-2021,14:32:24.593] - java.sql.SQLException: ORA-28547: connection to server failed, probable Oracle Net admin error

[05-08-2021,14:32:24.593] - RECONNECTION_ATTEMPT_INTERVAL is missing, defaulting to 1000ms
[05-08-2021,14:32:25.625] - java.sql.SQLException: ORA-28547: connection to server failed, probable Oracle Net admin error

[05-08-2021,14:32:25.625] - RECONNECTION_ATTEMPT_INTERVAL is missing, defaulting to 1000ms
[05-08-2021,14:32:26.656] - java.sql.SQLException: ORA-28547: connection to server failed, probable Oracle Net admin error

[05-08-2021,14:32:26.656] - RECONNECTION_ATTEMPT_INTERVAL is missing, defaulting to 1000ms
[05-08-2021,14:32:27.687] - java.sql.SQLRecoverableException: ORA-01033: ORACLE initialization or shutdown in progress

[05-08-2021,14:32:27.687] - RECONNECTION_ATTEMPT_INTERVAL is missing, defaulting to 1000ms
[05-08-2021,14:32:28.718] - java.sql.SQLRecoverableException: ORA-01033: ORACLE initialization or shutdown in progress

[05-08-2021,14:32:28.718] - RECONNECTION_ATTEMPT_INTERVAL is missing, defaulting to 1000ms
[05-08-2021,14:33:09.140] - Message dequeued [c8d01f19d8bf2c07e053fa2f1fac9c5c] ...
[05-08-2021,14:33:09.156] - @13100164501 has been queued for processing. (1 Queued Processes)
[05-08-2021,14:33:09.156] - Message dequeued [c8d01f1a5a052c05e053fa2f1fac1d87] ...
[05-08-2021,14:33:09.172] - @13100164500 has been queued for processing. (2 Queued Processes)
[05-08-2021,14:33:09.453] - @13100164501 Process moved for processing (1/10). 1 remaining queued processes.
[05-08-2021,14:33:09.453] - Processing message from queue ...
[05-08-2021,14:33:09.515] - All Processes have been executed.
[05-08-2021,14:33:09.593] - QListener - @13100164501 payload received with requestType[900]. . .
    [05-08-2021,14:33:09.593] - DataUnit - Error encountered here1
    java.lang.NullPointerException
        at com.ftsp.xx.reactive.common.BaseDataUnit.SomeNameOfDef2(BaseDataUnit.scala:273)
        at com.ftsp.xx.reactive.common.DataUnit.loadProcLog(DataUnit.scala:261)
        at com.ftsp.xx.reactive.common.DataUnit$anonfun$receive$1.applyOrElse(DataUnit.scala:275)
        at akka.actor.Actor$class.aroundReceive(Actor.scala:517)
        at com.ftsp.xx.reactive.common.BaseDataUnit.aroundReceive(BaseDataUnit.scala:16)
        at akka.actor.ActorCell.receiveMessage(ActorCell.scala:590)
        at akka.actor.ActorCell.invoke(ActorCell.scala:559)
        at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:257)
        at akka.dispatch.Mailbox.run(Mailbox.scala:224)
        at akka.dispatch.Mailbox.exec(Mailbox.scala:234)
        at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
        at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
        at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
        at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
    [05-08-2021,14:33:09.593] - OneForOneStrategy - ORA-03113: end-of-file on communication channel
    Process ID: 26460
    Session ID: 1967 Serial number: 23895
    
    java.sql.SQLRecoverableException: ORA-03113: end-of-file on communication channel
    Process ID: 26460
    Session ID: 1967 Serial number: 23895
    
        at oracle.jdbc.driver.T2CConnection.checkError(T2CConnection.java:777)
        at oracle.jdbc.driver.T2CConnection.checkError(T2CConnection.java:673)
        at oracle.jdbc.driver.T2CPreparedStatement.executeForDescribe(T2CPreparedStatement.java:546)
        at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1175)
        at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1296)
        at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3613)
        at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3657)
        at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1495)
        at com.ftsp.xx.reactive.common.BaseDataUnit.SomeNameOfDef2(BaseDataUnit.scala:264)
        at com.ftsp.xx.reactive.common.DataUnit.loadProcLog(DataUnit.scala:261)
        at com.ftsp.xx.reactive.common.DataUnit$anonfun$receive$1.applyOrElse(DataUnit.scala:275)
        at akka.actor.Actor$class.aroundReceive(Actor.scala:517)
        at com.ftsp.xx.reactive.common.BaseDataUnit.aroundReceive(BaseDataUnit.scala:16)
        at akka.actor.ActorCell.receiveMessage(ActorCell.scala:590)
        at akka.actor.ActorCell.invoke(ActorCell.scala:559)
        at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:257)
        at akka.dispatch.Mailbox.run(Mailbox.scala:224)
        at akka.dispatch.Mailbox.exec(Mailbox.scala:234)
        at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
        at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
        at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
        at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
 

В принципе, я просто хотел, чтобы моя программа работала нормально после перезапуска базы данных.

Комментарии:

1. Ну, связь, которая у него была с базой данных, мертва. Вы должны обработать ошибку, поймав ее и попытавшись создать новое соединение — или просто перезапустить программу при перезапуске базы данных (это то, что не должно происходить слишком часто).

2. Используете ли вы пул соединений? Обычно любая библиотека пула соединений должна обрабатывать это за вас.

3. @ibre5041: Я думаю, что мы используем пул соединений, так как мы импортировали локальную библиотеку, подобную этой: импорт com.ftsp.util.db.OracleDbPool

4. @RealSkeptic: Я пытаюсь найти решение, например, создать цикл while, который пытается вызвать CallConn, чтобы открыть соединение, а затем попытаться выполнить ExecuteQuery( ). но в любом случае, вы знаете лучший метод, пожалуйста, укажите мне, пожалуйста 🙂