#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( ). но в любом случае, вы знаете лучший метод, пожалуйста, укажите мне, пожалуйста 🙂