2012年3月21日 星期三

提昇資料庫效率的方法:Partition

原本要找的是 AUTO_INCREMENT 爆掉的問題該怎麼處理
意外找到這個可以提昇資料庫效率的方法~
詳細說明可以直接看下列的參考資料

參考資料:
1、通過分區(Partition)提升MySQL性能(一)
2、通過分區(Partition)提升MySQL性能(二)
3、mysql 的 partition 與 auto_increment

在 [1] 的效能測試中,建了兩個資料表,一個使用 Partition、一個沒使用
然後用隨機產生的資料填入 800 萬筆資料,測試找出時間是 1995 年間的所有資料
在沒有做 Partition 的資料表中花了 38 秒,有做 Partition 的則只花了 3 秒多~
當資料有顯著的分區效果時,做 Partition 可以降低搜尋資料的時間~

不過後來又找到 [3],同時使用 AUTO_INCREMENT 跟 Partition 時 MySQL 可能會有問題....
目前暫定的作法是使用 Partition、放棄 AUTO_INCREMENT
用其他 INDEX 來盡可能達到類似 AUTO_INCREMENT 的 PRIMARY KEY 效果~

2012年3月20日 星期二

在 Java 中寫入 XML 檔案:使用 dom4j

dom4j 官方網站:http://dom4j.sourceforge.net/
在 Java 存取 XML 的方法好像有不少,會選 dom4j 是因為據說它效率還不錯,而且用法簡單!

以下直接舉一個寫入 XML 的例子
我是先建立一個 XMLConstructor 的 Class,然後在 main 去呼叫它~

2012年3月15日 星期四

使用網路爬蟲(Crawler)擷取網頁資料:以 niocchi 為例

這個標題寫得很像論文的標題 XD
不過總之目標是要抓網頁內容下來。

Open Source 的 Web Crawler 可以參考 [1]
網路上比較多人使用的好像是 Heritrix,不過我看了一下他的資料還是不太會用 XD
Crawler4j 原本要使用,但後來也不知道怎麼用,所以又繼續 survey 了
最後我選擇的是 niocchi....原因嘛...其實沒什麼特別的原因 XD
主要優點大概是它號稱使用 NIO 來進行 crawling,還有它最後更新時間是 2011 年!XD

niocchi 官方網站可參考 [2]。

2012年3月2日 星期五

安裝 jProfiler6 到遠端的 Linux 主機

jProfiler 簡介就免了~
我的主要目的是想追蹤 JVM 上的 thread 狀況
看那些我開出來的 thread 是不是在任何情況都會正確地被關閉。

公司給的 JProfiler 6.2.4 有包含 Windows 的 GUI 跟 Linux 的 jprofiler_linux_6_2_4.tar.gz
安裝時首先要先把遠端機器上的 tomcat 關掉,接著按照以下的流程:

2012年2月15日 星期三

(暫存) PreparedStatement

PreparedStatement 的基本優點是程式碼好讀(不用自己拼字串)、提供一定程度的 SQL injection 防禦,還有有些資料說 PreparedStatement 效率比較高。

相關資源:
1. 官方文件
2. PreparedStatement & Statement 的差異
3. PreparedStatement 真的比 Statement 快嗎?

效率問題可以參考看看第三個連結,SELECT 狀況下大多是 Statement 比較快一點,不過下面回應有人說 PreparedStatement 主要是快在非 SELECT 的指令。(但話說資料庫最常用的指令應該是 SELECT 吧~XDDD)

範例程式碼可以參考:Using the Prepared Statement Twice

Cron Expression

參考資料:Lesson 6: CronTrigger

雖然說上面的參考資料是 Quartz 的文件,不過查 Wikipedia 時,查到的 Cron Expression 表達方法是一樣的,所以....應該 Linux 上的 cron 跟 Quartz 的 CronTrigger 用的都是同一套標準吧!(也許 Cron Expression 是公定的標準?我不太清楚 XD)

Cron Expression 的規則就看 Wiki 吧,這裡要特別記錄的是使用「/」記號的規則
在分鐘的欄位設定 3/20 表示的是「every 20th minute of the hour, starting at minute three」
也就是從第三分鐘開始,每個第 20 分鐘執行一次
而設定 /35 表示的並不是每隔 35 分鐘執行一次,而是同義於 0-59/35
也就是每個小時的 0 分開始算第 35 分鐘執行一次。
亦即實際執行時會是例如 1:35、2:35、3:35、.....,實際上會變成每小時執行一次。

PS. 這是我目前對 Cron Expression 的理解,如果有錯誤請指正!

2012年2月12日 星期日

2012年2月6日 星期一

Java 複製目錄

Java 內建沒有檔案複製的 API,原本想直接用 Linux 的 cp -r
(因為我們公司的環境是在 Linux 上跑 Java 的 Web Application)
但怎麼試都試不出在 Java 裡面透過 Runtime 來下 cp 可以把某個資料夾內所有檔案複製到指定目錄
好像是因為 Runtime 不能用 * 這種字元,然後改成寫 shell script 從 Java 呼叫也還是有問題
所以只好自己寫一個~
其實說是自己寫一個,因為實在懶得寫 XD,所以直接找了人家寫好的 code 來小改一下!

參考資料:JAVA COPY整個資料夾
整體結構跟上面連結的程式碼一模一樣,只是改了一點點 error handling 跟習慣的變數用法。

2012年1月11日 星期三

Java 定時執行 (2):將 ExecutorService 產生的 Thread 加入 ThreadGroup

前一篇文章提到,我選用 ExecutorService 的主因是比較好控制 Thread
而控制的方法是把要產生的 Thread 都加入到我指定的一個 ThreadGroup
如此一來我只要用 ThreadGroup.activeCount() 就可以知道定時執行產生的 Thread 還有幾個正在執行
也可以用 Thread.enumerate(new Thread[ ]) 把 ThreadGroup 中的 Thread 列舉出來。

參考資料:How to use ThreadFactory in Java