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