diff --git a/src/main/java/com/sunyard/sge/database/SydApi4Database.java b/src/main/java/com/sunyard/sge/database/SydApi4Database.java index a1b402f..492e357 100644 --- a/src/main/java/com/sunyard/sge/database/SydApi4Database.java +++ b/src/main/java/com/sunyard/sge/database/SydApi4Database.java @@ -5,6 +5,7 @@ import com.sunyard.proto.Util; import com.sunyard.sge.log.LogFactory; import com.sunyard.util.SYMUtil; import org.apache.logging.log4j.Logger; +import org.codehaus.groovy.util.LockableObject; import racal.sunyard.main.SydApi4j; import java.util.Arrays; @@ -18,16 +19,18 @@ public class SydApi4Database implements SydApi { static { SydApi.SYD_SetLogConfig("./logs/", 0); } + private SydApi4j[] hsms = null; - private SydApi4j[] hsms = null; private boolean isShortLinkMode = false; public SydApi4Database() { isShortLinkMode = true; } - public SydApi4Database(SydApi4j[] hsms) { + public SydApi4Database(SydApi4j[] hsms) { + synchronized (this){ this.hsms = hsms; + } } public SydApi4j[] getHsms() { @@ -44,7 +47,6 @@ public class SydApi4Database implements SydApi { if (pcIpList.length != iPortList.length) { throw new IllegalArgumentException("ip与端口数量不一致"); } - SydApi4j[] apis = new SydApi4j[pcIpList.length]; int iDealTimeOut = allDealTimeOut / pcIpList.length; boolean connected = false; @@ -73,21 +75,31 @@ public class SydApi4Database implements SydApi { @Override public void SYD_Disconnect_Ex() { + if (isShortLinkMode) { if (null == hsms) { return; } + LockableObject lockableObject = new LockableObject(); + try { + lockableObject.lock(); + for (int i = 0; i < hsms.length; i++) { + SydApi4j api = hsms[i]; + if (null != api) { + try { + api.disconnect(); + } catch (Exception e) { - for (int i = 0; i < hsms.length; i++) { - SydApi4j api = hsms[i]; - if (null != api) { - try { - api.disconnect(); - } catch (Exception e) { - + } } } } + catch (Exception e){ + + } + finally { + lockableObject.unlock(); + } } // 配合链接池,不再需要释放。 @@ -105,25 +117,37 @@ public class SydApi4Database implements SydApi { } SydApiException le = null; - for (SydApi4j api : this.hsms) { + //加锁 + LockableObject lockableObject = new LockableObject(); + lockableObject.lock(); + try { + for (SydApi4j api : this.hsms) { - if (null == api) { - continue; - } - - try { - byte[] hash = api.SYD_SM3_LongData(pcData, null, 0); - log.debug("api.SYD_SM3_LongData方法返回值:{}", Arrays.toString(hash)); - return Util.bytes2HexString(hash); - } catch (SydApiException e) { - le = e; - if (e.getRetCode() < 0) { - log.error("HA 重试"); + if (null == api) { continue; } - throw e; + + try { + byte[] hash = api.SYD_SM3_LongData(pcData, null, 0); + log.debug("api.SYD_SM3_LongData方法返回值:{}", Arrays.toString(hash)); + return Util.bytes2HexString(hash); + } catch (SydApiException e) { + le = e; + if (e.getRetCode() < 0) { + log.error("HA 重试"); + continue; + } + throw e; + } } } + catch (Exception e){ + + } + finally { + lockableObject.unlock(); + } + throw le; } diff --git a/src/main/java/com/sunyard/sge/database/pool/SydApiPool.java b/src/main/java/com/sunyard/sge/database/pool/SydApiPool.java index 9787a9a..8c05e9e 100644 --- a/src/main/java/com/sunyard/sge/database/pool/SydApiPool.java +++ b/src/main/java/com/sunyard/sge/database/pool/SydApiPool.java @@ -58,28 +58,38 @@ public class SydApiPool extends ThreadBasedConnectPool { } // 保活接口 - protected boolean check(SydApi4Database o) { -// if (null == o) { -// return false; -// } + public boolean check(SydApi s) { + SydApi4Database o=(SydApi4Database)s; Lock l = new ReentrantLock(); - l.lock(); - SydApi4j[] hsms = o.getHsms(); - l.unlock(); + try { + l.lock(); + SydApi4j[] hsms = o.getHsms(); boolean ifBoolean = false; int length = hsms.length; for (int i = 0; i < length; i++) { if (null != hsms[i]) { try { + l.lock(); o.SYD_SM3_Hash_ShortData(new byte[8]); ifBoolean = true; } catch (Exception e) { // 忽略 hsms[i] = null; } + finally { + l.unlock(); + } } } - return ifBoolean; + return ifBoolean; + + } + catch (Exception e){ + return false; + } + finally { + l.unlock(); + } } // 释放 protected void free(SydApi o) {