废话不说,代码说话:
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());
}
}

}



















































































































































































