-
IBATIS+ExecutorService进行多线程查询问题0
我们系统中有一个比较大的导出功能,考虑到数据量比较大,消耗时间较长,所以采用ExecutorService多线程框架处理,每个线程处理5000条数据,现在发现多线程时每个线程的数据都是一样的,我自己初步分析应该是getsqlmapclientTemplate共用的原因,求高手分析,代码如下:
dao类代码:Long count = (Long) this .getSqlMapClientTemplate() .queryForObject( "sql.perfomaceQuery.getContractPerfomerByConditionsPageCount2", conditionPage.getConditionMap()); ExecutorService executorService = Executors.newCachedThreadPool(); long pagecount = (count%5000==0)?(count/5000):((count/5000)+1); List<Future<List<ContractInstance>>> ciallList= new ArrayList<Future<List<ContractInstance>>>(); for (int i = 1; i <= pagecount; i++) { //使用ExecutorService执行Callable类型的任务,并将结果保存在future变量中 ConditionPage conditionPageTemp= null; try { conditionPageTemp = (ConditionPage)conditionPage.clone(); } catch (CloneNotSupportedException e) { return new ArrayList<ContractInstance>(); } conditionPageTemp.setPageSize(5000); conditionPageTemp.setCurrentPage(i); Future<List<ContractInstance>> subList = executorService.submit(new TaskWithQueryExcelResult(conditionPageTemp,this.getSqlMapClientTemplate()) ); //将任务执行结果存储到List中 ciallList.add(subList); } //<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) //遍历任务的结果 List<ContractInstance> ciList = new ArrayList<ContractInstance>(); for (Future<List<ContractInstance>> fs : ciallList) { try { ciList.addAll(fs.get()); } catch (InterruptedException e) { log.debug("InterruptedException is:" + e.getMessage()); } catch (Exception e) { e.printStackTrace(); } finally { //启动一次顺序关闭,执行以前提交的任务,但不接受新任务。如果已经关闭,则调用没有其他作用。 executorService.shutdown(); } }
任务类代码:public List<ContractInstance> call() throws Exception { List<ContractInstance> ciList = new ArrayList<ContractInstance>(); List<ExtfieldConfig> extFiledList = (List<ExtfieldConfig>)conditionPage.getConditionMap().get("extFiledList4Excel"); long time = System.currentTimeMillis(); // ciList = sct.queryForList( // "sql.perfomaceQuery.getContractPerfomerByConditions4Excel", // conditionPage.getConditionMap()); long time1 = System.currentTimeMillis(); SqlMapClientImpl sm = (SqlMapClientImpl)(sct.getSqlMapClient()); SqlMapExecutorDelegate smed = sm.getDelegate(); SqlMapExecutorDelegateExtend smede = new SqlMapExecutorDelegateExtend(smed); Connection con = null; ResultSet rs =null; try { com.ibatis.sqlmap.engine.scope.SessionScope ss = new com.ibatis.sqlmap.engine.scope.SessionScope(); ss.setSqlMapClient(sm); ss.setSqlMapExecutor(sm); ss.setSqlMapTxMgr(sm); con = sm.getDataSource().getConnection(); smede.setUserProvidedTransaction(ss, con); // smed.queryForList(ss, "sql.perfomaceQuery.getContractPerfomerByConditions4Excel", ""); smede.queryForList(ss, "sql.perfomaceQuery.getContractPerfomerByConditions4Excel", conditionPage.getConditionMap()); MappedStatementExtend mse = smede.getMse(); //取得运行时的sql和参数 String sqlStr = mse.getRuntimeSql(); Object[] parameters = mse.getParameters(); log.debug("contract info exporting sql is:" + sqlStr); log.debug("---and the parameters are :" + parameters); //使用jdbc查询和封装对象 PreparedStatement ps = con.prepareStatement(sqlStr); int len = parameters.length; for(int i = 0 ;i < len ;i++){ Object obj = parameters[i]; if(obj instanceof Date){ // System.out.println("----date is--------" + obj); java.sql.Date date = new java.sql.Date(((Date)obj).getTime()); ps.setDate(i+1, date); }else if(obj instanceof String){ // System.out.println("-----String is -----" + obj); ps.setString(i+1, (String)obj); }else if(obj instanceof Double ){ // System.out.println("-----Double is----" + obj); ps.setDouble(i+1, (Double)obj); }else if(obj instanceof Long){ // System.out.println("------Long is---------" + obj); ps.setLong(i+1, (Long)obj); }else if(obj instanceof Integer){ // System.out.println("------Ingeter is---------" + obj); ps.setInt(i+1, (Integer)obj); }else{ // System.out.println("--unkown type is--" + obj); ps.setObject(i+1, obj); } } rs = ps.executeQuery(); ciList = ExcelUtil.fetchData(rs,extFiledList,sqlStr); ss.cleanup(); long time2 = System.currentTimeMillis(); // System.out.println("---------------ibatis 查询所耗时间:"+(time1-time)); // System.out.println("---------------JDBC 查询所耗时间:"+(time2-time1)); } catch (Exception e) { log.error(" e.getMessage()); }finally{ try { if(null != rs){ rs.close(); } if(null != con){ con.close(); } } catch (SQLException e) { log.error(e.getMessage()); } } return ciList; }
2012年6月29日 13:17
4个答案 按时间排序 按投票排序
-
如果是多线程的话,按照同样的sql语句导出来的数据肯定是一样的。
建议使用分页,每个线程导出不同的页,保证数据不重复。
另外还要考虑是否在导出的过程中,有些的符合导出要求的数据插入。2012年6月30日 22:48
-
应该把这个TaskWithQueryExcelResult全部贴出来看看。
另外怀疑这个: conditionPageTemp = (ConditionPage)conditionPage.clone(); 是否是深度克隆,如果不是那就有问题了。建议这个conditionPage还是用new的好。2012年6月29日 13:39
-
1.先把sql打出来看看,是不是每句sqlwhere条件都一样,排除是否是sql原因。
2.检查ExcelUtil.fetchData,看是否有多线程bug。
感觉代码很乱,都用了ibatis了,为何还要自己调用PreparedStatement.executeQuery()呢。2012年6月29日 13:29
相关推荐
"Struts2+Spring+Ibatis+MySQL" 是一个经典的Java Web开发框架组合,用于构建高效、可扩展的企业级应用程序。这个组合集成了强大的MVC(Model-View-Controller)框架Struts2、依赖注入与面向切面编程的Spring框架、...
本教程将深入探讨如何使用Spring、iBatis和JSP这三个组件来集成实现数据库查询和分页功能。这三个技术结合,能够构建出高效、灵活且易于维护的数据访问层。 首先,Spring是一个开源的应用框架,提供依赖注入(DI)...
内容包里面是源代码,运行该例子的方式就是,使用里面的sql文件还原数据库。...使用cmd进入该解压包,运行 java -jar *.jar ibatis2spring....欲了解代码的详细,请访问作者博客,搜索《ibatis + Spring 多表查询》文章。
Struts2+iBATIS+Spring整合是Java Web开发中一种常见的技术栈组合,这三种框架协同工作,可以构建出高效、灵活的企业级应用。Struts2作为MVC(Model-View-Controller)架构的一部分,主要负责处理HTTP请求,管理前端...
本示例聚焦于“SpringMVC+ibatis+velocity”的整合应用,这是一套常用的Java Web开发组合,用于构建动态、数据驱动的网站。下面我们将深入探讨这三个组件的核心功能及其整合过程。 首先,SpringMVC是Spring框架的一...
velocity+ibatis+mysql+exlipse实例 velocity+ibatis+mysql+exlipse实例 velocity+ibatis+mysql+exlipse实例 velocity+ibatis+mysql+exlipse实例 velocity+ibatis+mysql+exlipse实例
compass+ibatis+spring+struts2整合开发compass+ibatis+spring+struts2整合开发compass+ibatis+spring+struts2整合开发compass+ibatis+spring+struts2整合开发
Ibatis+Castle源码加资料Castle+iBatisNet+Castle.MVC的ASP.NET架构及其搭建方法。之前也尝试过Castle+iBatisNet+MonoRail的架构,该架构非常类似于J2EE中的Spring + Struts + iBatis的轻量级架构。虽然已经非常熟悉...
在这个“纯净版SpringMVC+Ibatis+log4j环境”中,我们将深入探讨这三个组件的核心概念、功能以及它们如何协同工作。 **SpringMVC** 是Spring框架的一部分,它是一个Model-View-Controller(MVC)框架,用于处理Web...
在"Spring MVC+ibatis+Oracle资源整合,实现简单的增删改查"的项目中,开发者可能已经创建了学生(stu)相关的实体类、Mapper接口、XML配置文件和DAO实现。例如,"stu"可能是学生表的名称,对应的实体类为Student,...
总的来说,"spring+ibatis+oracle分页缓存源码"项目展示了如何在Spring管理的环境中,利用iBatis和Oracle数据库实现高效的数据分页和缓存策略。通过理解和实践这些技术,开发者可以构建出更加健壮、响应快速的Web...
iBatis支持动态SQL,可以方便地处理复杂的查询需求。 EasyUI是一个基于jQuery的前端组件库,包含了大量的UI组件,如表格、表单、树形结构、对话框等,这些组件都具有良好的交互性和响应性。EasyUI使得开发者能够...
Struts2-Ibatis+spring.rar Struts2-Ibatis+spring.rar Struts2-Ibatis+spring.rar Struts2-Ibatis+spring.rar Struts2-Ibatis+spring.rar
Struts1(2)+Spring+Ibatis+jQuery是一个经典的Java Web开发框架组合,它们各自在Web应用的不同层面上发挥着关键作用。这个整合实例旨在展示如何将这四个技术有效地结合在一起,创建一个高效、可维护的Web应用程序...
oa_权限系统ibatis+spring+struts2 oa_权限系统ibatis+spring+struts2 oa_权限系统ibatis+spring+struts2
Struts2、Spring、iBatis和jQuery AJAX是Java Web开发中的四大核心技术,它们共同构建了一个功能强大的MVC(模型-视图-控制器)架构。本文将深入探讨这些技术在登录注册系统中的应用。 首先,Struts2是Apache基金会...
Struts2作为MVC(Model-View-Controller)框架,主要负责处理用户请求并转发到相应的控制器,提供了丰富的拦截器机制,可以方便地进行权限控制、日志记录等操作。Struts2还支持多种结果类型和模板技术,如JSP、...
Ibatis与Hibernate等ORM框架不同,它不完全封装SQL,而是提供灵活的SQL控制,更适合复杂的数据库操作,如联表查询、存储过程调用等。 **jQuery**: jQuery是一个广泛使用的JavaScript库,它简化了HTML文档遍历、...
"ibatis+spring+struts2 整合开发例子"就是一个典型的Java Web应用集成开发案例,旨在帮助开发者理解和掌握这三大框架的协同工作原理。接下来,我们将详细讨论这三个组件以及它们的整合过程。 Ibatis是一个轻量级的...
struts spring ibatis mysql 分页,增删改查,以及导出excle