---------------------相关配置----------------
Srping 连接池配置:
crmmaxActive=200
crmmaxIdle=20
crmminIdle=1
crminitialSize=20数据库最大允许连接数300-----------------------------------------------目前并发100个用户时,查询和保存速度相当慢,
例如:select count(*) from tableName where 主键=‘**’;这样一条查询语句也要花30秒左右(单用户只需要几十毫秒)。
查询的主键都已经有建立索引了,而且压力测试的同时,使用PL/SQL 进行查询时,速度正常,不会出现几十秒的情况;另外,
数据库与客户端是在同一局域网,应该也不是网速问题.
请问会是什么原因引起的?

解决方案 »

  1.   

    有可能select * from v$session好像是这个吧,记不清楚了,楼主试试。
      

  2.   

    你的Application Server是?
    weblogic?tomcat?Jboss?怀疑是WAS撑不住
      

  3.   

    pl/sql正常,表明不是oracle的问题。只能从应用服务器的调度,程序逻辑去找问题所在了
      

  4.   

    这是我的datasource配置,麻烦大家帮忙看一下!<bean id="CGDataSource"
    class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName">
    <value>oracle.jdbc.driver.OracleDriver</value>
    </property>
    <property name="url">
    <value>${crmDatabase}</value>
    </property>
    <property name="username">
    <value>${crmUser}</value>
    </property>
    <property name="password">
    <value>${crmPasswd}</value>
    </property>
    <property name="maxActive">
    <value>${crmmaxActive}</value>
    </property>
    <property name="maxIdle">
    <value>${crmmaxIdle}</value>
    </property>
    <property name="minIdle">
    <value>${crmminIdle}</value>
    </property>
    <property name="initialSize">
    <value>${crminitialSize}</value>
    </property> <property name="accessToUnderlyingConnectionAllowed">
    <value>true</value>
    </property>
    <property name="testOnBorrow">
    <value>true</value>
    </property>
    <property name="testWhileIdle">
    <value>true</value>
    </property>
          <property name="validationQuery">
    <value>SELECT 1 FROM DUAL</value>
    </property>
    </bean>
      

  5.   


    跟这个应该没有多大关系。你可以在程序代码里面详细的log一下,看看application服务器得到请求和返回请求究竟是哪一步慢
      

  6.   

    数据库的并发是有限的,并发大时其时间长是必然的,有效的办法应该是在优化SQL的前提下,尽可能做数据缓存。
    如果实时性要求比较高,应该改变你的架构,考虑用内存等其他方案处理,而不是直接读取数据库。
      

  7.   

    现在关键是在压力的情况下,使用PL/SQL查询速度正常,而且通过程序进行访问时,速度变的很慢
      

  8.   

    跟踪一下,看看是getconnect慢还是query慢
    另外,lz没说清楚,是开始时慢还是一直都慢,如果是开始慢那是正常的,因为是生成连接池慢,Srping的特性决定的,没办法改变
      

  9.   


    怎么跟踪getconnect?开始会慢,慢慢恢复,不过随便并发压力的增加,速度会开始慢,直到超时
      

  10.   


    crmmaxIdle=20
    crmminIdle=1
    crminitialSize=20这两个20都改成100试试看
      

  11.   


    修改后,情况还是一样按您说的
    crmmaxActive=200
    crmmaxIdle=100
    crmminIdle=1
    crminitialSize=100100并发用户的情况下,压力测试结果:Statistics Summary Maximum Running Vusers: 100 
    Total Throughput (bytes): 427,545 
    Average Throughput (bytes/second): 1,188 
    Total Hits: 914 
    Average Hits per Second: 2.539   View HTTP Responses Summary 
    Transaction Summary  Transactions: Total Passed: 914 Total Failed: 0 Total Stopped: 99          Average Response Time Transaction Name Minimum Average Maximum Std. Deviation 90 Percent Pass Fail Stop 
    XX   6.904 29.245 83.066 16.328 52.826 144 0 23 
    XX   1.037 14.904 55.772 11.687 32.756 167 0 14 
    XX   1.89 27.359 88.353 17.5 52.179 193 0 15 
    XX   0.372 13.537 59.525 10.803 27.634 181 0 12 
    XX   0.474 8.376 32.764 7.211 18.109 109 0 11 
    XX   7.446 35.854 98.462 19.947 68.779 120 0 24 

    PL/SQL查询连接数情况
    SQL> select count(*) from v$process;
     
      COUNT(*)
    ----------
            27SQL> select count(*) from v$session where machine='DJ852J2X';
     
      COUNT(*)
    ----------
           242
      

  12.   

    问题已经解决,总结如下:
    1.应用服务器机子太滥,换好机子并采用集群方式
    2.数据库机子更滥,CPU一下就撑爆,后来换了台机子
    1.数据库存储过程效率比较低,后来做了优化。结果:
    并发300以上,查询都只有2ms