我正在尝试使用ConnectionInitializationCallback配置UCP PoolDataSourceImpl。这是我的配置:
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 jar:
ojdbc6.jar - v12.1.0.1.0 ucp.jar - v12.1.0.0.0
我已经设法通过删除对" registerConnectionInitializationCallback"的调用来完成这项工作。并通过调用" registerConnectionLabelingCallback"来替换它。但根据我的理解,这将在每次从池请求连接时执行ALTER SESSION,而不是在实际创建它时。
非常感谢任何帮助使ConnectionInitializationCallback正常工作的帮助。
亲切的问候
答案 0 :(得分:0)
ConnectionInitializationCallback机制似乎是12c发布的“Application Continuity”功能的一部分。应用程序连续性要求您使用以下DataSource实现之一:
我没有亲自尝试过,但我猜你是否使用其中一个DataSource实现,你的ConnectionInitializationCallback会起作用。
如果将其作为标准UCP实施的一部分包含在内,那就太好了,就像连接标签一样。