JDBC一个connection下多线程查询表数据会产生线程等待

问题描述

JDBC一个connection下多线程查询表数据会产生线程等待

案例:
从Oracle数据库将表及数据通过JDBC的方式采集到另一Oracle数据库,数据量均为千万级,从源数据库读取的时候采用ORACLE的ROWNUM分页方式,JDBC每次读取1000条,批量插入目标库,测试发现ORACLE的ROWNUM分页效率很是问题,越到后面越慢,WEBLOGIC后台甚至出现线程请求超时。
后来采用多线程的方式,创建一个连接,后台起100个线程,测试发现跟单线程的效率差不了多少,分析代码后,线程在创建preparedStatement时会产生等待,是不是创建preparedStatement时资源会互斥?搞不明白。
示例代码:

        ...
  ExecutorService threadPool = Executor.newFixedThreadPool(100);
  Futrue futrue = null;
  for(int i=0; i<=recordNum/1000;) {
        for(int j=0; j<100; j++) {
             final int m = i;
             futrue = threadPool.submit( new Callable() {
                       Object[][] o = null;
                       public void call() {
                             //就是下面这句多线程下查询执行时间越往后越慢
                             o = odsDB.executeBatchQuery(tableName, MAX_BATCH_NUM*m, MAX_BATCH_NUM);
                             if(o != null) {
                                    toDB.executeBatchInsert(insertSQL, o);
                                    toDB.commit();
                             }
                       }
              });
              i++;
        }
  }
  threadPool.shutdown();
  while(true) {
        if(threadPool.Terminated()) {
             break;
        }
       Thread.sleep(2000);
  }
  .....

         被调用的odsDB.executeBatchQuery()方法

        Object[][] o = null;
 PreparedStatement ps = null;
 ResultSet   rs = null;
 String queryStr = null;
 try{
      queryStr = "SELECT  * FROM ( SELECT A.*, ROWNUM RN FROM " + tabName + " A WHERE ROWNUM <=? ) WHERE RN > ?";
      ps = this.conn.preparedStatement(queryStr);   //100条多线程下此代码执行时长越来越长。
      ps.setLong(1, count+offset);
      ps.setLong(2, count);
      rs = ps.executeQuery();
 } catch(Exception e) {
 }
 //下面代码将rs转成Obejct[][]返回

     求各路大侠帮忙这个问题要怎么解决。

解决方案

会不会是ORACLE限制线程连接数量啊

时间: 2024-10-11 18:07:42

JDBC一个connection下多线程查询表数据会产生线程等待的相关文章

linux下多线程-linux下 多线程共享数据问题

问题描述 linux下 多线程共享数据问题 环境:linux64位服务器 现有海量文件(按秒级的时间顺序源源不断的来),我需要起多线程读取这些文件,并利用文件内容构建一个比较庞大的数据结构(各种map.list的组合),另外还有一批线程检测这个数据结构某些位置的值并触发具体的任务(当然也可以在构建数据结构的同时进行触发). 问题是: 1.多线程如何并发的构建这个数据结构(结构中的list是需要按照文件到来时间排序的),要对数据结构里面的所有数据都上锁么?上锁上在哪?能不上锁么? 2.如何并行的对

mongodb-MongoDB 3.0 Java Driver在Linux Server下多线程插入数据异常

问题描述 MongoDB 3.0 Java Driver在Linux Server下多线程插入数据异常 使用MongoDB 3.0版本,部署环境为vSphere构建虚拟机,使用Java driver(3.0.0rc1)多线程写入数据到MongoDB,异常信息如下所示: Caused by: java.lang.NullPointerException at com.mongodb.connection.ProtocolHelper.isCommandOk(ProtocolHelper.java:

Linux下一个简单的多线程互斥锁的例子

本篇文章是对Linux下一个简单的多线程互斥锁的例子进行了分析介绍,需要的朋友可以参考下   复制代码 代码如下: #include <stdio.h> #include <pthread.h> pthread_mutex_t Device_mutex ; int count=0; void thread_func1() {    while(1)    {        pthread_mutex_lock(&Device_mutex);        printf(&q

sql server-求助大神一个ASP.NET下增加删除数据的问题,真心请教!

问题描述 求助大神一个ASP.NET下增加删除数据的问题,真心请教! public partial class _Default : System.Web.UI.Page { string constr = "server=192.168.1.113;database=HH;Uid=sa;pwd=000000;"; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Bind(); } }

给GridView 的数据 增加自己的一个图片下划线,请问可以吗? 可以的话?应该怎么写?

问题描述 给GridView的数据增加自己的一个图片下划线,请问可以吗?可以的话?应该怎么写?还有,我用的是TemplateField,怎么不能去掉头部?去掉Head上的字,好像还留下空的一行,请问各位高手.在线等.谢谢. 解决方案 解决方案二:急啊,兄弟们,我先自己顶个解决方案三:ShowHeader="False"就将表头去掉了

【转载】JDBC中Connection解惑

本文转载自http://shift-alt-ctrl.iteye.com/blog/1967020   关于JDBC中关于Connection的两个疑问:   1.Connection实例是线程安全的吗?     即一个connection实例,在多线程环境中是否可以确保数据操作是安全的? Java代码   private static Connection connection;       上述代码,设计会不会有问题? 一个Connection实例,即对应底层一个TCP链接,有些开发者可能考

JDBC中Connection解惑

1.Connection实例是线程安全的吗?     即一个connection实例,在多线程环境中是否可以确保数据操作是安全的? Java代码   private static Connection connection;       上述代码,设计会不会有问题? 一个Connection实例,即对应底层一个TCP链接,有些开发者可能考虑到"性能",就将代码写成上述样式,最终一个application中所有的DB操作,使用一个connection.确实减少了与DB的TCP链接个数,但

并发查询-多线程查询数据的问题

问题描述 多线程查询数据的问题 oracle数据库,我设置多线程(1-10)访问数据库的几张表ABC(表中均有大概500W数据,索引已做好),1-3访问AB,4-10访问BC,单独执行这些查询基本都在4-6秒左右,但是多线程之后有的线程去查询表需要30多秒.并发查询为何一下效率降低了这么多,是不是两条查询语句访问同一个数据库,其中一条正在查询没结束新来的就要在队列中等待?直到这个查询结束了才执行下一个查询?这种情况该怎么优化? 解决方案 你的服务器配置是不是多核CPU,多核才可能发挥提升多线程性

用Python实现一个简单的多线程TCP服务器的教程

  这篇文章主要介绍了用Python实现一个简单的多线程TCP服务器的教程,示例的运行环境为Windows操作系统,需要的朋友可以参考下 最近看<python核心编程>,书中实现了一个简单的1对1的TCPserver,但是在实际使用中1对1的形势明显是不行的,所以研究了一下如何在server端通过启动不同的线程(进程)来实现每个链接一个线程. 其实python在类的设计上已经考虑到了这一方面的需求,我们只要在自己的server上继承一下SocketServer.BaseRequestHandl