一个ServiceLocator模式的实现
import javax.naming.*;import javax.naming.NamingException;import javax.rmi.PortableRemoteObject;import javax.ejb.EJBHome;import javax.ejb.EJBLocalHome;import javax.sql.DataSource;import java.util.*;import java.sql.*;/** *//** * 实现 service locater 模式,用于由客户端来调用以通过JNDI查 * 找相关的 ejb或是其它服务的入口. * */public final class ServiceLocater { protected static ServiceLocater inst = new ServiceLocater(); private InitialContext ic = null; private Map ejbHomeCache = null; private Map dataSourceCache = null; protected ServiceLocater() { try { dataSourceCache = Collections.synchronizedMap(new HashMap()); ejbHomeCache = Collections.synchronizedMap(new HashMap()); ic = new InitialContext(); } catch (Exception e) { e.printStackTrace(); } } /** *//** * 取得 servicelocater的单子实例. * */ synchronized public static ServiceLocater getInstance() { return inst; } /** *//** *查找并返回一个数据源 * @param name String 数据源名称 * @return DataSource ,查找不到则抛出异常. * @throws NamingException ,查找不到或是类型不对。 * */ private DataSource lookUpDataSource(String name) throws NamingException { DataSource tmpDS = (DataSource)this.dataSourceCache.get(name); if (tmpDS == null) { try { tmpDS = (DataSource)this.ic.lookup(name); this.dataSourceCache.put(name, tmpDS); } catch (NamingException namE) { throw namE; } catch (Exception otherE) { throw new NamingException(otherE.getMessage()); } } return tmpDS; } /** *//** * 查找并返回一个远程接口 * @param jndiHomeName ebj名字 * @param className ejb类名字 * @return * @throws ServiceLocatorException */ public EJBHome getRemoteHome(String jndiHomeName, Class className) throws ServiceLocatorException { EJBHome home = (EJBHome)this.ejbHomeCache.get(jndiHomeName); if (home == null) { try { Object objref = ic.lookup(jndiHomeName); Object obj = PortableRemoteObject.narrow(objref, className); home = (EJBHome) obj; this.ejbHomeCache.put(jndiHomeName, home); } catch (NamingException ne) { throw new ServiceLocatorException(ne); } catch (Exception e) { throw new ServiceLocatorException(e); } } return home; } /** *//** * 查找并返回一个本地接口 * @param jndiHomeName jndiHomeName名字 * @return 一个本地接口 * @throws ServiceLocatorException */ public EJBLocalHome getLocalHome(String jndiHomeName) throws ServiceLocatorException { EJBLocalHome home = null; try { home = (EJBLocalHome) ic.lookup(jndiHomeName); } catch (NamingException ne) { throw new ServiceLocatorException(ne); } catch (Exception e) { throw new ServiceLocatorException(e); } return home; } /** *//** *查找一个数据源,并取得一个连接. * @param name String 数据源名称 * @return DataSource ,查找不到则抛出异常. * @throws NamingException ,查找不到或是类型不对。 * */ public Connection getConnection(String DataSourceJNDIName) throws SQLException { try { Connection conn = this.lookUpDataSource(DataSourceJNDIName).getConnection(); conn.setAutoCommit(false); //conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); return conn; } catch (Exception e) { e.printStackTrace(); throw new SQLException(e.getMessage()); } }}?