一个ServiceLocator模式的实现 EJBSQL
程序员文章站
2022-03-10 23:52:20
...
废话不说,代码说话:
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());
}
}
}
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());
}
}
}
下一篇: Git常用的几个命令