/** * 获取需要缓存的数据结果集 * * @param eleConfig Element * @param sqlConfig SqlConfig * @param request HttpServletRequest * @param queryValue QueryValue * @return boolean */ public boolean fetchCacheResultFromDb( Element eleConfig, SqlConfig sqlConfig, HttpServletRequest request, QueryValue queryValue) { CalTime calTime = new CalTime(); CalTime calTimeTotal = new CalTime(); calTimeTotal.begin(); calTime.begin(); DataSource ds = BaseFrameworkApplication.getBaseJdbcDAO().getDataSource(); Connection conn = null; Statement stmt = null; ResultSet resultSet = null; String sql = null; queryValue .calTimeSb .append("初始化时间:") .append(calTime.endString()) .append(StringUtils.LINE_SEPARATOR); try { // 根据SqlData从缓存获取缓存结果 calTime.begin(); HashMap sqlCacheMap = null; if (cacheScope == this.CACHE_APPLICATION) sqlCacheMap = cacheHashMap; if (cacheScope == this.CACHE_SESSION) { Object objSqlCacheMap = SessionUtils.getObjectAttribute(request, SessionNameConstants.SQL_CACHE_MAP); if (objSqlCacheMap != null) sqlCacheMap = (HashMap) objSqlCacheMap; else { sqlCacheMap = new HashMap(); SessionUtils.setObjectAttribute(request, SessionNameConstants.SQL_CACHE_MAP, sqlCacheMap); } } Object objCacheQueryValue = sqlCacheMap.get(sqlConfig.sqlData); queryValue .calTimeSb .append("根据SqlData从缓存获取缓存结果时间:") .append(calTime.endString()) .append(StringUtils.LINE_SEPARATOR); if (objCacheQueryValue != null && objCacheQueryValue instanceof QueryValue && sqlConfig.isOverrideCache == false) { calTime.begin(); QueryValue cacheQueryValue = (QueryValue) objCacheQueryValue; queryValue.dataSum = cacheQueryValue.dataSum; queryValue.allDataList = cacheQueryValue.allDataList; queryValue.recordCount = cacheQueryValue.recordCount; queryValue.title = cacheQueryValue.title; queryValue .calTimeSb .append("根据SqlData缓存结果赋值时间:") .append(calTime.endString()) .append(StringUtils.LINE_SEPARATOR); } else { calTime.begin(); conn = ds.getConnection(); queryValue .calTimeSb .append("获取连接时间:") .append(calTime.endString()) .append(StringUtils.LINE_SEPARATOR); calTime.begin(); stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); queryValue .calTimeSb .append("创建Statement时间:") .append(calTime.endString()) .append(StringUtils.LINE_SEPARATOR); // 获取Count /* sql = sqlConfig.sqlCount; resultSet = stmt.executeQuery(sql); if(resultSet.next()) { queryValue.recordCount = resultSet.getInt(1); } if(queryValue.recordCount > cacheLimit) return false; LogUtils.logTimer(logger,"通用查询:获取数据:Count时间" + calTime.endString()); */ calTime.begin(); sql = sqlConfig.sqlData + sqlConfig.sqlOrder; resultSet = stmt.executeQuery(sql); if (logger.isDebugEnabled()) { logger.debug( "通用查询:查询" + this.query.getQueryName() + "获取数据,Sql为:" + StringUtils.LINE_SEPARATOR); logger.debug(sql.replaceAll("[\n][ \t]*", "\n").replaceAll("[\n]+", "\n")); } queryValue .calTimeSb .append("Sql执行时间:") .append(calTime.endString()) .append(StringUtils.LINE_SEPARATOR); // 获取标题 calTime.begin(); ResultSetMetaData rsmd = resultSet.getMetaData(); int columnCount = rsmd.getColumnCount(); queryValue.title = new String[columnCount]; queryValue.dataType = new int[columnCount]; for (int i = 0; i < rsmd.getColumnCount(); i++) { queryValue.dataType[i] = rsmd.getColumnType(i + 1); queryValue.title[i] = rsmd.getColumnLabel(i + 1); } queryValue .calTimeSb .append("获取标题时间:") .append(calTime.endString()) .append(StringUtils.LINE_SEPARATOR); // 获取数据 calTime.begin(); while (resultSet.next()) { String[] data = new String[columnCount]; for (int i = 0; i < rsmd.getColumnCount(); i++) { data[i] = resultSet.getString(i + 1); } queryValue.allDataList.add(data); } resultSet.close(); queryValue.recordCount = queryValue.allDataList.size(); queryValue .calTimeSb .append("获取数据时间:") .append(calTime.endString()) .append(StringUtils.LINE_SEPARATOR); // 随机处理 calTime.begin(); if (needRadom) { queryValue.allDataList = ArrayListUtils.random(queryValue.allDataList); } queryValue .calTimeSb .append("随机处理时间:") .append(calTime.endString()) .append(StringUtils.LINE_SEPARATOR); // 统计数据获取 if (sqlConfig.sqlDataSum.length() > 0) { calTime.begin(); sql = sqlConfig.sqlDataSum; resultSet = stmt.executeQuery(sql); rsmd = resultSet.getMetaData(); if (resultSet.next()) { queryValue.dataSum = new String[queryValue.title.length]; for (int i = 0; i < rsmd.getColumnCount() && i < queryValue.dataSum.length; i++) { queryValue.dataSum[i] = resultSet.getString(i + 1); } } queryValue .calTimeSb .append("统计数据时间:") .append(calTime.endString()) .append(StringUtils.LINE_SEPARATOR); } } sqlCacheMap.put(sqlConfig.sqlData, queryValue); queryValue .calTimeSb .append("从缓存获取数据时间:") .append(calTimeTotal.endString()) .append(StringUtils.LINE_SEPARATOR); return true; } catch (SQLException ex) { throw new JdbcException("通用查询:Sql执行错误", sql, ex); } finally { JdbcUtils.close(resultSet, stmt, conn); } }
/** * 从数据库获取一个页面的结果 * * @param eleConfig Element * @param sqlConfig SqlConfig * @param request HttpServletRequest * @param queryValue QueryValue */ public void fetchPageResultFromDb( Element eleConfig, SqlConfig sqlConfig, HttpServletRequest request, QueryValue queryValue) { DataSource ds = BaseFrameworkApplication.getBaseJdbcDAO().getDataSource(); Connection conn = null; Statement stmt = null; ResultSet resultSet = null; String sql = null; try { conn = ds.getConnection(); stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); sql = sqlConfig.sqlData + sqlConfig.sqlOrder; resultSet = stmt.executeQuery(sql); if (logger.isDebugEnabled()) { logger.debug( "通用查询:查询" + this.query.getQueryName() + "获取数据,Sql为:" + StringUtils.LINE_SEPARATOR); logger.debug(sql.replaceAll("[\n][ \t]*", "\n").replaceAll("[\n]+", "\n")); } // 获取标题 ResultSetMetaData rsmd = resultSet.getMetaData(); int columnCount = rsmd.getColumnCount(); queryValue.title = new String[columnCount]; queryValue.dataType = new int[columnCount]; for (int i = 0; i < rsmd.getColumnCount(); i++) { queryValue.dataType[i] = rsmd.getColumnType(i + 1); queryValue.title[i] = rsmd.getColumnLabel(i + 1); } // TODO 首次是否查询 if (true) { // 计算位置并跳转 int position = 0; if (queryValue.pageSize > 0) { position = queryValue.pageSize * (queryValue.pageNo - 1); if (position > 0) resultSet.absolute(position); } // 查询数据 int record = 0; while ((record < queryValue.pageSize || queryValue.pageSize == -1) && resultSet.next()) { String[] data = new String[columnCount]; for (int i = 0; i < rsmd.getColumnCount(); i++) { data[i] = resultSet.getString(i + 1); } queryValue.dataList.add(data); record++; } if (resultSet.next()) queryValue.hasNextPage = true; resultSet.close(); // 查询统计数据 if (sqlConfig.sqlDataSum.length() > 0) { sql = sqlConfig.sqlDataSum; resultSet = stmt.executeQuery(sql); rsmd = resultSet.getMetaData(); if (resultSet.next()) { queryValue.dataSum = new String[queryValue.title.length]; for (int i = 0; i < rsmd.getColumnCount() && i < queryValue.dataSum.length; i++) { queryValue.dataSum[i] = resultSet.getString(i + 1); } } } if (needCount && sqlConfig.sqlCount.length() > 0) { sql = sqlConfig.sqlCount; resultSet = stmt.executeQuery(sql); if (resultSet.next()) { queryValue.recordCount = resultSet.getInt(1); } } if (queryValue.groupList != null) { // Group从数据中获取MetaData for (int i = 0; i < queryValue.groupList.size(); i++) { Group group = (Group) queryValue.groupList.get(i); // 仅对没有metadata的进行处理(没有配置metadata获取方式) if (group.metadata.size() == 0) { ArrayList metadataList = new ArrayList(); // 在数据集中循环 for (int j = 0; j < queryValue.dataList.size(); j++) { String[] data = (String[]) queryValue.dataList.get(j); // 数组越界检查 if (data.length < i) continue; // 在metadataList中查询是否存在 boolean exist = false; for (int k = 0; k < metadataList.size(); k++) { if (((String[]) metadataList.get(k))[0].equals(data[i])) { exist = true; break; } } // 如果metadataList中没有就插入 if (!exist && data[i] != null) metadataList.add(new String[] {data[i]}); } group.metadata = metadataList; } // if(group.metadata.size() == 0) } // for(int i = 0; i < queryValue.groupList.size(); i++) } // Group从数据中获取MetaData } } catch (SQLException ex) { throw new JdbcException("通用查询:Sql执行错误", sql, ex); } finally { JdbcUtils.close(resultSet, stmt, conn); } }