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