java 板


LINE

※ 引述《asklove (問愛)》之銘言: : 我現在在寫一個JAVA程式,要同步異質平台的資料 : 簡單的說就是要把資料從 Oracle 拋到 MySQL : 目前使用 ArrayList、prepareStatement(在這裡爬文爬到的方法,效能有改善很多)、 : addBatch、executeBatch 之類的方法 : 每一筆資料都是一個 insert into 的 SQL : 先用 addBatch 丟到 prepareStatement,最後執行一次 executeBatch : 記憶體的部分,暫時使用批次撈取/匯入的方式解決 : 另外同時也匯出.CSV檔以做為備份用(有考慮順便產生 sql 檔,那是後話暫且不提) : 但我發現它在插入 MySQL 時的速度很慢 : 例如我有一天的資料量是 384329 筆,用這支 JAVA來執行 Insert 大約要花上20分鐘 : 但用 phpMyAdmin 匯入 CSV 檔卻在2分鐘以內就完成,差別太大了! : 我一時之間想不到問題所在,不知道是我不會用還是.... : 請問還有改善的空間嗎? : 還是說 JAVA 的能力就只能到這樣,沒辦法比 PHP 和 Apache 更快呢? ^^^^^^ 突然有一種,公堂之上為甚麼要提人家老母的感覺 (Apache:棍! 躺著也中槍) 理論上,這跟 Java 是沒有關係的 應該說,如果你要講上頭這句話,那前提是你用 PHP 執行相同的 sql 語法 問題是,你不是阿... [怒指] 如果測試條件不是相同 or 接近的話 你怎麼能夠大辣辣的講 or 批判一些你不確定的事情? 用我個人內心的標準,還想指控你沒有認真作功課就上來發問 XD 請看一下 phpmyadmin 的資料匯出 sql 語法的內容 他是多筆資料塞成一個 sql 語法 同理,我們絕對有理由相信,phpmyadmin 處理 .csv 也是同樣方法 撇開 PrepareStatement 的問題,我的測試程式跑出來的結果 用一筆資料一個 insert 語法 跟所有資料一個 insert 語法 執行速度差不多也是十倍左右,跟你報出來的數據差不多 我用 PHP 跑,也差不多是這個比例 : 附帶一提,我使用的 JDBC Driver 是 mysql-connector-java-5.1.8-bin.jar 我對 PrepareStatement 不太熟 [炸] 還得感謝原 po 給我這個機會上台領獎... (阿? 拿錯講稿了 [炸]) 不然我還不知道 其實 PrepareStatement 的執行速度根本沒有比較快... (至少在 MySQL 的 JDBC driver 是這樣 Orz) 以下是不太嚴謹的測試程式 & 數據,僅供參考 XD btw... 我也是用相同 JDBC driver //傳統手工 sql,一筆一筆加,時間約 32xxx ms long time = System.currentTimeMillis(); Connection c = DBPool.getConnection(); Statement stmt = c.createStatement(); for(int i=0; i<3000; i++){ stmt.execute( "INSERT INTO `game_session` (`id` , `game_id` , `create_time` , `progress` ,`size`)"+ " VALUES ('"+i+"', '1', '1', '1', '1');"); } stmt.execute("delete from game_session"); System.out.println(time-System.currentTimeMillis()); //傳統手工 sql,但是全部組完才執行,時間約 4xxx ms long time = System.currentTimeMillis(); Connection c = DBPool.getConnection(); Statement stmt = c.createStatement(); StringBuffer sb = new StringBuffer("INSERT INTO `game_session` (`id` , `game_id` , `create_time` , `progress` ,`size`) VALUES "); for(int i=0; i<3000; i++){ sb.append("('"+i+"', '1', '1', '1', '1'), "); } sb.append("('end', '1', '1', '1', '1') "); stmt.execute(sb.toString()); stmt.execute("delete from game_session"); System.out.println(time-System.currentTimeMillis()); //PrepareStatement,用法應該沒有錯 XD //時間跟第一個傳統手工的,根本沒差別... Orz long time = System.currentTimeMillis(); Connection c = DBPool.getConnection(); PreparedStatement pstmt = c.prepareStatement( "INSERT INTO `game_session` (`id` ,`game_id` ,`create_time` ,`progress`, `size`) " + "VALUES ( ?, ?, ?, ?, ?)"); for(int i=0; i<3000; i++){ pstmt.setString(1, ""+i); pstmt.setString(2, ""+i); pstmt.setLong(3, new Date().getTime()); pstmt.setString(4, ""+i); pstmt.setString(5, ""+i); pstmt.addBatch(); } pstmt.executeBatch(); pstmt.execute("delete from game_session"); System.out.println(time-System.currentTimeMillis()); 如果有謬誤之處,還請指正 -- 侃侃長論鮮窒礙 首頁:http://www.psmonkey.idv.tw 眾目睽睽無心顫 Blog:http://ps-think.blogspot.com 煢居少聊常人事 殺頭容易告白難 歡迎參觀 Java 版(@ptt.cc) \囧/ --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 58.114.193.216
1F:推 Earvin:PrepareStatement用addBatch然後executeBatch沒比分開好? 09/04 20:49
2F:推 Earvin:addBatch那段多new Date().getTime(),內容會比傳統的方式多 09/04 20:58
3F:推 asklove:多謝板主,採用全部組完再執行,已降低到七分鐘左右 09/04 23:07
4F:推 asklove:估算了一下速度差不多是1秒1000筆 插入約花6.4秒 09/04 23:57
5F:→ asklove: 分鐘 09/04 23:58
6F:→ adrianshum:不要embed value, 用 bind param 的做法,應該會快很多 09/05 00:33
7F:→ adrianshum:不過 batch update, prepare stmt etc 都要視乎DBMS 09/05 00:38







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Tech_Job站內搜尋

TOP