日期:2014-05-17  浏览次数:20727 次

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

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

然后现在要用两台服务器做为用户访问均衡,将数据库独立到一台服务器上面,3台服务器处于同一个网段,经过测试2台访问服务器,启动tomcat后发现,数据库连接暴增。。。然后就访问不了了。。

------解决方案--------------------
这个确实没什么好的办法 因为你的数据持久层没有个缓存机制
每次都要去连接数据库查询~~

坐等大牛
------解决方案--------------------
貌似有一个叫数据库负载均衡的技术,做mysql集群,据说人人网就是这么干的
具体怎么做不晓得
你可以调研一下这方面的技术
------解决方案--------------------
mysql集群
tomcat集群

页面缓存(静态化)---这个最有效果
------解决方案--------------------
1.页面静态化
2.采用memcached
3.优化sql
4.优化代码,避免竞争资源过于激烈
5.数据库分库,分表
------解决方案--------------------
我们公司的wap网站大概每天200W PV, 采用的4台tomcat服务器 + 一台数据库服务器 + 硬件缓存 + memcache + Nginx
------解决方案--------------------
首先,确保你的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用”的模式。当然,这种情况下,也应当尽早释放资源