Cache JNDI Lookup Objects
To get a
DataSource
,
or an EJB home interface, you typically create an
InitialContext
,
and then do a lookup for the needed resource. These operations are
usually very expensive, considering the fact that you perform them
all the time throughout your code.
Fortunately, you can optimize these lookups fairly easily by doing the lookup only once, and then reusing the lookup result whenever you need it again—effectively caching it. This is usually done with a singleton class. The singleton can be very simple and cache only specified objects, or it can be a sophisticated service locator that caches many arbitrary objects. An extra benefit of the singleton scheme is that you centralize the Java Naming and Security Interface (JNDI) names of your objects, so if the names change, you have to change your code in only one place: the singleton class.
Example 2-8 shows a singleton that stores several EJB home objects.
public class EJBHomeCache { private static EHBHomeCache instance; protected Context ctx = null; protected FirstEJBHome firstHome = null; protected SecondEJBHome secondHome = null; private EJBHomeCache( ) { try { ctx = new InitialContext( ); firstHome = (FirstEJBHome)PortableRemoteObject.narrow ( ctx.lookup ("java:comp/env/FirstEJBHome"), FirstEJBHome.class); secondHome = (SecondEJBHome)PortableRemoteObject.narrow ( ctx.lookup ("java:comp/env/SecondEJBHome"), FirstEJBHome.class); } catch ...