2012-02-08 57 views

回答

0

这是我结束了类似于此: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程序集,所以我用它来代替。

0

使用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; 
+0

我不是在Java中,并且设置超时不是问题。问题是对超时作出反应。 – 2012-02-09 09:40:22

+0

很抱歉,我的错,我没有注意到.Net部分 – gokhant 2012-02-11 03:35:27