tomcat 并发

txspace 2011-07-15 11:04:45
做的是一个手机网站,目前再高峰期的时候每小时PV可以达到1.6W~2W ,使用的是JSP+servlet,连接池使用的是c3p0,每个页面都会涉及数据库查询,数据库和tomcat是放在同一台服务器上面,再这段时候会出现数据库连接被用完了,tomcat线程也暴增,数据库是mysql5.1,用show processlist可以看到绝大多数状态处于sending data,然后一直不动,tomcat的线程也有很多处于获取数据库连接的状态。

请问有什么方法可以解决么。其他时间段则没有任何问题。

然后现在要用两台服务器做为用户访问均衡,将数据库独立到一台服务器上面,3台服务器处于同一个网段,经过测试2台访问服务器,启动tomcat后发现,数据库连接暴增。。。然后就访问不了了。。
...全文
278 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zdhcumt 2011-07-15
  • 打赏
  • 举报
回复
貌似有一个叫数据库负载均衡的技术,做mysql集群,据说人人网就是这么干的
具体怎么做不晓得
你可以调研一下这方面的技术
txspace 2011-07-15
  • 打赏
  • 举报
回复
按理说MYSQL自己的缓存机制也开启了,因为我某几个页面会自动刷新,而查询的字符串都是一样的,那么应该对数据库照成的鸭梨是不大的,毕竟可以可以从缓存当中去取的,这个命中率是100%的
zn85600301 2011-07-15
  • 打赏
  • 举报
回复
这个确实没什么好的办法 因为你的数据持久层没有个缓存机制
每次都要去连接数据库查询~~

坐等大牛
dyflovexlp 2011-07-15
  • 打赏
  • 举报
回复
你们wap网站的地址是?
txspace 2011-07-15
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 closewbq 的回复:]
我也是考虑两方面,一方面是SQL效率的优化,其次是使用缓存机制用于检索的结果频繁并且变化少的数据。
[/Quote]
sql的话独立运行的话很快,最长不会超过1秒,
缓存机制该用哪一种?不需要改动太多代码
txspace 2011-07-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 x19881216 的回复:]
mysql集群
tomcat集群

页面缓存(静态化)---这个最有效果
[/Quote]
3个服务器配置都是 Intel(R) CPU E5506 @2.13GHz 2.13GHz 3.99GB的内存
2个作为tomcat负载均衡,使用的是windows 2003 server 的网络负载平衡
mysql独立一台
closewbq 2011-07-15
  • 打赏
  • 举报
回复
我也是考虑两方面,一方面是SQL效率的优化,其次是使用缓存机制用于检索的结果频繁并且变化少的数据。
txspace 2011-07-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dyflovexlp 的回复:]
1.页面静态化
2.采用memcached
3.优化sql
4.优化代码,避免竞争资源过于激烈
5.数据库分库,分表
[/Quote]
1、页面的东西是实时显示的。所以应该不能做静态话,否则的话不久有延迟?
2、做这个是不是需要改动很多代码?
3、sql都是简单的查询,最多关联3张表,并且都是小表
4、代码的话这个就不清楚是否会引起资源竞争激烈
5、都是小表,除了几张月份访问统计表有几百万条数据外。
txspace 2011-07-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 shine333 的回复:]
最后,如果访问量大的话,而且读写比较高(读取频繁度远远超过更新),那么缓存是必须的。

我怀疑你的问题主要还是没有及时释放资源
[/Quote]
读取比确实是很高,主要都是查询。
资源每一次使用都会归还连接池的。这个我每一句代码都仔细检查过了。所以释放数据库连接应该是没有问题的。
MYSQL自己的缓存不够用么。。
txspace 2011-07-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 shine333 的回复:]
首先,确保你的sql语句本身没太大性能问题,看看索引、性能参数等。

其次,你直接jsp上面操作jdbc?还是servlet操作jdbc,把结果放入request,然后jsp用?

如果前者,客户访问的时候,如果网速较慢,JSP还来不及执行到最后的释放操作,你的连接来不及释放,甚至可能因为某个更新操作的页面传输慢,卡死整个应用。所以需要改成后者。

举个例子, 代码不规范。
<% w……
[/Quote]
sql语句并没有太大的性能问题,都是简单的查询,最多关联3张表,一张有2500条,一张300条,一张不到1500条,
对数据库的操作是才用servlet操作jdbc,然后放如request,使用jstl页面展现。不过后台一直有一个socket线程再收取一些数据,每一秒至少有50KB的流量,差不多50条数据,并且都会去数据库查询。
zl3450341 2011-07-15
  • 打赏
  • 举报
回复
关于并发确实没有经验,坐等大牛出现了
shine333 2011-07-15
  • 打赏
  • 举报
回复
另外,你tomcat或者apache之类的web服务器,有没有打开压缩功能?
shine333 2011-07-15
  • 打赏
  • 举报
回复
最后,如果访问量大的话,而且读写比较高(读取频繁度远远超过更新),那么缓存是必须的。

我怀疑你的问题主要还是没有及时释放资源
shine333 2011-07-15
  • 打赏
  • 举报
回复
首先,确保你的sql语句本身没太大性能问题,看看索引、性能参数等。

其次,你直接jsp上面操作jdbc?还是servlet操作jdbc,把结果放入request,然后jsp用?

如果前者,客户访问的时候,如果网速较慢,JSP还来不及执行到最后的释放操作,你的连接来不及释放,甚至可能因为某个更新操作的页面传输慢,卡死整个应用。所以需要改成后者。

举个例子, 代码不规范。
<% while (rs.next()) { %>
<tr><td><%=rs.getString(1)%></td><td><%=rs.getString(2)%></td>.......
........
........
<%}%>
........
........
........
<% connection.close();%>
如果访问这个网页的客户端速度较慢,而这个网页生成的东西又比较多,会导致需要较长时间在传输上,然后才能执行到最后的close或者类似操作。需要改成后面那种“servlet操作jdbc,把结果放入request,然后jsp用”的模式。当然,这种情况下,也应当尽早释放资源
dyflovexlp 2011-07-15
  • 打赏
  • 举报
回复
我们公司的wap网站大概每天200W PV, 采用的4台tomcat服务器 + 一台数据库服务器 + 硬件缓存 + memcache + Nginx
dyflovexlp 2011-07-15
  • 打赏
  • 举报
回复
1.页面静态化
2.采用memcached
3.优化sql
4.优化代码,避免竞争资源过于激烈
5.数据库分库,分表
小绵羊 2011-07-15
  • 打赏
  • 举报
回复
mysql集群
tomcat集群

页面缓存(静态化)---这个最有效果
我嘞个去 2011-07-15
  • 打赏
  • 举报
回复
学习了。。。

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧