我有一个应用程序,我想配置两个数据库,如masterDb和slaveDb和Than用于Api调用说/ getUseData我想执行一些逻辑并决定数据应该从masterDb或slaveDb获取天气。
我是新手,因此需要帮助。
答案 0 :(得分:0)
我已经设法在我的drop向导应用程序中配置master-slave db,下面是我遵循的步骤:
在我的应用程序中,我正在注册hibernate bundle并使用相同的。
示例Config.yml:
Config.yml{
masterDb:
// configs here
slaveDb:
// configs here
}
所以到目前为止你将拥有两个变量,比如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配置,并决定在运行时使用哪个,或者只是在运行时注入正确的数据库配置。