doLookup使っていますか?

今のjavaはJNDIのルックアップに便利なInitialContextにstaticなメソッドが用意されている。genericsも使われていてキャストも必要がない。

sunのjdkソースコードを見ると

    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をフィールドインジェクションとかできるのかな?
できるのならそれだけでいいけど。