doLookup使っていますか?
今のjavaはJNDIのルックアップに便利なInitialContextにstaticなメソッドが用意されている。genericsも使われていてキャストも必要がない。
public static <T> T doLookup(String name) throws NamingException { return (T) (new InitialContext()).lookup(name); }
なるほど。キャッシングしてないというわけか。それがどれだけパフォーマンスに影響が出るか調べてみた。
サーブレット内で以下のように追加した。
String jndiName = "jdbc/jpa_sample"; { long start = System.nanoTime(); InitialContext ic = new InitialContext(); for(int i=0;i<1000;i++){ DataSource ds = (DataSource) ic.lookup(jndiName); } long end = System.nanoTime(); System.out.println("lookupTime:"+(end-start)/1000/1000); } { long start = System.nanoTime(); for(int i=0;i<1000;i++){ DataSource ds = InitialContext.doLookup(jndiName); } long end = System.nanoTime(); System.out.println("doLookupTime:"+(end-start)/1000/1000); } { long start = System.nanoTime(); InitialContext ic = new InitialContext(); for(int i=0;i<1000;i++){ DataSource ds = (DataSource) ic.lookup(jndiName); } long end = System.nanoTime(); System.out.println("lookupTime:"+(end-start)/1000/1000); } { long start = System.nanoTime(); for(int i=0;i<1000;i++){ DataSource ds = InitialContext.doLookup(jndiName); } long end = System.nanoTime(); System.out.println("doLookupTime:"+(end-start)/1000/1000); }
結果
lookupTime:225
doLookupTime:167
lookupTime:154
doLookupTime:162
5%くらい遅いということかな。問題なさそう。
seasar2とかからjndiの呼び出しをしたい場合はありかな。
それとも、seasar2はJNDIをフィールドインジェクションとかできるのかな?
できるのならそれだけでいいけど。