這個問題也困擾了我很久,因為我的 project 很多 source,每次重新 build 都至少耗掉我好幾分鐘,真的很難做事~
後來上網翻查了一下,發現只要注意幾個東西就能簡單避免,我簡單列出:
1.project library 所指到的 jar 是否會有常更新?
以我自己為例,因為我在部署一些程式時會利用 ant 將 class 包成 jar 在放到 runtime 目錄,而該死的是我的 project library 就有指到那個 jar,導致每次壓完 jar 之後就重新 build workspace.
2.project library 是否有指到 classes folder ?
被指到 classes folder 裡面的 class 是否會常異動,我所謂的"異動"是指經由外部程式把 folder 裡的檔案修改,而沒經過 eclipse去異動 ? 基本上我不建議用 class folder 啦,最後都指到 jar.
讓 eclipse 快速 build workspace 的小技巧:
1.盡量讓 project library 保持輕盈,把一些沒用到的 jar 移走,這會加快 eclipse 檢查異動的時間。
2.一些沒在用的 source 最好也移走,一樣讓 source 越輕盈越好。
上面兩點說起來好像廢話,不過真的執行下去就會發現會快不少哦~
小小心得:
eclipse 是個很霸道的怪物,沒有經過他去異動 project 內的檔案,他就會一定給你搞怪,不信你可試看看用檔案總管直接殺掉 WEB-INF/classes 裡的 class。
所以任何異動最好都透過這隻怪物…
2008年1月22日 星期二
2008年1月21日 星期一
URLClassLoader 的特性
如何動態載入不同的 jar ?
在 java ,可利用 URLClassLoader 動態載入jar。使用 URLClassLoader 時會動態載入指定路徑之 jar 或 classes。一般是以 http 居多,但也有指定檔案路徑,若是檔案路徑,需以這種格式 file:/d:\\t\\q.jar 放入。
特性
URLClassLoader cloader = new URLClassLoader (URL[] urls)
cloader.loadClass($classname);
這種用法只去 urls 找 $classname,若該 urls 中的 class 有用到目前的 classloader 中的 jar,還是會找不到的。舉個例子,若 $classname 有用到 com.stephen.ex.Car 這個 class,而這個 class 是放在目前執行這支程式的 classloader 中,這樣就會發生 NoClassDefError,解決方法是用下面這個 constructor:
URLClassLoader cloader = new URLClassLoader (URL[] urls, getClass().getClassLoader()) ;
cloader.loadClass($classname);
第二個參數是 parent classloader,將目前的 classLoader 當做該 URLClassLoader 的 parent 後就能順利找得到com.stephen.ex.Car 了。
在 java ,可利用 URLClassLoader 動態載入jar。使用 URLClassLoader 時會動態載入指定路徑之 jar 或 classes。一般是以 http 居多,但也有指定檔案路徑,若是檔案路徑,需以這種格式 file:/d:\\t\\q.jar 放入。
特性
URLClassLoader cloader = new URLClassLoader (URL[] urls)
cloader.loadClass($classname);
這種用法只去 urls 找 $classname,若該 urls 中的 class 有用到目前的 classloader 中的 jar,還是會找不到的。舉個例子,若 $classname 有用到 com.stephen.ex.Car 這個 class,而這個 class 是放在目前執行這支程式的 classloader 中,這樣就會發生 NoClassDefError,解決方法是用下面這個 constructor:
URLClassLoader cloader = new URLClassLoader (URL[] urls, getClass().getClassLoader()) ;
cloader.loadClass($classname);
第二個參數是 parent classloader,將目前的 classLoader 當做該 URLClassLoader 的 parent 後就能順利找得到com.stephen.ex.Car 了。
2008年1月19日 星期六
系統資源綠化_進階查詢篇
[進階查詢]
目前標準操作規範裡都會提供「進階查詢」功能,讓使用者容易找到欲處理之資料。這樣的設計構想是出於好意,但「方便就變成隨便、隨便就會造成大家的不便」。若就整體系統效能考量,使用者一次查出幾千筆上萬筆資料後,而最後只擷取其中的幾筆資料處理是很瘋狂的事情。這像極了一個暴發戶到百貨公司一次買了幾千件衣服回家後,在家裡挑一挑最後只選了幾件其它全部扔掉的感覺一樣,聽起來匪夷所思,但比起目前dejcQryGrid的濫用境況卻真有過之而無不及。
為改善這現象,dejcQryGrid將查詢筆數的限制降到1000,並提供效能耗用統計資料供定期檢討。
類似的效能監控及資源合理性的定期追蹤檢討,日後將擴及其它資源應用方面如 structs 的 action,DB Connection 的資源耗用,DQ的Task使用狀況等。
目前存在之問題主要為兩類:
一) 一次查太多筆資料欲只用其中一兩筆
二) sql 極為複雜,table 與 table 間的 join 關係錯綜複雜,讓系統光完成sql之查詢就耗掉不少cpu資源.
茲針對 dejcQryGrid (進階查詢元件) 將進行的改善作出下列說明:
1 只顯示前面1000筆,超過1000筆時顯示警告訊息「超過上限1000筆」。
2 在執行sql的前後插入計時器,監控每個 sql 的耗用時間、查詢筆數,並針對各sql之使用次數、耗費時間、查詢筆數做統計,每月列出報表檢討各sql執行狀況及資料耗用的合理性。
3 根據第2點,若發現sql耗用時間超過10秒,或查詢筆數超過1萬筆資料時即採取以下措施:
3.1 測試環境: 拋出 exception 警告。
3.2 正式環境: 拋到異常資料表中,每月定時印製報表檢討。
4 目前 dejcQryGrid 計算總筆數做法極耗效能,為改善此問題,將強制AP丟入”count總筆數之sql”。若沒有丟入,測試環境會拋出 exception,正式環境則拋入異常Table,每月定期檢討異常資料。
實作面:
1. 上限筆數透過設定檔設定,可隨時變更。
2. 以上各點所有需拋入異常Table之動作皆以 background方式進行。
目前標準操作規範裡都會提供「進階查詢」功能,讓使用者容易找到欲處理之資料。這樣的設計構想是出於好意,但「方便就變成隨便、隨便就會造成大家的不便」。若就整體系統效能考量,使用者一次查出幾千筆上萬筆資料後,而最後只擷取其中的幾筆資料處理是很瘋狂的事情。這像極了一個暴發戶到百貨公司一次買了幾千件衣服回家後,在家裡挑一挑最後只選了幾件其它全部扔掉的感覺一樣,聽起來匪夷所思,但比起目前dejcQryGrid的濫用境況卻真有過之而無不及。
為改善這現象,dejcQryGrid將查詢筆數的限制降到1000,並提供效能耗用統計資料供定期檢討。
類似的效能監控及資源合理性的定期追蹤檢討,日後將擴及其它資源應用方面如 structs 的 action,DB Connection 的資源耗用,DQ的Task使用狀況等。
目前存在之問題主要為兩類:
一) 一次查太多筆資料欲只用其中一兩筆
二) sql 極為複雜,table 與 table 間的 join 關係錯綜複雜,讓系統光完成sql之查詢就耗掉不少cpu資源.
茲針對 dejcQryGrid (進階查詢元件) 將進行的改善作出下列說明:
1 只顯示前面1000筆,超過1000筆時顯示警告訊息「超過上限1000筆」。
2 在執行sql的前後插入計時器,監控每個 sql 的耗用時間、查詢筆數,並針對各sql之使用次數、耗費時間、查詢筆數做統計,每月列出報表檢討各sql執行狀況及資料耗用的合理性。
3 根據第2點,若發現sql耗用時間超過10秒,或查詢筆數超過1萬筆資料時即採取以下措施:
3.1 測試環境: 拋出 exception 警告。
3.2 正式環境: 拋到異常資料表中,每月定時印製報表檢討。
4 目前 dejcQryGrid 計算總筆數做法極耗效能,為改善此問題,將強制AP丟入”count總筆數之sql”。若沒有丟入,測試環境會拋出 exception,正式環境則拋入異常Table,每月定期檢討異常資料。
實作面:
1. 上限筆數透過設定檔設定,可隨時變更。
2. 以上各點所有需拋入異常Table之動作皆以 background方式進行。
2008年1月2日 星期三
[Ant] javac 指定 compiler 版本
為了解決 compiler 不同版本的問題,真是吃足了苦頭,try 了一個下午終於解決了,以下的範例說明了 ant 如何跳脫預設的 compiler ,改用外面 compiler 的寫法:
fork=yes
解說: 表示要使用外部的 compiler,設了後還要搭配 executable 才有效
executable="C:\j2sdk1.4.2_04\bin\javac"
解說: 指定 javac 的位置
fork=yes
解說: 表示要使用外部的 compiler,設了後還要搭配 executable 才有效
executable="C:\j2sdk1.4.2_04\bin\javac"
解說: 指定 javac 的位置
[Ant] 怎麼知道 cvs 的 password file 放在哪裡?
為甚麼需要知道密碼檔的內容?因為在 ant 中使用 cvs checkout 時需要讀這個檔,你不希望你 cvs 的密碼是寫死在 build.xml 裡面吧?
cvs task 一般沒有指定的話會放在 C:\Documents and Settings\使用者\.cvspass 檔案,這個檔會記錄 cvs 的路徑以及經編碼過的密碼。找到這個檔,你就能用 ant 的 cvs task 來 checkout了。
現在下個問題是: 怎麼知道這個檔放哪?
於是我用既有的 cvs application (eclipse, wincvs, ...) 去試著生這個檔,最後發現這些 application 都會偷偷的藏在某個角落,很不好找,最後放棄了。
後來我找到 ant 有個 cvspass 的 task,這個 task 會自動幫你生密碼檔,真是愛死這個 task 了。在此記錄一下使用方式:
這檔的話就會幫你將編碼過的密碼放在 d:\t\cvspwd.txt 了。
cvs task 一般沒有指定的話會放在 C:\Documents and Settings\使用者\.cvspass 檔案,這個檔會記錄 cvs 的路徑以及經編碼過的密碼。找到這個檔,你就能用 ant 的 cvs task 來 checkout了。
現在下個問題是: 怎麼知道這個檔放哪?
於是我用既有的 cvs application (eclipse, wincvs, ...) 去試著生這個檔,最後發現這些 application 都會偷偷的藏在某個角落,很不好找,最後放棄了。
後來我找到 ant 有個 cvspass 的 task,這個 task 會自動幫你生密碼檔,真是愛死這個 task 了。在此記錄一下使用方式:
這檔的話就會幫你將編碼過的密碼放在 d:\t\cvspwd.txt 了。
訂閱:
文章 (Atom)