当应用程序尝试连接到数据库服务器并检索某些数据时,它有时会引发异常,并且即使处理了expcetion,它似乎也会留下死线程。因此,大约有300个线程可以降低服务质量。
以下是定时调用的代码:
Parallel.ForEach(dbs, pair =>
{
db l = pair.Value;
if (String.IsNullOrEmpty(l.city))
l.city = l.configCity;
using (OracleConnection conn = new OracleConnection(l.connString))
{
try
{
conn.Open();
}
catch (Exception exc)
{
Console.WriteLine(String.Format("({0}, {1}): {2}{3}", l.connAlias, l.lid, exc.Message, Environment.NewLine));
}
try
{
if ((conn != null) && (conn.State == ConnectionState.Open))
{
// This method just call stored procedure and then set received data to 'l' object
if (!DbConnection.SetBadicData(conn, ref l))
{
Console.WriteLine(String.Format("Couldn't refresh basic data on ({0}, {1})", l.connAlias, l.id));
}
// This method also just call procedure and set received data to object
if (!DbConnection.SetExtendedData(conn, ref l))
{
Console.WriteLine(String.Format("Couldn't refresh advanced data on ({0}, {1})", l.connAlias, l.lid));
}
}
}
catch (Exception exc)
{
Console.WriteLine(String.Format("({0}, {1}): {2}{3}", l.connAlias, l.lid, exc.Message, Environment.NewLine));
}
}
});
例外情况是:
用于连接数据库的组件是devArt dotConnect for Oracle。
我该如何管理它? BeginConnect
然后被EndConnect
强行突破会有帮助吗?
答案 0 :(得分:1)
获取固定库: - )
但是说真的。如果你有一个你必须使用的第三方库,不能改变它,哪个是错误的,我看到的唯一方法是在一个单独的AppDomain中运行它。域之间的通信比调用方法更困难,但仍然相对容易。例如,您可以使用WCF服务(使用命名管道)进行通信。
一旦您的代码在单独的AppDomain中处理讨厌的库,您就可以定期或在其他条件下回收(销毁和重新创建)该域。这会杀掉所有悬挂的线程,未发布的对象等。
这是一种解决方法类型的解决方案,但它应该至少为您提供一种方法。