废话不说,代码说话:
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()); } }}
文章转自庄周梦蝶 ,原文发布5.16
相关资源:敏捷开发V1.0.pptx