我模拟了100个线程访问我的页面,查询数据库实在太慢,每个线程访问页面时都要查询数据库,然后给每个线程open一个session,并把session放到threadlocal中,但是100个用户同时访问时,建立session的数据就很慢,导致第一次查询很久才能返回,请问有没有什么好的办法提高我的查询速度啊

解决方案 »

  1.   

    JAVA连接数据库慢?
    用了连接池没有?  
    数据库数据量太多, 查询速度慢?
    建索引了没有? 分区了没有? 读写分离了没有?
      

  2.   

     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
      <property name="hibernate.connection.url">jdbc:mysql://localhost/sotv</property>
      <property name="hibernate.connection.username">meizibu</property>
      <property name="hibernate.connection.password">bgctv.com.cn</property>
      <property name="hibernate.default_batch_fetch_size">30</property>
      <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
      <property name="hibernate.c3p0.max_size">40</property>
      <property name="hibernate.c3p0.timeout">300</property>
      <property name="hibernate.c3p0.min_size">5</property>
      <property name="hibernate.c3p0.max_statements">50</property>
      <property name="hibernate.c3p0.acquire_increment">10</property>
      <property name="hibernate.c3p0.idle_test_period">300</property>
      
      <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>我的hibernate配置文件里是这样配置的,应该配置连接池了把
      

  3.   

    在你WEB 程序起来的时候
    MYSQL 里敲代码 show processlist 
    看看是不是5个sleep的链接,因为你的连接池默认是5个链接 ( <property name="hibernate.c3p0.min_size">5</property>)
    如果是则说明,你的连接池有了。
    然后跑你的测试程序:
    这个时候再show processlist 
    看看是不是有查询执行特别慢,特别慢,说明是你的数据库数据问题,需要优化
      

  4.   

    数据量太大,可以采用表分区。threadlocal不一存放太多数据,这样直接导致服务器性能降低,速度慢跟你的测试机器的配置也有关系。
      

  5.   

    我的服务器启动以后,查看mysql显示
    mysql> show processlist;
    +----+---------+-----------+------+---------+------+-------+------------------+
    | Id | User    | Host      | db   | Command | Time | State | Info             |
    +----+---------+-----------+------+---------+------+-------+------------------+
    | 36 | mei     | localhost | NULL | Query   |    0 | NULL  | show processlist |
    +----+---------+-----------+------+---------+------+-------+------------------+
    没有默认的五个线程,跑我的测试用例时,会有五百多个如下的显示 569 | mei      | localhost:33271 | sotv | Sleep   |   81 |       | NULL             |
    | 570 | mei     | localhost:33272 | sotv | Sleep   |   82 |       | NULL             |
    | 571 | mei     | localhost:33273 | sotv | Sleep   |   82 |       | NULL             |
    +-----+---------+-----------------+------+---------+------+-------+------------------+
    请问这是什么情况啊,500多个都是sleep,意思是五百多个线程都处于sleep状态吗
      

  6.   

    我发现,如果有一个连接,mysql> show processlist;就会有五个线程sleep,有6个连接,mysql> show processlist;就会有30个线程sleep,这是为什么啊
      

  7.   

    有没有配置它的属性在 Hibernate 配置属性有对应的写法,如:
    c3p0.maxIdleTime = hibernate.c3p0.timeout
    c3p0.maxPoolSize = hibernate.c3p0.max_size 
    所以,要修改一下 hibernate.cfg.xml 文档
    将 Hibernate 默认连接池参数
    <property name="connection.pool_size">5</property>
    删除或注释掉,Hibernate 默认连接池比较初级。
      

  8.   

    问题貌似解决了,速度慢是因为每个线程都打开一个session,而且是顺序建立,后来我在查询函数那加了个synchronized,速度就大幅提高了,可是具体为什么,我也没分析清楚