java 板


LINE

說一下自己正在想,以及希望想找的解決方法 目前我看過跟資料庫的連線方式的libary,通常會包成這樣: 形式一: 取得連線 送入SQL從連線取得ResultSet while(ResultSet有資料) { 對資料做一些事 } 關閉ResultSet 關閉連線 通常在寫的時候,都會被包過,變成類似這樣 myDBHandler.open(); ResultSet rs = myDBHandler("SELECT * FROM USER"); while(rs.next()) { our.println("名稱:"+rs.getString("Name")); //下略 } rs.close(); myDBHandler.close(); 感覺起來還不錯,還挺簡潔的。 問題是,東西一多的話可能會變成這樣 myDBHandler.open(); ResultSet rs = myDBHandler("SELECT * FROM USER"); while(rs.next()) { our.println("名稱:"+rs.getString("Name")+"的統計資料"); //略 our.println("文章列表"); ResultSet subrs = myDBHandler("SELECT * FROM Post "+ " WHERE Pid = "+rs.getString("PostGroup")); while(subrs.next()) { //中略 } subrs.close(); subrs = myDBHandler("SELECT * FROM Mail "+ " WHERE Mid = "+rs.getString("PostGroup")); our.println("郵件列表"); while(subrs.next()) { //中略 } rs.close(); //下略 } rs.close(); myDBHandler.close(); 中間的東西可能會多達幾百行甚至一千多行..... 很多人喜歡這樣寫,但是這種程式風格會讓我覺得很痛苦 猛然一看很難看出上面那段程式哪邊有錯 有人注意到有個地方該打subrs.close(),卻打成rs.close()了嗎? 可能有,但是我通常不會注意到這種小地方 這種雜事我從來都認為應該是IDE或是程式結構要自己處理掉的。 我對程式的掌控能力不高,只有一個半螢幕而已 一個function中的東西,只要超過那樣的分量我就很容易亂掉 通常我自己寫給自己用的元件,會把麻煩事在底層都把它處理掉 在外層實際在用的時候,對一個物件的操作通常不會超過十行 那十行都是在處理不同元件間的掛勾、連結的操作 例如,發生什麼事的時候就去叫另外一個元件做什麼事,之類的 設定的部分寫完,需要人腦思考的部分就結束了 有點類似函數指標的觀念,雖然java沒有這種東西 但是可以用callback做出同樣的功能來 帶過我寫程式的人 雖然才兩個,但兩個都想把我這種寫法改掉 他們覺得程式應該是一行行執行下去,而不是東跳西跳..... 雖然在寫別人的code的時候會用他們的辦法去寫 但是我在寫自己的code的時候,會照自己的架構下去寫 不這樣自己想的寫,寫程式就沒樂趣了。 離題了 那,另外一種資料庫連線的寫法是把 while(rs.next()) { our.println("名稱:"+rs.getString("Name")); //下略 } rs.close(); 這一段包在一個Method當中 變成類似 MyDBHandler myDBHandler = new MyDBHandler() List<User> userList = myDBHandler.getUser(); myDBHandler.close(); 之前我看過hibernate的範例,感覺起來就類似這樣 (雖然最特殊的是設定檔,得為每個資料表建立一個class) 程式比較不會被一大串迴圈給包著 但是連線還是得自己關 由於還要開、關連線,對我習慣的架構而言,是個問題 這會讓每個有用到資料庫的元件都出現lifecycle 變成說,我還要另外去管元件的死活 每個東西在不用的時候都得呼叫個close()之類的 或是取得資料的掛勾動作 要由1個掛勾點(取得資料),變成3個掛勾點要處理(開啟,取得資料,關閉) 兩種方式都很糟糕..... 另外 try-with-resources Statement 或是 把整個資料庫連線連線流程給包在一個Method,例如: List<User> getUser() { List<User> listUser=new ArrayList<User>(); myDBHandler.open(); ResultSet rs = myDBHandler("SELECT * FROM USER"); while(rs.next()) { listUser.add(/*中略*/); } rs.close(); myDBHandler.close(); return listUser; } 這個雖然不會讓使用資料庫的元件出現lifecycle 但是每次取得資料時都會開、關一次連線 怎麼想都覺得,容易會造成短時間大量開、關連線的問題啊 而且,除了Connection之外還有Statement跟ResultSet要處理 Statement跟ResultSet原生的功能也不少 讓外層直接用這個,彈性似乎比較大 但麻煩的是,這幾個也都有close之類的東西要處理 比Connection更麻煩的是...... 在stackoverflow有看到說Connection是執行緒安全的物件 雖然看別人的建議是一條執行緒用一個Connection物件就好 但不小心重複使用到應該也不會造成大問題 不過Statement就不能這樣了 Statement在取得ResultSet的時候,會把上一次的ResultSet關掉 要防止這種風險,似乎只能每次new一個Statement -- --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.59.16.65
1F:推 tomap41017:我跟原PO一樣看到太多code無法handle,這時候就是 06/18 15:33
2F:推 tomap41017:使用Framwork的好時機了!! 06/18 15:39







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燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP