2007年1月18日 星期四

JavaScript 實務:使用 JsUnit 作單元測試

JsUnit
javascript 的 Unit Test 工具。

2007年1月9日 星期二

利用 PreparedStatement 批次查詢

平常StatementPreparedStatement的executeUpdate()的方法只能執行一個SQL敘述, 如果有很多SQL要執行的話,就得用addBatch()executeBatch()

ex1.

String strqry="insert into test (col1,col2) values (?,?)";
PreparedStatement pstmt = con.prepareStatement(strqry);
pstmt.setString(1,"test1");
pstmt.setString(2, "123");
pstmt.addBatch();
pstmt.setString(1,"test2");
pstmt.setString(2, "456");
pstmt.addBatch();
pstmt.executeBatch();

ex2:

Statement stmt=con.createStatement();
stmt.addBatch("insert into test (col1,col2) values ('test1','123')");
stmt.addBatch("update test set col2='789' where col1='test4'");
stmt.executeBatch();

2006年12月26日 星期二

Loging 實務:log4j 設定檔範例


#設定 Logger(s),格式 logger_name = message_level, appender1, appender2, ...
log4j.rootCategory=error, stdout

#以下是給fileftp.java使用的專屬Category
log4j.category.doftp.name=info, X
#以下設定false時,訊息不會往rootCategory送,只會在doftp.name的自訂Categoey中
log4j.additivity.doftp.name=false

#設定 Appenders
#### First appender writes to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

### 設定doftp.name是RollingFile的方式
log4j.appender.X=org.apache.log4j.RollingFileAppender
log4j.appender.X.File=doftp.log
log4j.appender.X.MaxFileSize=300KB
log4j.appender.X.MaxBackupIndex=2
log4j.appender.X.layout=org.apache.log4j.PatternLayout
log4j.appender.X.layout.ConversionPattern=%5p %d{yyyy-MM-dd HH:mm:ss} %m%n

2006年12月25日 星期一

測試預期的 Exception 行為

當某個方法我們預期會丟出 Exception 時,
可利用 fail 這個述詞來測試。
如以下的 JUnit 語法:

public void testGetUserException() {
User u = null;
try {
u = UserFetcher.getUser("ThisUserIdDoesNotExist");
fail("Should have gotten NoSuchUserException - used a bad user ID");
} catch (NoSuchUserException expected) {
; // Expected - intentional
}
}

2006年11月16日 星期四

JDBC 實務:使用 JDBC 時,一定要放在 try 區塊中,並於 finally 區塊釋放 Connection

在 try/catch/finally 語法中,若有定義 finally 區塊,則執行 try 區塊後,一定會執行 finally 區塊的程式碼。
所以若程式有使用 JDBC 時,一定要包在 try 區塊中,並在 finally 中關閉 connection 釋放資源,才不會耗盡資源。
一般實務作法如下例:


Connection con=null;
try{
con=new Connection();
...
...
...
}finally{
try{
con.close();
}catch(Throwable e) {
String errmsg="close connection failed! errmsg is "+e.getMessage();
log.error(errmsg);
}
}

Java 實務:發生例外事件時,log 所有的錯誤訊息

系統發生無法處理的例外時,若只顯現「發生系統錯誤,請連絡資訊室!」,但完全沒有 log 錯誤訊息,對除錯是沒有幫助的,尤其是網頁程式,若沒有作 log,則程式人員是無法掌握例外當下系統的狀態。
因此系統應導入 log 機制 Ex.log4j,來幫助我們 trace 產生例外的程式。建議所有的程式,全部應放鄉 try/catch(throwable) 區塊,除了顯現「發生系統錯誤,請連絡資訊室!」外,並將所有例外訊息傳給 log 以利除錯。
建議在程式加入以下源碼:

try {
;
}catch(Throwable e){
String errmsg = "系統例外:"+e.getMessage();
log.error(errmsg);
throw new RuntimeException(errmsg, e);
}

2006年9月5日 星期二

ANT 的 depnedent 工具

ANT 對 file operation 有一項很不錯的功能,
若 file 的 directory 不存在,
就自動建立,若 file uptodate? 則不動作。

copy