我希望以与其他SQL异常不同的方式处理超时异常,就像 How to catch SQLServer timeout exceptions
但是,我们的应用程序支持Oracle和MSSqlserver。
该解决方案最好涵盖两个提供程序:System.Data.OracleClient和Oracle.DataAccess.Client。
这些异常的错误代码是什么?
答案 0 :(得分:0)
使用 void setQueryTimeout(int seconds)抛出SQLException; 可能会起作用;但它可能导致为使用Oracle jdbc驱动程序执行的每个sql创建线程,因此请谨慎使用。
/**
* Sets the number of seconds the driver will wait for a
* <code>Statement</code> object to execute to the given number of seconds.
* If the limit is exceeded, an <code>SQLException</code> is thrown. A JDBC
* driver must apply this limit to the <code>execute</code>,
* <code>executeQuery</code> and <code>executeUpdate</code> methods. JDBC driver
* implementations may also apply this limit to <code>ResultSet</code> methods
* (consult your driver vendor documentation for details).
*
* @param seconds the new query timeout limit in seconds; zero means
* there is no limit
* @exception SQLException if a database access error occurs,
* this method is called on a closed <code>Statement</code>
* or the condition seconds >= 0 is not satisfied
* @see #getQueryTimeout
*/
void setQueryTimeout(int seconds) throws SQLException;
答案 1 :(得分:0)
我最终得到的结果与此类似:
但是,TimeOut的errorCode似乎是 01013
/// <summary>
/// Catches network problems for oracle connections and clears the session pool of invalid connections
/// </summary>
/// <param name="ex"></param>
/// <param name="triedBefore"></param>
/// <returns></returns>
private bool reconnectOracle(DbException ex)
{
var exType = ex.GetType();
if (exType.FullName == "Oracle.DataAccess.Client.OracleException")
{
dynamic exOra = ex;
int errorNo = exOra.Number;
// Check for oracle network error numbers
if (errorNo == 03113 ||
errorNo == 03114 ||
errorNo == 03135) // **Timeout seems to be 01013**
{
AL.Warn("Connection is broken. Error number: {0}. Attempting reconnect.", errorNo);
// Network error, close connection
Command.Connection.Close();
// All connections in the pool are probably invalid. Ensure that all connections are cleared
dynamic con = new StaticMembersDynamicWrapper(Command.Connection.GetType());
con.ClearAllPools();
// Ensure that new connection object is given
Command.Connection = null;
return true;
}
}
return false;
}
StaticMembersDynamicWrapper,如:http://blogs.msdn.com/b/davidebb/archive/2009/10/23/using-c-dynamic-to-call-static-members.aspx
中所述我不想对Oracle程序集有一个硬引用,所以我改用了它。