0 0

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个答案 按时间排序 按投票排序

0 0

如果是多线程的话,按照同样的sql语句导出来的数据肯定是一样的。
建议使用分页,每个线程导出不同的页,保证数据不重复。
另外还要考虑是否在导出的过程中,有些的符合导出要求的数据插入。

2012年6月30日 22:48
0 0

线程中,数据不用list集合,这样肯定出错,用线程中专门给的集合吧及队列queue,先改这个吧

2012年6月30日 15:21
0 0

应该把这个TaskWithQueryExcelResult全部贴出来看看。
另外怀疑这个: conditionPageTemp = (ConditionPage)conditionPage.clone(); 是否是深度克隆,如果不是那就有问题了。建议这个conditionPage还是用new的好。

2012年6月29日 13:39
0 0

1.先把sql打出来看看,是不是每句sqlwhere条件都一样,排除是否是sql原因。
2.检查ExcelUtil.fetchData,看是否有多线程bug。

感觉代码很乱,都用了ibatis了,为何还要自己调用PreparedStatement.executeQuery()呢。

2012年6月29日 13:29

相关推荐

    struts2+spring+ibatis+mysql

    "Struts2+Spring+Ibatis+MySQL" 是一个经典的Java Web开发框架组合,用于构建高效、可扩展的企业级应用程序。这个组合集成了强大的MVC(Model-View-Controller)框架Struts2、依赖注入与面向切面编程的Spring框架、...

    spring+ibatis+jsp集成实现数据库查询分页

    本教程将深入探讨如何使用Spring、iBatis和JSP这三个组件来集成实现数据库查询和分页功能。这三个技术结合,能够构建出高效、灵活且易于维护的数据访问层。 首先,Spring是一个开源的应用框架,提供依赖注入(DI)...

    ibatis+Spring demo

    内容包里面是源代码,运行该例子的方式就是,使用里面的sql文件还原数据库。...使用cmd进入该解压包,运行 java -jar *.jar ibatis2spring....欲了解代码的详细,请访问作者博客,搜索《ibatis + Spring 多表查询》文章。

    Struts2+iBATIS+Spring整合

    Struts2+iBATIS+Spring整合是Java Web开发中一种常见的技术栈组合,这三种框架协同工作,可以构建出高效、灵活的企业级应用。Struts2作为MVC(Model-View-Controller)架构的一部分,主要负责处理HTTP请求,管理前端...

    SpringMVC+ibatis+velocity整合例子

    本示例聚焦于“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实例 velocity+ibatis+mysql+exlipse实例

    compass+ibatis+spring+struts2整合开发

    compass+ibatis+spring+struts2整合开发compass+ibatis+spring+struts2整合开发compass+ibatis+spring+struts2整合开发compass+ibatis+spring+struts2整合开发

    Ibatis+Castle

    Ibatis+Castle源码加资料Castle+iBatisNet+Castle.MVC的ASP.NET架构及其搭建方法。之前也尝试过Castle+iBatisNet+MonoRail的架构,该架构非常类似于J2EE中的Spring + Struts + iBatis的轻量级架构。虽然已经非常熟悉...

    纯净版SpringMVC+Ibatis+log4j环境

    在这个“纯净版SpringMVC+Ibatis+log4j环境”中,我们将深入探讨这三个组件的核心概念、功能以及它们如何协同工作。 **SpringMVC** 是Spring框架的一部分,它是一个Model-View-Controller(MVC)框架,用于处理Web...

    Spring MVC+ibatis+oracle框架整合

    在"Spring MVC+ibatis+Oracle资源整合,实现简单的增删改查"的项目中,开发者可能已经创建了学生(stu)相关的实体类、Mapper接口、XML配置文件和DAO实现。例如,"stu"可能是学生表的名称,对应的实体类为Student,...

    spring+ibatis+oracle分页缓存源码

    总的来说,"spring+ibatis+oracle分页缓存源码"项目展示了如何在Spring管理的环境中,利用iBatis和Oracle数据库实现高效的数据分页和缓存策略。通过理解和实践这些技术,开发者可以构建出更加健壮、响应快速的Web...

    spring +springmvc+ibatis +easyUI

    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 Struts2-Ibatis+spring.rar

    四个struts1(2)+spring+ibatis+jquery整合实例

    Struts1(2)+Spring+Ibatis+jQuery是一个经典的Java Web开发框架组合,它们各自在Web应用的不同层面上发挥着关键作用。这个整合实例旨在展示如何将这四个技术有效地结合在一起,创建一个高效、可维护的Web应用程序...

    oa_权限系统ibatis+spring+struts2

    oa_权限系统ibatis+spring+struts2 oa_权限系统ibatis+spring+struts2 oa_权限系统ibatis+spring+struts2

    struts2+spring+ibatis+jquery ajax的登陆注册实时验证

    Struts2、Spring、iBatis和jQuery AJAX是Java Web开发中的四大核心技术,它们共同构建了一个功能强大的MVC(模型-视图-控制器)架构。本文将深入探讨这些技术在登录注册系统中的应用。 首先,Struts2是Apache基金会...

    struts2+ibatis+spring 安例

    Struts2作为MVC(Model-View-Controller)框架,主要负责处理用户请求并转发到相应的控制器,提供了丰富的拦截器机制,可以方便地进行权限控制、日志记录等操作。Struts2还支持多种结果类型和模板技术,如JSP、...

    仓储管理系统(struts2+ibatis+jsp+jquery)

    Ibatis与Hibernate等ORM框架不同,它不完全封装SQL,而是提供灵活的SQL控制,更适合复杂的数据库操作,如联表查询、存储过程调用等。 **jQuery**: jQuery是一个广泛使用的JavaScript库,它简化了HTML文档遍历、...

    ibatis+spring+struts2 整合开发例子

    "ibatis+spring+struts2 整合开发例子"就是一个典型的Java Web应用集成开发案例,旨在帮助开发者理解和掌握这三大框架的协同工作原理。接下来,我们将详细讨论这三个组件以及它们的整合过程。 Ibatis是一个轻量级的...

    struts+spring+ibatis+mysql实例

    struts spring ibatis mysql 分页,增删改查,以及导出excle

Global site tag (gtag.js) - Google Analytics