Поймать исключения тайм-аута Oracle - PullRequest
0 голосов
/ 08 февраля 2012

Я хочу обрабатывать исключения тайм-аута иначе, чем другие исключения SQL, очень похоже на Как перехватить исключения тайм-аута SQLServer

Однако наше приложение поддерживает как Oracle, так и MSSqlserver.

В идеале решение должно охватывать обоих провайдеров: System.Data.OracleClient и Oracle.DataAccess.Client.

Каковы коды ошибок для исключений, которые они генерируют?

Ответы [ 2 ]

0 голосов
/ 21 января 2014

Это то, чем я закончил, было похоже на это:

Однако код ошибки для TimeOut, похоже, равен 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, поэтому я использовал это вместо этого.

0 голосов
/ 09 февраля 2012

Использование void setQueryTimeout (int секунд) выдает SQLException; может работать;но это может вызвать создание потока для каждого sql, выполняемого с драйвером jdbc Oracle, поэтому используйте его с осторожностью.

/**
 * 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...