在飞行中更改Spring bean属性

时间:2015-06-15 08:30:03

标签: java spring

我遇到了以下问题。 2 dbs有2个数据源:current(A)和Stand(B)。如果A没有响应,我会尝试连接B.

这就是我的表现。

  • 拦截器检查连接是否错误
  • 如果出现问题,Interceptor将交换数据源URL

数据源是Spring bean。所以我在飞行中更改了Spring bean属性。这可以吗?看一下代码:

@Autowired
@Qualifier("dataSourceMain")
private oracle.jdbc.pool.OracleDataSource dsMain;

@Autowired
@Qualifier("dataSourceStandBy")
private oracle.jdbc.pool.OracleDataSource dsStandBy;

public void swapURL() {
    try {
        String dsMainURL = dsMain.getURL();
        dsMain.setURL(dsStandBy.getURL());
        dsStandBy.setURL(dsMainURL);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

我可以看到,我的代码有效,但我不知道它是否采用了良好的方法。

2 个答案:

答案 0 :(得分:2)

你能检查一下这是否解决了你的问题?看起来像一个类似的问题

dynamically change Spring data source

这似乎是以更优雅的方式完成的

答案 1 :(得分:2)

如果您的数据源是池,那么它们将有一个等待使用或重新使用的连接池。根据您的汇集策略,您的代码可能无效,因为您没有告诉数据源驱逐使用旧URL的现有池连接。

总的来说,我建议您使用AbstractRoutingDataSource安全地交换数据源。见这里

How to make safe frequent DataSource switches for AbstractRoutingDataSource?