捕获Oracle超时异常

时间:2012-02-08 10:48:00

标签: .net database oracle timeout

我希望以与其他SQL异常不同的方式处理超时异常,就像 How to catch SQLServer timeout exceptions

但是,我们的应用程序支持Oracle和MSSqlserver。

该解决方案最好涵盖两个提供程序:System.Data.OracleClient和Oracle.DataAccess.Client。

这些异常的错误代码是什么?

2 个答案:

答案 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程序集有一个硬引用,所以我改用了它。