Browse Source

连接池

liwh 1 year ago
parent
commit
1806f3935c

+ 23 - 10
cql-service/src/main/java/cn/com/taiji/cql/service/impl/ECqlServiceImpl.java

@@ -2,6 +2,7 @@ package cn.com.taiji.cql.service.impl;
 import cn.com.taiji.common.domain.PageResult;
 import cn.com.taiji.common.domain.Result;
 import cn.com.taiji.common.enums.CommonConstant;
+import cn.com.taiji.common.util.HashCodeUtil;
 import cn.com.taiji.common.util.IdGenerator;
 import cn.com.taiji.cql.service.IECqlService;
 import com.alibaba.fastjson.JSONObject;
@@ -29,11 +30,14 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 @Slf4j
 @Service
 public class ECqlServiceImpl implements IECqlService{
 
+    private Map<String,DataStore> dataStoreMaps = new ConcurrentHashMap<String,DataStore>();
+
     /**
      * cql 通用查询接口
      * @param mapParams
@@ -49,8 +53,12 @@ public class ECqlServiceImpl implements IECqlService{
 
         String host = mapParams.get(JDBCDataStoreFactory.HOST.key).toString();
 
+        String port = mapParams.get(JDBCDataStoreFactory.PORT.key).toString();
+
         String database = mapParams.get(JDBCDataStoreFactory.DATABASE.key).toString();
 
+        int hashKey = HashCodeUtil.hashCode(host+"-"+port+"-"+database);
+
         //查询记录总数
         Long count =0l;
 
@@ -66,11 +74,23 @@ public class ECqlServiceImpl implements IECqlService{
 
         try {
 
-            dataStore = DataStoreFinder.getDataStore(mapParams);
+            if(dataStoreMaps.containsKey(String.valueOf(hashKey))){
 
-            if (dataStore != null) {
+                dataStore = dataStoreMaps.get(String.valueOf(hashKey));
 
-                log.info("系统连接到位于:" + host + "的空间数据库" + database + "成功!");
+                log.info("系统从内存连接到位于:" + host + "的空间数据库" + database + "成功!");
+
+            }else{
+
+                dataStore = DataStoreFinder.getDataStore(mapParams);
+
+                dataStoreMaps.put(String.valueOf(hashKey),dataStore);
+
+                log.info("系统新建连接到位于:" + host + "的空间数据库" + database + "成功!");
+
+            }
+
+            if (dataStore != null) {
 
                 //根据表名获取source
                 SimpleFeatureSource fSource=dataStore.getFeatureSource(mapParams.get("tableName").toString());
@@ -210,13 +230,6 @@ public class ECqlServiceImpl implements IECqlService{
             e.printStackTrace();
             log.error("系统连接到位于:" + mapParams.get(JDBCDataStoreFactory.HOST.key) + "的空间数据库" + mapParams.get(JDBCDataStoreFactory.DATABASE.key) + "失败!请检查相关参数");
 
-        }finally {
-
-            if(dataStore !=null){
-
-                dataStore.dispose();
-
-            }
         }
 
         int respCode = 0;

+ 16 - 0
tile-common/src/main/java/cn/com/taiji/common/util/HashCodeUtil.java

@@ -0,0 +1,16 @@
+package cn.com.taiji.common.util;
+
+public class HashCodeUtil {
+
+    public static int hashCode(String str) {
+
+        int hash = 0;
+
+        for (int i = 0; i < str.length(); i++) {
+            hash = hash * 31 + (int)str.charAt(i);
+        }
+
+        return hash & 0x7FFFFFFF;
+    }
+
+}

+ 29 - 10
tile-service/src/main/java/cn/com/taiji/tile/service/impl/TileServiceImpl.java

@@ -31,19 +31,38 @@ public class TileServiceImpl implements ITileService {
 
         //2根据cql规则获取图层对应的空间地理数据
 
+        StringBuffer filterCqlStr = new StringBuffer();
 
-        StringBuffer sbBbox = new StringBuffer();
-        sbBbox.append("(bbox (");
-        sbBbox.append(geoDs.getBboxColumn()+",");
-        sbBbox.append(requestParam.getBbox()+"))");
+        String filterCql = requestParam.getCqlFilter();
+
+        if(filterCql !=null && !"".equals(filterCql)){
 
+            filterCqlStr.append(filterCql);
+        }
+
+        String bbox = requestParam.getBbox();
+
+        if(bbox !=null && !"".equals(bbox)){
+
+            StringBuffer sbBbox = new StringBuffer();
+            sbBbox.append("(bbox (");
+            sbBbox.append(geoDs.getBboxColumn()+",");
+            sbBbox.append(requestParam.getBbox()+"))");
+
+            if(filterCqlStr.length() >0){
+
+                filterCqlStr.append(" and "+sbBbox.toString());
+            }else{
+
+                filterCqlStr.append(sbBbox.toString());
+
+            }
+
+        }
 
-//        String filterCql = requestParam.getCqlFilter()+" and "+sbBbox.toString();
-//        String filterCql = sbBbox.toString();
 
-        String filterCql = requestParam.getCqlFilter();
 
-        System.out.println("查询条件:"+filterCql);
+        System.out.println("查询条件:"+filterCqlStr.toString());
 
         Map<String, Object> cqlDsParams = new HashMap<String, Object>();
         cqlDsParams.put(JDBCDataStoreFactory.DATABASE.key, geoDs.getDataBase());
@@ -59,7 +78,7 @@ public class TileServiceImpl implements ITileService {
         Map<String, Object> sortParams = new HashMap<String, Object>();
         sortParams.put("sort","asc");
 
-        PageResult pageResult = ecqlService.cqlQuery4Mysql(cqlDsParams,filterCql,sortParams,null);
+        PageResult pageResult = ecqlService.cqlQuery4Mysql(cqlDsParams,filterCqlStr.toString(),sortParams,null);
 
         if(pageResult.getRecordCount() >0){
 
@@ -72,7 +91,7 @@ public class TileServiceImpl implements ITileService {
 
         }else{
 
-            log.info("根据cql规则:"+sbBbox.toString()+"和图层代码:" + requestParam.getLayers() + " 没有找到图层对应的数据源的空间地理数据");
+            log.info("根据cql规则:"+filterCqlStr.toString()+"和图层代码:" + requestParam.getLayers() + " 没有找到图层对应的数据源的空间地理数据");
         }
 
         return new byte[0];