验证oracle数据库连接的一些棘手的快速方法
本文关键字:方法 oracle 数据库连接 验证 | 更新日期: 2023-09-27 18:24:51
我的WCF服务现在需要检查连接是否可用,我们可以使用它吗?我们有很多远程dbs。它们的连接有时很奇怪,不能用于查询数据或smth。例如,这是使用的常规连接字符串:
User Id=user;Password=P@ssw0rd;Data Source=NVDB1;Connection Timeout=30
这是服务方法,用于获取
public List<string> GetAliveDBs(string city)
{
if (String.IsNullOrEmpty(city))
return null;
List<string> cityDbs = (from l in alldbs where !String.IsNullOrEmpty(l.Value.city) && l.Value.city.ToUpper() == city.ToUpper() select l.Value.connString).ToList();
// There is no such city databases
if (cityDbs.Count == 0)
return null;
ReaderWriterLockSlim locker = new ReaderWriterLockSlim();
Parallel.ForEach(cityDbs, p =>
{
if (!IsConnectionActive(p.connString))
{
locker.EnterWriteLock();
try
{
cityDbs.RemoveAt(cityDbs.IndexOf(p));
}
finally
{
locker.ExitWriteLock();
}
}
});
return cityDbs;
}
static public bool IsConnectionAlive(string connectionString)
{
using (OracleConnection c = new OracleConnection(connectionString))
{
try
{
c.Open();
if ((c.State == ConnectionState.Open) && (c.Ping()))
return true;
else
return false;
}
catch (Exception exc)
{
return false;
}
}
}
我使用devart组件与Oracle数据库进行通信。希望你们的帮助,伙计们!提前感谢!
试着只执行一个非常低成本的操作,无论你连接到什么模式,都应该有效,例如
选择1个
(该语句适用于MS SQL和MySQL…应该也适用于Oracle,但我无法确认)。
如果您得到了预期的结果(在本例中是一行一列,包含"1"),则连接是有效的。
至少有一个连接池管理器使用此策略定期验证连接。
更新:
这是您的方法的SQL Server版本。您可以将"Sql"替换为"Oracle"。
static public bool IsConnectionAlive(string connectionString)
{
try
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("SELECT 1", conn))
{
int result = (int)cmd.ExecuteScalar();
return (result == 1);
}
}
}
catch (Exception ex)
{
// You need to decide what to do here... e.g. does a malformed connection string mean the "connection isn't alive"?
// Maybe return false, maybe log the error and re-throw the exception?
throw;
}
}
如果目标是简单地确定服务器是否位于IP地址或主机名,那么我建议Ping(没有3路握手,开销比UDP消息小)。您可以使用System.Net.NetworkInformation.Ping
类(有关示例,请参阅其文档)来执行此操作。
如果您想证明在公共Oracle端口上确实存在侦听,我建议使用System.Net.Sockets.TcpClient
或System.Net.Sockets.Socket
类(他们的文档也提供了示例)来提供这一点。
到目前为止,最简单的方法是使用Oracle API for C#打开连接。这里有一个包含代码的非常好的教程。它涵盖的不仅仅是连接,但你应该能够从其余部分中剥离连接部分,以满足你的需求。
Oracle有专门用于帮助维护高可用性的产品和软件,可以通过连接字符串上名为HA Events=true
的设置从连接池中删除死连接。您的Oracle DBA需要确定您的安装是否支持它。