如何为hibernate-dropwizard应用程序配置master -slave Db配置

时间:2018-02-27 13:53:33

标签: hibernate dropwizard

我有一个应用程序,我想配置两个数据库,如masterDb和slaveDb和Than用于Api调用说/ getUseData我想执行一些逻辑并决定数据应该从masterDb或slaveDb获取天气。

我是新手,因此需要帮助。

1 个答案:

答案 0 :(得分:0)

我已经设法在我的drop向导应用程序中配置master-slave db,下面是我遵循的步骤:

在我的应用程序中,我正在注册hibernate bundle并使用相同的。

  1. 在配置文件中提供slave db配置(在我的例子中为config.yml)。
  2. 示例Config.yml:

    Config.yml{
    masterDb:
        // configs here
    slaveDb:
        // configs here 
    }
    
    1. 现在在应用程序的配置类中定义一个类型为DataSourceFactory的slaveDb变量(Drop向导提供此类)(扩展配置类的类,另一个dropWizard类)
    2. 所以到目前为止你将拥有两个变量,比如masterDb,DataSourceFactory类型的SlaveDb,masterDb将具有为master指定的配置,slaveDb将在Config.yml文件中具有为slave Db指定的配置

      示例类:

      公共类TestApplicationConfiguration extends

      DataSourceSelectorConfigurationManager {
      
          @JsonProperty(“masterDb")
          private DataSourceFactory masterDb = new DataSourceFactory();
          @JsonProperty(“slaveDb")
          private DataSourceFactory slaveDb = new DataSourceFactory();
      
      }
      

      public abstract class DataSourceAwareConfigurationManager extends Configuration {
      
          public abstract DataSourceFactory getDataSourceFactory(DbContextHolder.DbType dbType);
          public abstract DataSourceFactory getDataSourceFactory();
      
      }
      

      public class DBContextHolder {
      
      public enum DbType {
          MDB, SDB,
      }
      
      private static final ThreadLocal<DbType> contextHolder = new ThreadLocal<DbType>(){
          @Override
          protected DbType initialValue() {
              return DbType.MDB;
          }
      };
      public static void setDbType(DbType dbType) {
          if (dbType == null) {
              contextHolder.set(DbType.MDB);
          }
          contextHolder.set(dbType);
      }
      
      public static DbType getDbType() {
          return contextHolder.get();
      }
      
      public static void clearDbType() {
          contextHolder.remove();
      }
      }
      

      现在,如果您注意到DBContextHolder中的contextHolder是一个线程局部变量和一个静态变量。因此,对于多个线程,不应存在任何同步问题。

      现在,当我们想要主数据库时,我们需要将contextHolder.dbType设置为主数据库的MDB和从数据库的SBD,一旦完成,只需清除contextHolder.dbType,它将自动将其设置为MDB(这是主数据库)数据库),这将在线程级别设置。

      根据contextHolder.dbType的值,我们将使用上面dbLocator中定义的masterDb或 slaveDb

      这里的基本思想是实现/使用 getDataSourceFactory()方法之一,并根据dbType在运行类型上返回相应的dataFactory并使用相同的方法。

      我们甚至可以创建两个不同的会话工厂对象,一个使用masterDb配置,一个使用slavDb配置,并决定在运行时使用哪个,或者只是在运行时注入正确的数据库配置。