Mysql
 sql >> Database >  >> RDS >> Mysql

modo migliore per chiamare due server di database

Supponendo user_id è un long .

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)
}

MODIFICA :una query per tutti gli utenti invece di una query per utente:

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

Tieni presente che questo può fallire/funzionare in modo errato perché la maggior parte dei DB ha un limite per il numero di elementi in SQL IN la clausola può includere. Anche questo secondo metodo potrebbe consentire un'iniezione SQL su %a sostituzione.