多线程访问数据库 spring+mybatis

private Service service; //spring注解出来的service层
private Dao;//sping注解出来的dao层
线程池初始化
ThreadPoolExecutor executor = ThreadPool.getThreadPool(5,8, 3000, TimeUnit.SECONDS, new LinkedBlockingQueue(2000));
//得到线程池中线程队列
LinkedBlockingQueue queue = (LinkedBlockingQueue) executor.getQueue();
int countTool= conList.size();
final CountDownLatch countDownLatch = new CountDownLatch(countTool);
for(int i=0;i < countTool;i++){
final Map tempMap = (Map) conList.get(i);
final Map params = new HashMap(); //传的参数
params.put("aaa",tempMap.get("aaa"));
//向线程池 放入待处理的任务信息 使用内部类进行 查询
executor.execute(new Runnable(){
public void run() {

try {
//这里调用sevice里的方法时,params的值在service层获取的都是同一个值,
//按理来说各个线程之间是没有关联的呀,
//我有打印mybati的创建connection的日志,每一个查询方法都会create a new sqlSession,为什么参数最后传进去就是一样的了呢,
Map result =service.getResult(params); //service里的方法主要是对参数进行一些处理,然后去数据库查数据
Clob clob = (Clob)result.get("clob");
//下面要把clob字段转成string,系统也会报错,为关闭的链接,
//要怎么解决啊,是和线程安全有关吗,还是我写的有错误
} catch (SQLException e) {
e.printStackTrace();
}
//线程计数器 减 1
countDownLatch.countDown();
}

});
}
//所有子线程 执行完成之后 主线程再继续向下
countDownLatch.await();
System.out.println("-------------query end------");

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!