作者sthermit ( )
看板java
標題[問題] JAVA從DB撈取資料的問題
時間Sat Dec 27 11:51:26 2014
不好意思我又來請教各位
最近開發程式遇到一個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
推 mozzan: 要不要貼一下你撈DB的程式 12/28 09:04
程式碼已貼上,排版可能有點傷眼,請見諒
→ DeathWatch: 條件邏輯會不會寫錯了才撈不到 12/28 11:42
我的條件是依照日期取出,應該不會撈不到
狀況是
第一次處理
原始資料 A,A經過處理過後的資料 =>B
時間到再次處理
一樣撈取到A,而不是撈取到B
這邊感覺到困惑,先感謝兩位
※ 編輯: sthermit (220.132.72.213), 12/29/2014 10:44:37
→ ssccg: 老實說看不懂到底你是讀哪個table,更新哪個table 12/29 11:42
→ ssccg: 前面說讀A,寫到每日(B?)和每月(C?) 12/29 11:43
→ ssccg: 下一段變從每日(B?)和每月(C?)讀,然後更新回資料庫(B,C?) 12/29 11:44
→ ssccg: 如果是前者,那A又沒更新? 12/29 11:49
→ ssccg: 如果是後者,"測試過...都是可以運作的"這句,是指你看過 12/29 11:51
→ ssccg: 資料庫中的資料在排程執行前後,資料是有變動的? 12/29 11:51
→ ssccg: 然後資料已修改且commit,但select出來是commit前的資料? 12/29 11:53
→ ssccg: 程式碼看起來又像有在記憶體留一份資料,所以流程到底是? 12/29 11:55
抱歉,我敘述能力不夠好
流程是
從A讀出來資料
從B讀出資料
從C讀出資料
A批價之後累計到B與C
最後更新A批價結果
更新B累計結果
更新C累計結果
有先把資料讀出來放到記憶體後再使用
※ 編輯: sthermit (220.132.72.213), 12/29/2014 12:03:15
→ swpoker: 你都說是bug了~那就不關流程的問題~根本就是程式有問題 12/29 15:37
→ swpoker: 把完整的貼出來就知道了~你只貼前面一部分而已 12/29 15:38
→ adrianshum: 這樣除非很幸運,不然很難會找到 bug. 建議你找個工具 01/01 07:12
→ adrianshum: (jdbcdslog之類),看看你真正跑的 SQL 和傳回的record 01/01 07:13
→ adrianshum: 是不是正確,(我不太相信DB會無故return少了record) 01/01 07:14
→ adrianshum: 先確認問題出來 DB 撈data,還是之後的處理吧. 01/01 07:14