From 0d1b99e3eee62fc3a6cee6c691d69401de1a4657 Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Wed, 6 May 2026 14:29:22 +0800 Subject: [PATCH] fix(oracle): auto-reconnect on closed connection and add debug logging Detect closed Oracle connections in get_or_create_pool and automatically reconnect instead of failing all subsequent operations. Add debug/error logging to Oracle driver for easier troubleshooting. --- crates/dbx-core/src/connection.rs | 17 ++++++++++++++-- crates/dbx-core/src/db/oracle_driver.rs | 26 ++++++++++++++++++++----- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/crates/dbx-core/src/connection.rs b/crates/dbx-core/src/connection.rs index 1c5a2983f..f9923c049 100644 --- a/crates/dbx-core/src/connection.rs +++ b/crates/dbx-core/src/connection.rs @@ -72,9 +72,22 @@ impl AppState { let conns = self.connections.lock().await; if conns.contains_key(&pool_key) { - return Ok(pool_key); + if let Some(PoolKind::Oracle(client)) = conns.get(&pool_key) { + let conn = client.lock().await; + if conn.is_closed() { + drop(conn); + drop(conns); + log::info!("[oracle] connection closed, reconnecting..."); + self.connections.lock().await.remove(&pool_key); + } else { + return Ok(pool_key); + } + } else { + return Ok(pool_key); + } + } else { + drop(conns); } - drop(conns); let configs = self.configs.lock().await; let config = configs.get(connection_id).ok_or("Connection config not found")?.clone(); diff --git a/crates/dbx-core/src/db/oracle_driver.rs b/crates/dbx-core/src/db/oracle_driver.rs index d94b6f2e4..a998bbb42 100644 --- a/crates/dbx-core/src/db/oracle_driver.rs +++ b/crates/dbx-core/src/db/oracle_driver.rs @@ -1,3 +1,4 @@ +use log; use oracle_rs::{Config, Connection}; use std::time::Instant; @@ -37,8 +38,11 @@ fn value_to_json(val: &oracle_rs::Value) -> serde_json::Value { } pub async fn list_databases(conn: &OracleClient) -> Result, String> { - let result = - conn.query("SELECT username FROM all_users ORDER BY username", &[]).await.map_err(|e| e.to_string())?; + log::debug!("[oracle] list_databases: querying all_users"); + let result = conn.query("SELECT username FROM all_users ORDER BY username", &[]).await.map_err(|e| { + log::error!("[oracle] list_databases failed: {e}"); + e.to_string() + })?; Ok(result.rows.iter().map(|row| DatabaseInfo { name: row.get_string(0).unwrap_or("").to_string() }).collect()) } @@ -56,7 +60,11 @@ pub async fn list_tables(conn: &OracleClient, schema: &str) -> Result Result Result, String> { + log::debug!("[oracle] get_columns: schema={schema}, table={table}"); let s = schema.replace('\'', "''"); let t = table.replace('\'', "''"); @@ -81,7 +90,10 @@ pub async fn get_columns(conn: &OracleClient, schema: &str, table: &str) -> Resu &[], ) .await - .map_err(|e| e.to_string())?; + .map_err(|e| { + log::error!("[oracle] get_columns pk query failed: {e}"); + e.to_string() + })?; let pk_names: std::collections::HashSet = pk_result.rows.iter().filter_map(|row| row.get_string(0).map(|s| s.to_string())).collect(); @@ -229,6 +241,7 @@ pub async fn execute_query(conn: &OracleClient, sql: &str) -> Result Result = result.columns.iter().map(|c| c.name.clone()).collect(); let rows: Vec> = result .rows