调用两个数据库服务器的最佳方法

时间:2012-12-24 09:42:16

标签: java mysql select

我想一次调用两个不同数据库的表。数据库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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

假设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注入。

答案 2 :(得分:1)

如果你可以取消加入,一种可能的方法是一次性从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)

上述过程需要两个查询。