我想从其他SQL异常不同的方式处理超时异常,就像 How to catch SQLServer timeout exceptions赶上甲骨文超时异常
然而,我们的应用程序支持Oracle和MSSQLSERVER。
该解决方案将涵盖两个提供者:System.Data.OracleClient和Oracle.DataAccess.Client。
那些抛出异常的错误代码是什么?
我想从其他SQL异常不同的方式处理超时异常,就像 How to catch SQLServer timeout exceptions赶上甲骨文超时异常
然而,我们的应用程序支持Oracle和MSSQLSERVER。
该解决方案将涵盖两个提供者:System.Data.OracleClient和Oracle.DataAccess.Client。
那些抛出异常的错误代码是什么?
这是我结束了类似于此:http://blogs.msdn.com/b/davidebb/archive/2009/10/23/using-c-dynamic-to-call-static-members.aspx
:然而,对于超时的errorCode似乎
/// <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在解释
我不想强烈地参考Oracle程序集,所以我用它来代替。
使用void setQueryTimeout(int seconds)throws 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;
我不是在Java中,并且设置超时不是问题。问题是对超时作出反应。 – 2012-02-09 09:40:22
很抱歉,我的错,我没有注意到.Net部分 – gokhant 2012-02-11 03:35:27