2014年1月22日 星期三

java.lang.NoClassDefFoundError: Could not initialize class

今天遇到的一個奇怪的問題,把某些類別包裝後原本都用得好好的,但移植到另一個專案時就出現無法初始化類別的問題
後來確認了原因是因為程式碼裡在 static 的區塊中做了某個類別的初始化,於是造成執行時無法正確初始化的問題。

static {
  QueryBuilder db = new QueryBuilder(.....);
  db.execute("key", 1).ensureIndex();
}

真實的原因跟對應的理由還不太了解,因此暫時先做個記錄,也許未來哪天會懂背後的問題...。

參考資料:
1、java.lang.NoClassDefFoundError: Could not initialize class XXX

2014年1月16日 星期四

String 和 StringBuilder 之間的差別

這個議題其實在 Java 當中盛行以久,應該大家都知道使用 String 相加是罪大惡極的行為
不過自從 Java 6 開始,基於各種 JVM 的調整,這個概念似乎有稍微修改的需要。

2014年1月15日 星期三

透過 Java driver 做 MongoDB sharding

在 MongoDB cluster 的環境中,即使 MongoDB 已經做成 Mongos 了,預設資料都還是會全部集中在同一台資料庫上
持續對資料庫做資料寫入時,資料越多速度會越慢,而且也可以發現都是同一台伺服器很忙
主因就是因為沒有做 DB 和 collection 的 sharding。

2014年1月9日 星期四

檢查 Collection 中是否有某個自定義的 Object

一般如果使用 Collection 類別去儲存一系列的某種 Object 時,可以直接利用 Collection.contains(obj) 的方法檢查某個 Object 是否在 Collection 內
不過 Java 預設的 Object 的檢查方式是檢查兩個 Object 是否相等,是依據 Object 所在的記憶體位置判斷的
但有時我們想要的是 Object 內的某些屬性相等,就視這兩個 Object 相等
也就是當使用 Collection.contains(obj) 時,想要的結果其實是當 Collection 內的某個項目特定屬性跟 obj 的特定屬性一樣,就預期要回應 true。

2013年12月26日 星期四

過濾 Apache HttpClient 的 debug log

在 Linux 底下使用 tail 指令時,可以利用 grep -v 反向過濾,把 Apache HttpClient 的 log 過濾掉
例如:tail -f catalina.out | grep -v 'org.apache.http'

2013年12月3日 星期二

使用 Apache HttpClient 4.3 發送 HTTPS 要求時略過所有認證檢查

一般正常在發送 HTTPS 要求時,必須先匯入伺服器的認證,才能正常建立 HTTPS 的加密連線
但某些狀況下,伺服器使用自我認證等等的方式時,會想要略過這些認證檢查(把 HTTPS 當成 HTTP 在使用...XD)
在 Apache HttpClient 4.3 當中可以用以下的方式取得 HTTPS 的連線。

2013年11月22日 星期五

使用 Jersey + Multi-part 接受檔案上傳(二):實作即時上傳

依照上篇文章(使用 Jersey + Multi-part 接受檔案上傳)的方法做 Multi-part 的上傳時
依據 Jersey 的實作方法,實際上會先在伺服器上把使用者上傳的檔案全部接收、暫存到暫存的資料夾內,然後才會進入使用者定義的 Multi-part 的介面,並獲得代表檔案內容的 FormDataMultiPart。
也就是說實際上如果檔案是要存到伺服器上,伺服器對這樣一個檔案上傳的動作,會花費兩次的磁碟 I/O 時間來接收和儲存這個檔案。