0

虽然这似乎是一个非常简单的问题,但我想出的唯一解决方案如下,对于时间复杂度较低的不那么难看的东西有什么建议吗?

我的应用程序在 Java 中,并且正在使用 MS-sql DB 进行检索skife.jdbi

假设我有一个Tablewith columns A, B, and CwhereAB形成一个主键。我想检索C给定一个特别的Aand B。这很容易实现。但是如果我对吞吐量的要求很高,所以我想Select分批做这些语句。我最终得到如下内容:

给定 aSetObjectsAand B,我迭代 List 编译所有Aand的值B。然后我运行一个查询,如SELECT A, B, C FROM tbl WHERE A IN :listOfAs AND B IN :listOfBs. A然后我迭代查询的结果,通过比较和B值将结果与原始对象匹配。这听起来很合理,但代码最终看起来像下面这样,看起来丑陋和次优?

class MyObject {

  String A;
  String B;
  String C;
  Object otherData;


  @Override
  public boolean equals(Object other) {
    if (this == other) {
      return true;
    } else if (!(other instanceof MyObject)) {
      return false;
    } else {
      return A.equals(other.A) && B.equals(other.B);
    }
  }

  @Override
  public int hashCode() {
    return 31 * A.hashCode() + B.hashCode();
  }
}

// populates the of objects with their proper C value
void retrieveC(Set<MyObject> input) {
  Set<String> aValues = new HashSet<>();
  Set<String> bValues = new HashSet<>();

  for (MyObject object : input) {
    aValues.add(object.A);
    bValues.add(object.B);
  }

  // the dao executes the query mentioned above, and returns a Set of  
  // MyObject instances with members A, B, and C populated from the results.
  // Any results that do not contain a value for A, B, and C (which
  // shouldn't exit) are filtered out by the dao.
  Set<MyObject> results = dao.selectC(aValues, bValues);

  // ewww... O(n^2)
  for (MyObject object : input) {
    boolean resultFound = false;

    for (MyObject result : results) {
      if (object.equals(result)) {
        object.C = result.C;
        resultFound = true;
        break;
      }
    }

    if (!resultFound) {
      // handle this case
    }
  }
}
4

2 回答 2

0

我认为理想是

SELECT A, B, C FROM tbl WHERE A+' '+B IN :listOfAandBs 

那不是listOfAs x listOfBs(二次复杂度)而是listofAs . listOfBs(线性,产品内)

于 2015-12-15T22:01:56.010 回答
0

您可以使用 JDBI的流畅查询来代替 DAO 模式。

这样您就可以将批处理切换到流式处理。在 JDBI 页面上给出的示例中,您可以将 StringBuilder() 与允许您在数据库返回结果时将结果逐个流式传输到接收器的东西进行交换。

这是否可能当然取决于您的开发环境。

于 2015-12-16T16:15:13.393 回答