Java 如何允许Tomcat连接到多个数据库?

Java 如何允许Tomcat连接到多个数据库?,java,database,oracle,tomcat,datasource,Java,Database,Oracle,Tomcat,Datasource,我们有两个具有相同数据的生产数据库,一个tomcat服务器当前将连接到其中一个以提供Web服务 生产数据库将一次更新一次(这需要相当长的时间)。因此,为了尽量减少停机时间,我们必须在运行更新时手动切换到其他数据库。这是一个相当繁琐的过程 所以问题是,在数据源层中是否存在任何负载平衡/容错,以允许这种情况自动发生?i、 例如,当一个数据库关闭时,另一个数据库将自动使用 我们正在使用Oracle数据库,还想知道它是否可以在数据库连接层中完成 为了澄清这一点,我们只需要对数据库进行读取访问,因此不涉及

我们有两个具有相同数据的生产数据库,一个tomcat服务器当前将连接到其中一个以提供Web服务

生产数据库将一次更新一次(这需要相当长的时间)。因此,为了尽量减少停机时间,我们必须在运行更新时手动切换到其他数据库。这是一个相当繁琐的过程

所以问题是,在数据源层中是否存在任何负载平衡/容错,以允许这种情况自动发生?i、 例如,当一个数据库关闭时,另一个数据库将自动使用

我们正在使用Oracle数据库,还想知道它是否可以在数据库连接层中完成


为了澄清这一点,我们只需要对数据库进行读取访问,因此不涉及任何事务。

更安全的方法是在Oracle数据库端启用故障切换支持,因为您可以从Oracle数据库获得更好的即时连接/会话管理,而不必在Jdbc数据源级别处理


有一个很好的例子

据我所知,这不容易做到,你应该非常小心。 我会解释一个想法,我们用了一些东西提醒我你的问题

因此,如果您不想使用特定于数据库的解决方案(我相信Oracle在这里提供了一些功能),您可能希望在java层实现它。 基本上,您应该实现您自己的数据源,它将比现成的数据源更加智能

基本上,数据源背后的主要思想是根据请求提供连接。 因此,当第一个数据库进行维护时,应该通知数据源(可能是手动或其他,您需要开发一些功能),然后所有对数据源的后续请求都将重定向到新数据库

class MyDatasource implements javax.sql.DataSource {

    private DataSource firstDatasource = ...;
    private DataSource secondDatasource = ...;

    private boolean isMainDbAccessible = true; 

    public Connection getConnection() {
           if(isMainDbAccessible) {

              return firstDatasource.getConnection();
           }
           else {
              return secondDatasource.getConnection();
           }
    }

    public void startMainDbMaintenance() {
         isMainDbAccessible = false;
         // maybe you should passivate somehow the first DS, like close its connections and so forth
    }

    public void endMainDbMaintenance() {
        isMainDbAccessible = true;
        // again, check the connections state here
    }
}
技术实现实际上取决于您实际如何使用数据源,您是否定义了tomcat特定的资源并从JNDI获取数据源?或者您在这里不使用tomcat,而是使用Spring来提供对数据源的访问? 有很多可能的配置,所以我不能在这里更具体

但我想,你有这个想法

顺便说一下,类似的解决方案也可以在Java驱动程序级别实现(维护2个驱动程序实例)


希望这有助于

我将强烈建议反对任何在Java实现和数据源之间引入耦合的解决方案,并坚持关注点分离的原则

具体来说,我将设置一个TCP代理(like)来平衡两个Oracle数据库的负载,并将Tomcat配置为连接到代理。这样,如果您在HAProxy中启用两个数据库,并且如果您需要单独升级它们,那么您将获得负载平衡,您只需在代理中一次一个地清除它们,而Tomcat不会注意到任何事情

如果不需要负载平衡,代理仍然可以用于直接连接到一个或另一个数据库

当然,根据您的问题,主-主复制也可能值得研究。不过,使用代理也不会让人怀疑。嗯


备注:如果您使用的是Tomcat中的连接池,则需要注意一些细节。也就是说,将池配置为定期执行空闲连接的保持活动ping,并确保频率低于代理的频率。否则,代理可能会在池注意到连接之前以静默方式销毁该连接。小伙子,这对调试来说是一场噩梦



FWIW,请看一下如何使用两台MySQL服务器设置HAProxy。使用Oracle应该不会有太大区别。

为什么不使用好的旧DB集群呢?您目前是如何让Tomcat连接到其中一个的?如果Tomcat只连接其中一个数据库,那么这两个数据库是如何使用的?