大量用户访问web速度太慢 struts+hibernate mysql数据库 我模拟了100个线程访问我的页面,查询数据库实在太慢,每个线程访问页面时都要查询数据库,然后给每个线程open一个session,并把session放到threadlocal中,但是100个用户同时访问时,建立session的数据就很慢,导致第一次查询很久才能返回,请问有没有什么好的办法提高我的查询速度啊 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 JAVA连接数据库慢?用了连接池没有? 数据库数据量太多, 查询速度慢?建索引了没有? 分区了没有? 读写分离了没有? <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配置文件里是这样配置的,应该配置连接池了把 在你WEB 程序起来的时候MYSQL 里敲代码 show processlist 看看是不是5个sleep的链接,因为你的连接池默认是5个链接 ( <property name="hibernate.c3p0.min_size">5</property>)如果是则说明,你的连接池有了。然后跑你的测试程序:这个时候再show processlist 看看是不是有查询执行特别慢,特别慢,说明是你的数据库数据问题,需要优化 数据量太大,可以采用表分区。threadlocal不一存放太多数据,这样直接导致服务器性能降低,速度慢跟你的测试机器的配置也有关系。 我的服务器启动以后,查看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状态吗 我发现,如果有一个连接,mysql> show processlist;就会有五个线程sleep,有6个连接,mysql> show processlist;就会有30个线程sleep,这是为什么啊 有没有配置它的属性在 Hibernate 配置属性有对应的写法,如:c3p0.maxIdleTime = hibernate.c3p0.timeoutc3p0.maxPoolSize = hibernate.c3p0.max_size 所以,要修改一下 hibernate.cfg.xml 文档将 Hibernate 默认连接池参数<property name="connection.pool_size">5</property>删除或注释掉,Hibernate 默认连接池比较初级。 问题貌似解决了,速度慢是因为每个线程都打开一个session,而且是顺序建立,后来我在查询函数那加了个synchronized,速度就大幅提高了,可是具体为什么,我也没分析清楚 Spring 事务无效 如何去掉我字符串后面的0 java 短信发送手机 struts2拦截器问题 java 计时控制方法执行问题 tomcat问题 自己制作简单的EJB Statless不能运行的问题求解!!! J2EE新手请进 有没有兴趣 大家一起做个J2EE项目学习学习 DAO模式和简单工厂模式 请教:下面代码中的错误应该如何解决?谢谢 POI导入问题,如何把HSSFCell.CELL_TYPE_NUMERIC转换成String? 求大神讲解Java的动态调用。最好有实例啊。。百度了下,不是太明白。
用了连接池没有?
数据库数据量太多, 查询速度慢?
建索引了没有? 分区了没有? 读写分离了没有?
<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配置文件里是这样配置的,应该配置连接池了把
MYSQL 里敲代码 show processlist
看看是不是5个sleep的链接,因为你的连接池默认是5个链接 ( <property name="hibernate.c3p0.min_size">5</property>)
如果是则说明,你的连接池有了。
然后跑你的测试程序:
这个时候再show processlist
看看是不是有查询执行特别慢,特别慢,说明是你的数据库数据问题,需要优化
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状态吗
c3p0.maxIdleTime = hibernate.c3p0.timeout
c3p0.maxPoolSize = hibernate.c3p0.max_size
所以,要修改一下 hibernate.cfg.xml 文档
将 Hibernate 默认连接池参数
<property name="connection.pool_size">5</property>
删除或注释掉,Hibernate 默认连接池比较初级。