我对 GlassFish 和 SAP JCo 连接器 (sapjco3.jar) 有疑问
我在启动 J2EE 应用程序 (jwm.ear) 时加载它,并在第一次需要连接到 SAP 时将其初始化为单例。
问题是这个 jar 始终在内存中初始化,如果我需要更改单个参数,我需要重新启动 glassfish 以卸载初始化的连接。停止或取消部署应用程序不会卸载 sapjco.jar,并且应用程序的进一步重新部署永远不会获得新的连接参数,第一次初始化保持到 GlassFish 重新启动。
有人知道如何卸载或重新初始化这个库吗?最好即使没有重新部署应用程序,第一次激活应用程序时我有对 jcoProvider 的引用,下一次激活会获得对 jcoProvider 的空引用,但 jcoProvider 继续在内存中用初始值实例化。
问候!
注意:GlassFish 在 Windows 2008 服务器中是 2.1 版,jdk 是 1.6.0.14 sapjco3.jar 和 sapjco3.dll 复制到 \domains\domain1\lib\ext 并且是 SAP java 连接器的第 3 版。
单例获取 SAP 连接:
包 es.grupotec.ejb.SAP;
导入 com.sap.conn.jco.JCoDestination;
导入 com.sap.conn.jco.JCoDestinationManager;
导入 com.sap.conn.jco.JCoException;
导入 com.sap.conn.jco.ext.DestinationDataProvider;
导入 com.sap.conn.jco.ext.Environment;
导入 es.grupotec.ejb.util.ConexionSAPException;
导入 java.util.Properties;
公共最终类 SAP {
私有静态字符串 SAP_SERVER = "JWM";
私有静态 SAP 实例 = null;
私有静态 JCOProvider jcoProvider = null;
私人 SAP() {
// 仅用于阻止实例化。
}
// 获取 SAP 连接
公共静态同步 JCoDestination getDestination() 抛出 ConexionSAPException {
JCoDestination jcoDestination = null;
if (Environment.isDestinationDataProviderRegistered()) {
尝试 {
jcoDestination = JCoDestinationManager.getDestination(SAP_SERVER);
返回 jcoDestination;
} 捕捉(JCoException ex){
抛出新的 ConexionSAPException(ex.getMessage());
}
}
// 创建新连接
如果(jcoProvider == null)初始化();
// 获取连接
尝试 {
jcoDestination = JCoDestinationManager.getDestination(SAP_SERVER);
返回 jcoDestination;
} 捕捉(JCoException ex){
抛出新的 ConexionSAPException(ex.getMessage());
}
}
// 初始化与 SAP 的连接
公共静态同步 void init() 抛出 ConexionSAPException {
SAPVO sap = 新 SAPVO();
属性属性 = 新属性();
如果(jcoProvider == null){
// 从数据库中获取 SAP 配置
尝试 {
sap = SAPDAO.getSAPConfig();
} 捕捉(异常前){
抛出新的 ConexionSAPException(ex.getMessage());
}
// 创建连接对象
jcoProvider = 新的 JCOProvider();
}
properties.setProperty(DestinationDataProvider.JCO_ASHOST, sap.getJCO_ASHOST());
properties.setProperty(DestinationDataProvider.JCO_SYSNR, sap.getJCO_SYSNR());
properties.setProperty(DestinationDataProvider.JCO_CLIENT, sap.getJCO_CLIENT());
properties.setProperty(DestinationDataProvider.JCO_USER, sap.getJCO_USER());
properties.setProperty(DestinationDataProvider.JCO_PASSWD, sap.getJCO_PASSWD());
properties.setProperty(DestinationDataProvider.JCO_LANG, sap.getJCO_LANG());
尝试 {
jcoProvider.changePropertiesForABAP_AS(属性);
} 捕捉(异常 e){
抛出新的 ConexionSAPException(e.getMessage());
}
}
公共静态同步无效更改(SAPVO sap)抛出 ConexionSAPException {
属性属性 = 新属性();
// 如果连接为空,则创建一个新的
if(jcoProvider == null) jcoProvider = new JCOProvider();
properties.setProperty(DestinationDataProvider.JCO_ASHOST, sap.getJCO_ASHOST());
properties.setProperty(DestinationDataProvider.JCO_SYSNR, sap.getJCO_SYSNR());
properties.setProperty(DestinationDataProvider.JCO_CLIENT, sap.getJCO_CLIENT());
properties.setProperty(DestinationDataProvider.JCO_USER, sap.getJCO_USER());
properties.setProperty(DestinationDataProvider.JCO_PASSWD, sap.getJCO_PASSWD());
properties.setProperty(DestinationDataProvider.JCO_LANG, sap.getJCO_LANG());
尝试 {
jcoProvider.changePropertiesForABAP_AS(属性);
} 捕捉(异常 e){
抛出新的 ConexionSAPException(e.getMessage());
}
}
// 防止通过克隆实例化
@覆盖
公共对象克隆()抛出 CloneNotSupportedException {
抛出新的 CloneNotSupportedException();
}
}
JCo 提供者实现:
包 es.grupotec.ejb.SAP;
导入 com.sap.conn.jco.ext.DestinationDataEventListener;
导入 com.sap.conn.jco.ext.DestinationDataProvider;
导入 com.sap.conn.jco.ext.Environment;
导入 es.grupotec.ejb.util.ConexionSAPException;
导入 java.util.Properties;
公共类 JCOProvider 实现 DestinationDataProvider {
私有字符串 SAP_SERVER = "JWM";
私有 DestinationDataEventListener 事件监听器;
私有属性 ABAP_AS_properties;
公共 JCOProvider(){
}
公共 JCOProvider(SAPVO 树液){
ABAP_AS_properties = 新属性();
ABAP_AS_properties.setProperty(DestinationDataProvider.JCO_ASHOST, sap.getJCO_ASHOST());
ABAP_AS_properties.setProperty(DestinationDataProvider.JCO_SYSNR, sap.getJCO_SYSNR());
ABAP_AS_properties.setProperty(DestinationDataProvider.JCO_CLIENT, sap.getJCO_CLIENT());
ABAP_AS_properties.setProperty(DestinationDataProvider.JCO_USER, sap.getJCO_USER());
ABAP_AS_properties.setProperty(DestinationDataProvider.JCO_PASSWD, sap.getJCO_PASSWD());
ABAP_AS_properties.setProperty(DestinationDataProvider.JCO_LANG, sap.getJCO_LANG());
ABAP_AS_properties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, sap.getJCO_POOL_CAPACITY());
ABAP_AS_properties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, sap.getJCO_PEAK_LIMIT());
尝试 {
if (!Environment.isDestinationDataProviderRegistered())
Environment.registerDestinationDataProvider(this);
否则 changePropertiesForABAP_AS(ABAP_AS_properties);
} 捕捉(异常前){
字符串味精 = ex.getMessage();
}
}
@覆盖
公共属性 getDestinationProperties(字符串名称){
if (name.equals(SAP_SERVER) && ABAP_AS_properties!=null) 返回 ABAP_AS_properties;
否则返回空值;
}
@覆盖
公共布尔支持事件(){
返回真;
}
@覆盖
公共无效 setDestinationDataEventListener(DestinationDataEventListener eventListener) {
this.eventListener = 事件监听器;
}
公共无效changePropertiesForABAP_AS(属性属性)抛出ConexionSAPException {
尝试 {
if (!Environment.isDestinationDataProviderRegistered()) {
如果(ABAP_AS_properties == null)ABAP_AS_properties = 属性;
Environment.registerDestinationDataProvider(this);
}
如果(属性 == null){
if (eventListener != null) eventListener.deleted(SAP_SERVER);
ABAP_AS_properties = null;
} 别的 {
ABAP_AS_properties = 属性;
if (eventListener != null) eventListener.updated(SAP_SERVER);
}
} 捕捉(异常前){
抛出新的 ConexionSAPException(ex.getMessage());
}
}
}