2012-02-17 62 views
1

我正在測試Oracle通用連接池(UCP)11.2.0.1.0版的快速連接故障轉移(FCF)支持。正在嘗試的場景是計劃中斷事件。 Oracle數據庫11g版本11.2.0.2.0標準版是正在使用的數據庫版本。下面是我跟隨在我的測試Oracle UCP - FCF計劃中斷支持

  1. 步驟獲得一個連接並打印連接到
  2. 執行實例「SRVCTL停止實例-d -n」上的一個節點
  3. 執行查詢在第一步中檢索到的連接上。

第三步失敗時出現錯誤(ORA-03113:通信通道上的文件結束),因爲它不應該是一個計劃中斷事件。分析ucp日誌我可以看到,jdbc客戶端接收到FAN事件,並通過將連接狀態標記爲「STATUS_CLOSE_ON_RETURN」進行處理,但仍然使用該借用連接執行查詢失敗。

預期的結果是,在借用連接上執行的任何查詢都會成功並且連接仍然保持有效,直到它返回到池。之後它應該被游泳池關閉。停止實例命令應該不會成功,直到完成。

有什麼我在配置中丟失?上面的srvctl命令是否正確?

甲骨文池配置如下

 


PoolDataSourceImpl pds = new PoolDataSourceImpl(); 
     try { 
      pds.setConnectionPoolName("Connection Pool"); 
      pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource"); 
      pds.setConnectionFactoryProperties(getOracleDataSourceProperties()); 
      pds.setDataSourceName("DataSource"); 
      pds.setServerName(SERVER_NAME); 
      pds.setUser("system"); 
      pds.setPassword("pass"); 
      pds.setPortNumber(1521); 
      pds.setMinPoolSize(0); 
      pds.setMaxPoolSize(25); 
      pds.setMaxIdleTime(1800); 
      pds.setValidateConnectionOnBorrow(true); 
      pds.setONSConfiguration("nodes=v-ind-db-11g-01:6200,v-ind-db-11g-02:6200"); 
      pds.setFastConnectionFailoverEnabled(true); 
      pds.setInactiveConnectionTimeout(20); 
      pds.setConnectionWaitTimeout(20); 
      pds.setPropertyCycle(60); 

      pds.startPool(); 
     } catch (SQLException e) { 
      throw new RuntimeException("Cannot create project datasource", e); 
     } 

     ....... 
     Properties getOracleDataSourceProperties() { 
      Properties p = new Properties(); 
      p.put("driverType", "oci"); 
      p.put("networkProtocol", "tcp"); 
      p.put("serviceName", SERVICE_NAME); 
      return p; 
     } 
 

回答

1

如果你做一個SHUTDOWN NORMAL,然後完成交易你,你的應用程序優雅地繼續下去嗎?

Looks likesrvctl stop instance -d XXX -n YYY -o normal應該這樣做。

This thread建議srvctl的默認關閉方法是「立即」,這將解釋你所看到的。

1

我能有兩個變化

  1. 創建一個新的服務來測試FCF的UCP的支持。在初始嘗試中使用的服務是默認服務,FCF功能不支持默認服務,如註釋中所述的here

  2. 停止服務而不是實例。停止實例將模擬意外中斷,而不是計劃中的中斷。