[問題] JAVA從DB撈取資料的問題

看板java作者 ( )時間9年前 (2014/12/27 11:51), 9年前編輯推噓1(1015)
留言16則, 5人參與, 最新討論串1/1
不好意思我又來請教各位 最近開發程式遇到一個bug 可是我想不出來可能的原因,也抓不到重點去google 小弟最近在做一個批價計算系統 設計一個每日累計與每月累計的表格 針對各個使用者累積價錢 流程大概是 有一個定時寫入批價系統的表格A 我寫的程式也是定時從表格A得取資料進行批價,並且累計在每日與每月的表格 我使用Quartz做排程 每次啟動時會從每日與每月的表格讀取資料 批價時,有資料就做累計 批完之後更新回資料庫 有測試過從開始到及結束更新回資料庫都是可以運作的 現在遇到一個bug是 當程式在第一次從DB撈取資料,之後.....完成後 時間到再次的從DB撈取資料,會發生讀到的是沒有包含第一次累積結果的資料 完全想不到問題在哪,只好來請教各位 在此先感謝大家 ------------- 我撈db的CODE private void setCurrentMap(){ try { sql= "SELECT A.IMSI,A.CHARGE,A.LAST_FILEID,A.SMS_TIMES, A.LAST_DATA_TIME,A.VOLUME,A.MONTH,A.EVER_SUSPEND, A.LAST_ALERN_THRESHOLD,A.LAST_ALERN_VOLUME " + "FROM HUR_CURRENT A " + "WHERE A.MONTH IN ('"+sYearmonth+"','"+sYearmonth2+"') "; Statement st = conn.createStatement(); logger.debug("Execute SQL : "+sql); ResultSet rs = st.executeQuery(sql); logger.debug("Set current map..."); while(rs.next()){ Map<String,Object> map=new HashMap<String,Object>(); Map<String,Map<String,Object>> map2=new HashMap<String,Map<String,Object>>(); String imsi =rs.getString("IMSI"); String month=rs.getString("MONTH"); if(currentMap.containsKey(month)){ map2=currentMap.get(month); } map.put("LAST_FILEID", rs.getInt("LAST_FILEID")); map.put("SMS_TIMES", rs.getInt("SMS_TIMES")); map.put("LAST_DATA_TIME", (rs.getDate("LAST_DATA_TIME")!=null? rs.getDate("LAST_DATA_TIME"):new Date())); map.put("CHARGE", rs.getDouble("CHARGE")); map.put("VOLUME", rs.getDouble("VOLUME")); map.put("EVER_SUSPEND", rs.getString("EVER_SUSPEND")); map.put("LAST_ALERN_THRESHOLD", rs.getDouble("LAST_ALERN_THRESHOLD")); map.put("LAST_ALERN_VOLUME", rs.getDouble("LAST_ALERN_VOLUME")); map2.put(imsi, map); currentMap.put(month,map2); } st.close(); rs.close(); } catch (SQLException e) { logger.error("At setCurrentMap occur SQLException error", e); } } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.132.72.213 ※ 文章網址: http://www.ptt.cc/bbs/java/M.1419652289.A.BCF.html

12/28 09:04, , 1F
要不要貼一下你撈DB的程式
12/28 09:04, 1F
程式碼已貼上,排版可能有點傷眼,請見諒

12/28 11:42, , 2F
條件邏輯會不會寫錯了才撈不到
12/28 11:42, 2F
我的條件是依照日期取出,應該不會撈不到 狀況是 第一次處理 原始資料 A,A經過處理過後的資料 =>B 時間到再次處理 一樣撈取到A,而不是撈取到B 這邊感覺到困惑,先感謝兩位 ※ 編輯: sthermit (220.132.72.213), 12/29/2014 10:44:37

12/29 11:42, , 3F
老實說看不懂到底你是讀哪個table,更新哪個table
12/29 11:42, 3F

12/29 11:43, , 4F
前面說讀A,寫到每日(B?)和每月(C?)
12/29 11:43, 4F

12/29 11:44, , 5F
下一段變從每日(B?)和每月(C?)讀,然後更新回資料庫(B,C?)
12/29 11:44, 5F

12/29 11:49, , 6F
如果是前者,那A又沒更新?
12/29 11:49, 6F

12/29 11:51, , 7F
如果是後者,"測試過...都是可以運作的"這句,是指你看過
12/29 11:51, 7F

12/29 11:51, , 8F
資料庫中的資料在排程執行前後,資料是有變動的?
12/29 11:51, 8F

12/29 11:53, , 9F
然後資料已修改且commit,但select出來是commit前的資料?
12/29 11:53, 9F

12/29 11:55, , 10F
程式碼看起來又像有在記憶體留一份資料,所以流程到底是?
12/29 11:55, 10F
抱歉,我敘述能力不夠好 流程是 從A讀出來資料 從B讀出資料 從C讀出資料 A批價之後累計到B與C 最後更新A批價結果 更新B累計結果 更新C累計結果 有先把資料讀出來放到記憶體後再使用 ※ 編輯: sthermit (220.132.72.213), 12/29/2014 12:03:15

12/29 15:37, , 11F
你都說是bug了~那就不關流程的問題~根本就是程式有問題
12/29 15:37, 11F

12/29 15:38, , 12F
把完整的貼出來就知道了~你只貼前面一部分而已
12/29 15:38, 12F

01/01 07:12, , 13F
這樣除非很幸運,不然很難會找到 bug. 建議你找個工具
01/01 07:12, 13F

01/01 07:13, , 14F
(jdbcdslog之類),看看你真正跑的 SQL 和傳回的record
01/01 07:13, 14F

01/01 07:14, , 15F
是不是正確,(我不太相信DB會無故return少了record)
01/01 07:14, 15F

01/01 07:14, , 16F
先確認問題出來 DB 撈data,還是之後的處理吧.
01/01 07:14, 16F
文章代碼(AID): #1KdYp1lF (java)