2014-04-08 42 views
0

我正在嘗試使用ConnectionInitializationCallback配置UCP PoolDataSourceImpl。這是我的配置:UCP PoolDataSourceImpl with ConnectionInitializationCallback

private static DataSource createDataSource(Properties properties) throws SQLException, UniversalConnectionPoolException { 
    UniversalConnectionPoolManager ucpm  = UniversalConnectionPoolManagerImpl.getUniversalConnectionPoolManager(); 
    PoolDataSource     pds   = PoolDataSourceFactory.getPoolDataSource(); 
    final String     editionName = properties.getProperty("jdbc.editionName", "ora$base"); 

    pds.registerConnectionInitializationCallback(new oracle.ucp.jdbc.ConnectionInitializationCallback() { 
     public void initialize(Connection connection) throws SQLException { 
      LOG.debug("Attempting to set edition to: {}", editionName); 
      try (Statement statement = connection.createStatement()) { 
       statement.executeUpdate("ALTER SESSION SET EDITION = " + editionName); 
      } 
      LOG.debug("Edition set to: {}", editionName); 
     } 
    }); 

    pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource"); 
    pds.setUser(properties.getProperty("jdbc.username")); 
    pds.setPassword(properties.getProperty("jdbc.password")); 
    pds.setURL(properties.getProperty("jdbc.url")); 
    pds.setConnectionPoolName("demo-pool"); 
    pds.setInitialPoolSize(3); 
    pds.setMaxPoolSize(3); 
    pds.setValidateConnectionOnBorrow(true); 

    LOG.debug("Created DataSource Pool"); 
    ucpm.createConnectionPool((UniversalConnectionPoolAdapter)pds); 
    ucpm.startConnectionPool("demo-pool"); 

    return pds; 
} 

但是initialize方法從來沒有被調用過。我用java 1.7.0_51具有以下Oracle罐子:

ojdbc6.jar - v12.1.0.1.0 ucp.jar - v12.1.0.0.0

我設法使這項工作通過去除調用「registerConnectionInitializationCallback」並用「registerConnectionLabelingCallback」調用替換它,但是從我的理解中可以看出,每次從池中請求連接時都會執行ALTER SESSION,而不是在實際創建時進行連接。

獲得ConnectionInitializationCallback工作的任何幫助將不勝感激。

親切的問候

回答

0

的ConnectionInitializationCallback機制似乎與12C發佈的「Application Continuity」功能的一部分。應用連續性要求您使用以下數據源的實現方式之一:

  • oracle.jdbc.replay.OracleDataSourceImpl
  • oracle.jdbc.replay.OracleConnectionPoolDataSourceImpl

我還沒有嘗試過爲自己,但我猜如果你使用這些DataSource實現之一,你的ConnectionInitializationCallback將工作。

如果將它作爲標準UCP實現的一部分包含在內,那就好了,就像連接標籤一樣。