我正在开发一个项目,其中我在具有不同模式的不同数据库中有两个表。这意味着我有两个不同的连接参数,用于使用JDBC连接这两个表 -
我们假设下面是config.property文件,其中table1.percentage
表示80%
时间table1
将被选中20%
时间table2
将以随机数为基础。
TABLES: table1 table2
#For Table1
table1.percentage: 80
#For Table2
table2.percentage: 20
下面的方法将阅读上面的config.property
文件并为每个表创建一个ReadTableConnectionInfo
对象。
private static HashMap<String, ReadTableConnectionInfo> tableList = new HashMap<String, ReadTableConnectionInfo>();
private static void readPropertyFile() throws IOException {
prop.load(Read.class.getClassLoader().getResourceAsStream("config.properties"));
tableNames = Arrays.asList(prop.getProperty("TABLES").split(" "));
for (String arg : tableNames) {
ReadTableConnectionInfo ci = new ReadTableConnectionInfo();
double percentage = Double.parseDouble(prop.getProperty(arg + ".percentage"));
ci.setPercentage(percentage);
tableList.put(arg, ci);
}
}
以下是ReadTableConnectionInfo
类,它将保存特定表格的所有table connection info
。
public class ReadTableConnectionInfo {
public String percentage;
public double getPercentage() {
return percentage;
}
public void setPercentage(double percentage) {
this.percentage = percentage;
}
}
现在在我的run方法中,每个线程必须生成随机数,然后根据每个表的百分比决定我需要使用哪个表。
private static Random random = new SecureRandom();
@Override
public run() {
...
while ( < 60 minutes) {
double randomNumber = random.nextDouble() * 100.0;
ReadTableConnectionInfo tableInfo = selectRandomConnection(randomNumber);
// do query...
}
}
//Any problem with the below method?
private ReadTableConnectionInfo selectRandomConnection(double randomNumber) {
double limit = 0;
for (ReadTableConnectionInfo ci : tableLists.values()) {
limit += ci.getPercentage();
if (randomNumber < limit) {
return ci;
}
}
throw new IllegalStateException();
}
问题陈述: -
我的selectRandomConnection
方法有问题吗?因为每个线程只运行60分钟,每次运行60分钟,每次只选择table1
。
我正在寻找的是80%
时间应该选择table1
和20%
时间选择table2
。
答案 0 :(得分:1)
如果你想要80%的时间选择A,并且20%的时间选择B,平均只需选择0(含)和100(不包括)之间的随机数。如果数字是&lt; 80,选择A,否则选择B.
就这么简单。