0

我正在做一个项目,其中我在不同的数据库中有两个具有不同模式的表。所以这意味着我有两个不同的连接参数让这两个表使用 JDBC-

让我们假设下面是 config.property 文件 - 在其中将选择时间table1.percentage方式,并且将根据随机数选择时间。80%table120%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;
    }
}

现在在我的运行方法中,每个线程都必须生成随机数,然后根据每个表的百分比决定我需要使用哪个表。

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 分钟内,每次它只是在picking table1

我正在寻找的是80%应该选择的时间table1和应该选择20%的时间table2

4

1 回答 1

1

如果您希望 A 有 80% 的时间被选中,B 被选中的概率为 20%,平均而言,只需在 0(包括)和 100(不包括)之间选择一个随机数。如果数字小于 80,则选择 A,否则选择 B。

就如此容易。

于 2013-02-28T22:52:32.450 回答