[英]Inserting a MySQL result-set, retrieved from a select query?
我在服務器x和服務器y上都有一個MySQL
數據庫。
我試圖讓從表中的記錄叫testx這是位於服務器X和INSERT
他們到一個名為暴躁表。 因此,我執行了SELECT
語句並將其存儲到resultset
集中。 然后,我試圖在resultset
while
循環中迭代INSERT
語句。 這是我的示例代碼:
private static void cloneTableAndAlter() throws ClassNotFoundException, SQLException, InstantiationException, IllegalAccessException, InterruptedException {
Connection connForSource = getConnectionForSource();
Connection connForTarget = getConnectionForTarget();
if (connForSource != null && connForTarget != null) {
try {
Statement st = connForSource.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
String selectStatement = "SELECT field1, field2 FROM dbx.testx where time between ('2016-09-01 00:00:00') and ('2016-09-03 23:59:59');";
String insertStatement = "INSERT INTO testy(" + "field1," + "field2)" +
"VALUES(?,?) " +
"ON DUPLICATE KEY UPDATE field1 = VALUES(field1);"; <----field1 is a unique key but not primary
st.setFetchSize(Integer.MIN_VALUE);
ResultSet resultSetForSelect = st.executeQuery(selectStatement);
PreparedStatement preparedStatement = connForTarget.prepareStatement(insertStatement);
int count = 0;
while (resultSetForSelect.next()) {
++count;
TableDetails tableDetails = setTableDetails(resultSetForSelect); <--- i'm getting the value from the resultset and setting it to my DTO class.
getTableDetails(preparedStatement, tableDetails); <--- setting the values back during the insert from the DTO
preparedStatement.executeUpdate();
System.out.println(count + "rows affected");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
注意 :源表( testx )有超過一百萬條記錄。
我可以插入,但是我感覺插入有點慢,每秒可以插入45-50次。 我要去哪里?
有什么方法可以優化此操作並增加插入量,或者這是插入大數據集的本質嗎?
任何幫助,不勝感激。
您可以采用其他方式:
使用此Concat創建一個Select
select GROUP_CONCAT(
CONCAT(" ('",field1,"','",field2,"')")) as vals
from my_table;
結果看起來像這樣:
結果
mysql> select GROUP_CONCAT(
-> CONCAT(" ('",field1,"','",field2,"')")) as vals
-> from my_table;
+---------------------------------------------------------------------------------------------------------+
| vals |
+---------------------------------------------------------------------------------------------------------+
| ('O1','AC'), ('O1','PT'), ('O2','PT'), ('O3','MI'), ('O3','PT'), ('O4','EG'), ('O4','PT'), ('O5','PT') |
+---------------------------------------------------------------------------------------------------------+
1 row in set (0,00 sec)
mysql>
您可以直接在insert語句中進行連接,而您只能讀取一行並且只能編寫和執行一條語句。
您的密碼
String selectStatement = "SELECT GROUP_CONCAT(CONCAT(" ('",field1,"','",field2,"')")) as vals
FROM dbx.testx where time between ('2016-09-01 00:00:00') and ('2016-09-03 23:59:59');";
ResultSet resultSetForSelect = st.executeQuery(selectStatement);
String insertStatement = "INSERT INTO testy(" + "field1," + "field2)" +
+ String from result +
"ON DUPLICATE KEY UPDATE field1 = VALUES(field1);"; <----field1 is a unique key but not primary
# execute one time
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.