Java SQL和Hibernate-重复计算表行数

Java SQL和Hibernate-重复计算表行数,java,sql,hibernate,Java,Sql,Hibernate,假设我有两个表,例如thread和author,其中 线 作者 其中thread.author在author.id上有一个外键。这是论坛项目的一小部分。 我正在运行一个Java应用程序,它使用Hibernate ORM访问数据库。所以,我基本上有3层:逻辑层Java类数据访问层Hibernate数据库 现在,考虑一下这个场景:我经常需要有很多用户的线程数。因此,基本上我认为我有以下不同的解决方案: 让数据库保持原样,每次在数据库上调用get时,Hibernate相当于从author='some_

假设我有两个表,例如thread和author,其中 线

作者

其中thread.author在author.id上有一个外键。这是论坛项目的一小部分。 我正在运行一个Java应用程序,它使用Hibernate ORM访问数据库。所以,我基本上有3层:逻辑层Java类数据访问层Hibernate数据库

现在,考虑一下这个场景:我经常需要有很多用户的线程数。因此,基本上我认为我有以下不同的解决方案:

让数据库保持原样,每次在数据库上调用get时,Hibernate相当于从author='some_id'所在的线程中选择COUNT*。它似乎效率很低,因为它多次访问数据库。 修改author表,添加类似threads\u number的列。然而,这提出了另一个问题:哪一层更新此列?一个DB触发器,它在不同的数据库或应用程序层之间似乎不可移植,这很好,但同时会导致不一致? 具体化的视图。这似乎是合理的,但我认为我在第2点上也有同样的问题:哪一层更新视图并检查一致性?
什么是最好的选择?

第二种方法很难。您有一对多关系,所以您应该在单个author.threads\u number字段中存储多个线程ID,但这是非常糟糕的做法。 物化视图将不会帮助您,典型视图与第一种方法相同-您需要多次从数据库中选择数据。 总而言之,您确实需要多次获取数据,因此您需要多次接收数据。
您所能做的就是使用hibernate访问数据库。Hibernate可以在不使用数据库连接的情况下从缓存中读取存储的数据,并且可以管理数据库连接池以实现最佳性能。

实际上,我不需要线程ID,只需要它们的总数。不需要同时保留线程和线程计数器。无论如何,您都需要从数据库或hibernate缓存中读取和接收数据。您真的需要在数据库中存储线程吗?线程可能会很短,甚至比存储操作还要短。请将线程理解为主题it'a forum project;的同义词。例如,考虑页面,特别是列回复。问题与我的类似:他们是否为页面的每一行调用get on DB?或者,如果你想知道每个线程的信息,它们会存储一些额外的冗余信息吗?据我所知,大多数论坛脚本调用单个sql查询来接收视图名称、回复计数、最后回复日期等的每一行,甚至调用单个查询来获取所有行的元数据。不需要存储冗余数据和管理一致性。SQL非常有效,尤其是在读取方面,所以您不必担心多个SELECT操作。
+------+--------+-...-+
| id   | author | ... |
+------+--------+-...-+
+----+-...-+
| id | ... |
+----+-...-+