2012-12-24 66 views
2

我想調用兩個不同數據庫的表一次數據庫的表A包含用戶ID和數據庫表B包含用戶位置與用戶ID,所以我想加入這兩個表並獲取與user_id.database A和B對應的位置在兩個不同的服務器中。所以我怎麼可以加入這兩個表。如果它不可能加入這個,是否有任何有效的方法來做到這一點。請help.i'm嘗試使用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 
+1

我想澄清一下:不同的數據庫服務器/不同的數據庫模式? – Raptor

+1

數據庫是否在同一個mysql-server-instance上? –

+0

@PeterRader * A和B在兩個不同的服務器*可能這個Sentece澄清你的問題。 –

回答

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 

請記住,這可能會失敗/工作錯誤的,因爲大多數DB有多少商品的限制的子句可以包含SQL IN。另外,這第二種方法可能允許在%a替代品上進行SQL注入。

+0

所以在這種情況下,如果有1000個用戶ID,那麼查詢將執行1000次,有沒有什麼方法可以批量執行這個查詢? – ishk

+0

爲所有用戶的一個查詢編輯。 – m0skit0

+0

感謝這個解決方案,user_ids的數量可以變化,我不能限制它,你知道任何其他方式來實現這一點,沒有任何限制。 – ishk

2

您可以使用FEDERATED Storage Engine。 FEDERATED存儲引擎允許您從遠程MySQL數據庫訪問數據,而無需使用複製或羣集技術。查詢本地FEDERATED表會自動從遠程(聯合)表中提取數據。沒有數據存儲在本地表上。這可能不是非常有效,但它會完成這項工作(JOINs)。

+0

+1因爲ACID後面的解決方案是「最好的方式」 –

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) 

上述過程將需要兩個查詢。

相關問題