MYSQL批量插入數(shù)據(jù)的實現(xiàn)代碼第2/3頁
更新時間:2008年10月11日 22:43:05 作者:
非常的實現(xiàn)原理,代碼較多,建議大家仔細看看。
因為MicorSoft官方的jdbc不支持手動提交,因此用開源jdts的,反正官方測試報告說jdts性能在ms-sql的java驅動里性能最好。
把insert 語句注釋掉, 看你的程序運行10次是否會正常
-->
Error即是JVM的問題,大概是garbage collection太慢:roll:
試試每10000條作一次garbage collection 看看:roll:
-->
這句每一次作了3個物件,改一個看看
-->
但是配合3.0.16和3.0.10 都沒問題。
我也曾設置過,每執(zhí)行1000次就提交一次,照樣是用3.1的驅動出問題。還是1w2時候。
事務太長了,每插入一條就commit一次;偶插入過3千萬條,沒有問題的
昨天,用3.1.12驅動,在同學的AMD 64 + 512M RAM 上測試了,2W記錄,使用java -Xmx64m -Xmx128m 參數(shù)運行,可以順利通過。
但10W記錄,照樣完蛋。機器消耗的總內存(物理+交換文件)達到1.4GB 后,因為空間不夠,自動中止。
如果直接插入而不用事務機制呢?
-->
我每次測試,首先就是默認的自動提交(每語句),用3.1驅動還是出錯。
當記錄數(shù)目小到能正常完成時,自動提交耗時是一次事務的10倍時間(記錄不太多時,大于1W,差距縮小到2~3倍)。
自動提交:
復制代碼 代碼如下:
## 默認
D:\Program Files\test\db_test>java InsertTestMysql
<<---本頁生成耗時[43693]毫秒(43.693秒)--->>
<<---共插入記錄1000條-->>
一次事務:
復制代碼 代碼如下:
## 控制COMMIT,一次性提交
D:\Program Files\test\db_test>java InsertTestMysql
<<---本頁生成耗時[3846]毫秒(3.846秒)--->>
<<---共插入記錄1000條-->>
沒問題啊,。我們每天都通過java程序插入幾十萬條數(shù)據(jù)做測試,都可以的
//用mysql自己的驅動程序,下面的測試程序插入100000條記錄,結果是:
//<<---本頁生成耗時[82781]毫秒(82.781秒)--->>
//<<---共插入記錄100000條-->>
import java.sql.*;
public class InsertTestMysql {
public static void main(String[] args) {
java.util.Date now_start = new java.util.Date();
long start_time = now_start.getTime();
int st = 100000;
String db = "com.mysql.jdbc.Driver";
String host = "jdbc:mysql://192.168.2.108/develop";
String user = "whl";
String passwd = "MVu9H370uG";
Connection con = null;
try {
Class.forName(db).newInstance();
} catch (Exception e) {
System.out.println("加載驅動失敗:" + db);
}
try {
con = DriverManager.getConnection(host, user, passwd);
PreparedStatement pstmt = con.prepareStatement("insert into test (id,txt) values(?,?);");
for (int i = 1; i <= st; i++) {
pstmt.setInt(1, i);
pstmt.setString(2, "這條記錄是第=" + i);
pstmt.executeUpdate();
}
con.close();
} catch (Exception e) {
System.out.println(e);
}
java.util.Date now_end = new java.util.Date();
long end_time = now_end.getTime();
long use_time = end_time - start_time;
System.out.println("<<---本頁生成耗時[" + use_time + "]毫秒("
+ ((double) use_time) / 1000 + "秒)--->>");
System.out.println("\n<<---共插入記錄" + st + "條-->>");
}
}
MySQL存儲過程資料收集
表A
聲明
描述
CREATE PROCEDURE
建立一個存放在MySQL數(shù)據(jù)庫的表格的存儲過程。
CREATE FUNCTION
建立一個用戶自定義的函數(shù),尤其是返回數(shù)據(jù)的存儲過程。
ALTER PROCEDURE
更改用CREATE PROCEDURE 建立的預先指定的存儲過程,其不會影響相關存儲過程或存儲功能。.
ALTER FUNCTION
更改用CREATE FUNCTION 建立的預先指定的存儲過程,其不會影響相關存儲過程或存儲功能。.
DROP PROCEDURE
從MySQL的表格中刪除一個或多個存儲過程。
DROP FUNCTION
從MySQL的表格中刪除一個或多個存儲函數(shù)。
SHOW CREATE PROCEDURE
返回使用CREATE PROCEDURE 建立的預先指定的存儲過程的文本。這一聲明是SQL:2003規(guī)范的一個MySQL擴展。
SHOW CREATE FUNCTION
返回使用CREATE FUNCTION建立的預先指定的存儲過程的文本。這一聲明是SQL:2003規(guī)范的一個MySQL擴展。
SHOW PROCEDURE STATUS
返回一個預先指定的存儲過程的特性,包括名稱、類型、建立者、建立日期、以及更改日期。這一聲明是SQL:2003規(guī)范的一個MySQL擴展。
SHOW FUNCTION STATUS
返回一個預先指定的存儲函數(shù)的特性,包括名稱、類型、建立者、建立日期、以及更改日期。這一聲明是SQL:2003規(guī)范的一個MySQL擴展。
CALL
調用一個使用CREATE PROCEDURE建立的預先指定的存儲過程。
BEGIN ... END
包含一組執(zhí)行的多聲明。
DECLARE
用于指定當?shù)刈兞?、環(huán)境、處理器,以及指針。
SET
用于更改當?shù)睾腿址掌髯兞康闹怠?
SELECT ... INTO
用于存儲顯示變量的縱列。
OPEN
用于打開一個指針。
FETCH
使用特定指針來獲得下一列。
CLOSE
用于關閉和打開指針。
IF
一個An if-then-else-end if 聲明。
CASE ... WHEN
一個 case聲明的結構
LOOP
一個簡單的循環(huán)結構;可以使用LEAVE 語句來退出。
LEAVE
用于退出IF,CASE,LOOP,REPEAT以及WHILE 語句。
ITERATE
用于重新開始循環(huán)。
REPEAT
在結束時測試的循環(huán)。
WHILE
在開始時測試的循環(huán)。
RETURNS
返回一個存儲過程的值。
MySQL 5.0支持存儲過程語句。
一.創(chuàng)建存儲過程
1.基本語法:
create procedure sp_name()
begin
.........
end
2.參數(shù)傳遞
二.調用存儲過程
1.基本語法:call sp_name()
注意:存儲過程名稱后面必須加括號,哪怕該存儲過程沒有參數(shù)傳遞
三.刪除存儲過程
1.基本語法:
drop procedure sp_name//
2.注意事項
(1)不能在一個存儲過程中刪除另一個存儲過程,只能調用另一個存儲過程
四.區(qū)塊,條件,循環(huán)
1.區(qū)塊定義,常用
begin
......
end;
相關文章
Spring Boot console log 格式自定義方式
這篇文章主要介紹了Spring Boot console log 格式自定義方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07Spring Security+Spring Data Jpa如何進行安全管理
這篇文章主要介紹了Spring Security+Spring Data Jpa如何進行安全管理,幫助大家更好的理解和學習Spring Security框架,感興趣的朋友可以了解下2020-09-09