【发布时间】:2012-03-06 10:39:07
【问题描述】:
我的 WCF 服务需要检查现在是否可用连接,我们可以使用它吗?我们有很多远程数据库。它们的连接有时很奇怪,不能用于查询数据或其他东西。 因此,例如,这是使用的常规连接字符串:
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 DB 进行通信。 希望得到你的帮助,伙计们!提前致谢!
【问题讨论】:
-
如果您询问如何确定您的 Oracle 连接字符串是否有效,请尝试连接它,如果失败则无效。如果您有其他问题,您可能应该在 question 中加入一个问题。
-
@M.Babcock 问题是您提出的连接检查非常慢,不能用于快速检查。顺便说一句,问题在问题的标题中。
-
我一定错过了问号。如果您想要一种轻量级的方法来预先检查服务器是否存在,请打开与其端口的 telnet 连接。
-
@M.Babcock 这种方式是否足够强大以检查连接?它比 Eric J. 提供的更快吗?
-
如果目标是查看服务器是否可用,那么它通常就足够了。除了知道有 something 正在监听端口(虽然 Oracle 端口是众所周知的)并且绝对会更快之外,它不提供任何保证。能够告诉用户他们的连接字符串是错误的就足够了(如果那是你所追求的)。为您的问题提供一些背景信息,我会告诉您这是否足够。
标签: c# .net oracle database-connection devart