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

