我有一个Web应用程序,它包含以下部分:
评论员通过基于浏览器的工具不断进行匹配评论。使用hibernat将注释插入到DB中。
许多用户正在访问网址以阅读评论。 Hibernate正在读取步骤#1中评论员正在更新的表中的数据。
还有一些存储过程设置为每1小时运行一次。很少有人访问同一个表(在步骤#1和#2中使用)以进行读取和写入/更新。
现在我的问题是,每当网站有100多个并发用户观看特定的匹配评论时,我的MySQL就会崩溃。它显示了很多查询卡在进程列表中。其中许多都在“复制到临时表”状态。这使得JBOSS频繁重启。
我在hibernate中使用事务来进行读写。请帮助,因为我因为这些崩溃而放松了大赛。
答案 0 :(得分:1)
您遇到了性能问题。很难提供始终有效的解决方案。你可以考虑做的是:
1)修改HQL(Hibernate)语句。为此,您可以在配置文件中编写一个带<property name="show_sql">true</property>
的协议(如果您想查看实际参数,甚至可以使用log4jdbc之类的工具)并分析输出。在那里,您可以看到最多的SQL请求。在许多情况下,更好的读取和写入数据库数据的策略可以显着减少数据库流量。并检查你的桌子有很好的索引。
2)考虑使用二级缓存。 (通常,hibernate只使用第一级缓存,这在你的情况下是没用的,因为它绑定到一个会话。)然后至少读取实际注释的请求可以由缓存提供,而不需要去数据库。 (注意:缓存可能会干扰存储过程。看看您要使用的缓存产品是否支持MySQL存储过程。在最坏的情况下,您必须删除关键表的存储过程并让应用程序服务器执行此操作这个工作让它通过缓存。)
3)如果只有少数表被大量使用,您可以考虑通过您的应用程序缓存它们。这是更多的工作,但也许你可以完全满足你的应用程序的需求,所以你可能比一般的二级缓存更快。
4)如果没有任何帮助,而且流量真的太重,那么你可能需要投入更多的硬件。
祝你好运; - )