【问题标题】:best way to call two database servers调用两个数据库服务器的最佳方式
【发布时间】:2012-12-24 09:42:16
【问题描述】:

我想一次调用不同数据库的两个表。数据库A的表包含用户ID,数据库B的表包含用户位置和用户ID,所以我想加入这两个表并获取与user_id对应的位置.database A 和 B 位于两个不同的服务器中。那么我怎样才能加入这两个表。如果无法加入,是否有任何有效的方法可以做到这一点。请帮助。我正在尝试使用 java、mysql 来做到这一点。

 ps = con.prepareStatement("SELECT user_id FROM A.users");
 rs = ps.executeQuery();
 while(rs.next())
    {
    //call select statement for database B to get the location for each user id             

    }

请提出一个有效的方法来做到这一点

Id  User_id
===========
1   44
2   23

User_id     location
====================
44          india
23          us

【问题讨论】:

  • 我想澄清一下:不同的数据库服务器/不同的数据库架构?
  • 数据库是否在同一个mysql-server-instance上?
  • @PeterRader A 和 B 在两个不同的服务器中 也许这个句子可以澄清你的问题。
  • 您需要有两个连接,一个指向表 A 所属的服务器,另一个指向表 B。是的,这意味着有两个 Connection 对象:Connection conTableA; Connection conTableB;
  • 是的,我试图保持两个连接,但是如果我按照上面的代码进行操作,那么如果有 1000 个用户 ID,那么我必须执行 1000 次 select 语句,有什么方法可以执行这是一个批次?

标签: java mysql select


【解决方案1】:

假设user_idlong

PreparedStatement psUserLocation = conB.prepareStatement("SELECT location FROM B.users WHERE user_id = ?");
while(rs.next()) {
    //call select statement for database B to get the location for each user id
    long userId = rs.getLong(user_id);
    psUserLocation.setLong(1, userId)
    ResultSet userLocation = ps.executeQuery();
    // Do whatever with the location(s)
}

编辑:对所有用户进行一次查询,而不是对每个用户进行一次查询:

private final static String QUERY = "SELECT user_id, location FROM B.users WHERE user_id IN (%a)";

StringBuilder userList = new StringBuilder();
while(rs.next()) {
    long userId = rs.getLong(user_id);
    userList.append(userId);
    if (!rs.isLast()) {
        userList.append(",");
    }
}

String usersLocationQuery = QUERY.replaceAll("%a", userList.toString());
PreparedStatement psUsersLocation = conB.prepareStatement(usersLocationQuery);
ResultSet usersLocation = psUsersLocation.executeQuery();
// Do whatever with the locations

请记住,这可能会失败/工作错误,因为大多数数据库对 SQL IN 子句可以包含的项目数都有限制。此外,第二种方法可能允许在 %a 替换上进行 SQL 注入。

【讨论】:

  • 那么在这种情况下,如果有1000个用户id,那么查询将执行1000次,有什么办法可以批量执行这个查询?
  • 针对所有用户的一次查询进行了编辑。
  • 感谢这个解决方案,user_ids 的数量可以变化,我不能限制它,你知道没有任何限制的其他方式来实现这个。
  • 您已经选择了一个正确的答案(顺便说一句,这与我的相同,但稍后发布且不那么详细),所以我知道您解决了您的问题。不要指望我再回答你的任何问题。
  • 对不起,我是 stackoverflow 的新手,我实际上标记了两个答案都是正确的
【解决方案2】:

您可以使用FEDERATED Storage Engine。 FEDERATED 存储引擎允许您访问远程 MySQL 数据库中的数据,而无需使用复制或集群技术。查询本地 FEDERATED 表会自动从远程(联合)表中提取数据。没有数据存储在本地表上。这可能不是很有效,但它会完成工作(JOIN)。

【讨论】:

    【解决方案3】:

    如果您可以取消连接,一种可能的方法是一次性从 tableA 获取所有 user_id,然后将 user_id 一次性传递给 tableB。当然,这种方法也需要您更改代码。

    类似:

    select user_id from tableA (of databaseA);
    

    select user_id, location from tableB (of database B) where user_id in (<result_from_above_query)
    

    上述过程将需要两个查询。

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 2018-10-03
      • 2016-07-10
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多