Tomcat5.5ではデフォルトのログ出力機能はlog4jからJDKのjava.util.loggingを利用するように変更された。
log4jのほうが出力フォーマットの設定等柔軟に変更できるのでlog4jにログ出力を統一しようと思ったら以下のことをやらなければならない。
①${tomcat.home}/common/libにcommons-logginとlog4jのライブラリをおく。
②${tomcat.home}/common/classesにlog4j.xmlをおく
2008/03/19
JavaのMessageFormat.formatメソッドについて
変換対象の文字列に「{」や「'」が含まれている場合は
以下のように「'{'」や「''」とする。
String s = "function aaa() '{' alert(''{0}''); '}' ";
結構はまりどころ。
以下のように「'{'」や「''」とする。
String s = "function aaa() '{' alert(''{0}''); '}' ";
結構はまりどころ。
Prototypeでのブラウザ判別
if (Prototype.Browser.IE6)
alert('You are using IE6');
else if (Prototype.Browser.IE)
alert('You are using IE7');
else
alert('Not IE');
2008/03/13
cayenneでPKを指定してデータを取得する時のはまりどころ
cayenneではDataObjectUtils.objectForPKによってPKを指定してデータを取得できるが
このメソッドはデフォルトでキャッシュしてしまう。なので以下のメソッドを利用しましょう。
ObjectIdQuery query = new ObjectIdQuery(new ObjectId(AAAA.class.getSimpleName(), AAAA.ID_PK_COLUMN, id), false, ObjectIdQuery.CACHE_REFRESH);
(AAAA)DataObjectUtils.objectForQuery(dataContext, query);
ここでポイントはCACHE_REFRESH を指定して常に新しい情報を取得していること。
これを指定しないとだめ
このメソッドはデフォルトでキャッシュしてしまう。なので以下のメソッドを利用しましょう。
ObjectIdQuery query = new ObjectIdQuery(new ObjectId(AAAA.class.getSimpleName(), AAAA.ID_PK_COLUMN, id), false, ObjectIdQuery.CACHE_REFRESH);
(AAAA)DataObjectUtils.objectForQuery(dataContext, query);
ここでポイントはCACHE_REFRESH を指定して常に新しい情報を取得していること。
これを指定しないとだめ
2008/01/15
2007/12/11
ibatisのはまりどころ:JDBCタイプのARRAYを利用するその2
ibatisで配列を参照できるようになったと思ったら更新ではまった。
ARRAYタイプの更新は当然JDBC実装に依存する。
僕が利用していたDBはPostgres。
JDBC規約?によればsetObjectを利用すべしとのこと。
でもJDBCソースみてみるとsetObject内には配列時の対応はないし、setArrayを利用するにもArrayはIFの為、オブジェクトの生成しずらい。
Postgresは配列対応なのになんでそういう実装がないの?
Webで検索してもよい資料はでてこない。
なので以下のような対応をしました。
一応、これでできることはできるんだけどパフォーマンスがでないだろうなー。
本気でやるならJDBCを拡張するかしたほうがよいと思うがなんでみんな対応しないんだろう?
ARRAYタイプの更新は当然JDBC実装に依存する。
僕が利用していたDBはPostgres。
JDBC規約?によればsetObjectを利用すべしとのこと。
でもJDBCソースみてみるとsetObject内には配列時の対応はないし、setArrayを利用するにもArrayはIFの為、オブジェクトの生成しずらい。
Postgresは配列対応なのになんでそういう実装がないの?
Webで検索してもよい資料はでてこない。
なので以下のような対応をしました。
一応、これでできることはできるんだけどパフォーマンスがでないだろうなー。
本気でやるならJDBCを拡張するかしたほうがよいと思うがなんでみんな対応しないんだろう?
// -- 以下コード
import java.sql.Array;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Arrays;
import java.util.List;
import com.ibatis.sqlmap.client.extensions.ParameterSetter;
import com.ibatis.sqlmap.client.extensions.ResultGetter;
import com.ibatis.sqlmap.client.extensions.TypeHandlerCallback;
public class ArrayTypeHandlerCallback implements TypeHandlerCallback {
public Object getResult(ResultGetter resultGetter) throws SQLException {
Array array = resultGetter.getArray();
if (array == null)
return null;
else
return Arrays.asList((Object[])array.getArray());
}
public void setParameter(ParameterSetter parameterSetter, Object obj)
throws SQLException {
if(obj == null){
parameterSetter.setNull(Types.ARRAY);
} else {
List lst = (List)obj;
parameterSetter.setArray(createArray(parameterSetter, lst));
}
}
public Object valueOf(String str) {
// 特につかっていないので今回は実装しない
return "";
}
public Array createArray(ParameterSetter parameterSetter, List list) throws SQLException {
Array array = null;
PreparedStatement ps = null;
try {
String arrayPhrase = toArrayPhrase(list);
if (arrayPhrase == null)
return null;
ps = parameterSetter.getPreparedStatement();
Connection cn = ps.getConnection();
String sql = "SELECT " + arrayPhrase;
ps = cn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
rs.next();
array = rs.getArray(1);
}
finally {
// 初回のPreparedStatementはIbatisによって制御されるのでcloseはしない
if (ps != null)
ps.close();
}
return array;
}
public String toArrayPhrase(List
登録:
投稿 (Atom)