在我们公司内部,它是为数据创建存储库的标准,最初存储在数据库中,如https://thinkinginobjects.com/2012/08/26/dont-use-dao-use-repository/中所述。
我们的Web基础架构由Tomcat 7中的一些独立Web应用程序组成,用于打印,产品描述,产品订单(这不会保留在数据库中!),类别描述等。 它们都是基于Servlet 2 API构建的。
因此,存储库的每个实例/实现都包含由可序列化类表示的特殊类型的数据,并且这个serialzable类的实例由周期性执行的数据库查询设置/填充(对于每个结果,调用字段的setter;让我想起使用CMP的面向领域的实体bean。 存储库在servlet init序列上初始化(因此每个servlet都保留它自己的一组实例)。 每个上下文都有自己的Oracle数据库连接(在部署时由资源描述文件设置)。 所有数据都是只读的,我们永远不需要写回数据库。
因为我们需要一些这样的数据类型用于多个Web应用程序(上下文),并且一些甚至用于同一Web上下文中的多个servlet,具有相同数据类型的存储库被多次实例化 - 例如四次,在同一个应用程序中两次。
最后,一些数据加倍,我不确定这是否像它应该的那样聪明和有效。应该可以将同一个存储库对象共享给多个应用程序(JNDI?),但至少必须能够在同一个应用程序上下文中为多个servlet共享它。 尽管我对使用" self build"的想法感到恼火。存储库而不是像经过良好测试的开放式开发缓存(ehcache,jcs,...)之类的东西,因为其中一些缓存还为分布式缓存提供了选项(因此它也应该在同一个容器中工作)。 如果搜索到某些条目,则搜索算法会迭代存储库中的所有条目(上面的链接)。对于每个搜索模式,都有专门的函数,这些函数使用"实体bean直接在业务逻辑类中调用&#34 ;;没有规范对象或接口。
最后,整个应用程序服务器执行得不好,它使用了大量的RAM(至少大约10000个DB条目);在我看来,这很可能与使用可序列化的XSD到JAXB生成的类有关。
此外,每次为测试部署应用程序时,您都必须等待至少两分钟,直到数据库的所有条目都已加载到存储库中 - 在实时部署时,在上下文中可以很好地识别服务阶段/ servlet启动。 我倾向于认为所有这些与我上面描述的解决方案密切相关。
因为我没有在这个领域获得过任何经验,而且我在公司里不知所措,我不想让自己变得突兀。
也许您可以帮助我评估想法以获得更好的设置:
将性能和内存更好地统一到一个"存储库servlet"并通过HTTP从那里请求对象(不要这么认为,虽然看起来非常模块化/分布式系统友好)或者我应该尝试使用JNDI(之前从未这样做过)并连接到类似于JDBC数据库的存储库?
至少对整个Tomcat只使用一个连接池(并从Web应用程序部署描述符中引用此连接池)更加明智,快捷和高效?或者可能会减慢连接速度或限制它在任何其他方面? 有人告诉我,缓存系统(ehcache)并不能很好地工作(至少不是自编写解决方案的表现 - 但是:我无法相信)。我想在所有Web应用程序中使用的分布式(在所有上下文中)缓存支持的存储库的使用不仅应该显着减少内存占用,而且应该不会显着降低。 - 我相信它会更快,启动时间更短,不需要经常重新部署它。
我非常感谢每一个提示或暗示以及你的想法。根据实践经验对我的想法进行同行评审是非常了不起的。
非常感谢你提前!
答案 0 :(得分:1)
为每个Web应用程序(上下文)保存存储库是否更好?或者通过JDNI或类似技术共享公共实例更好
除非有人证明我,否则我会说没有办法以标准的方式去做,这意味着在Servlet Sepc或Java EE规范的其他部分中定义。
有一些技术方法可能会依赖于特定的应用程序服务器实现,但从普遍意义上说这不是“更好”。
如果你有两个应用程序在相同的数据上运行,我想知道应用程序的分区是否有用。也许所有在某种数据上运行的功能都需要在同一个应用程序中?
在我们公司内部,为数据创建存储库是一种标准,最初存储在数据库中,如https://thinkinginobjects.com/2012/08/26/dont-use-dao-use-repository/中所述。
我在书架上抬起埃文斯。博客文章非常奇怪。存储库和DAO基本相同,它为对象或对象树提供CRUD操作(Evans只说聚合根)。
存储库在servlet init序列上初始化(因此每个servlet都保留它自己的一组实例)。每个上下文都有自己的Oracle数据库连接(在部署时由资源描述文件设置)。 [...] 最后,整个应用程序服务器执行得不好,而且它使用了大量的RAM
当某些内容表现不佳时,最好进行分析,例如:使用YourKit或使用perf和FlameGraphs,如果你在Linux上。如果您的应用程序需要大量RAM,请分析堆使用Eclipse MAT。在没有看到任何代码的情况下,没有人可以给你一个推荐或暗示最佳实践。
一般性答案将包括有关Oracle DB,JDBC,Java集合和并发编程,网络和操作系统的性能调优。
我被告知缓存系统(ehcache)运行不正常(至少不是自编写解决方案的性能 - 但是:我无法相信)
我可以。 EHCache比简单的HashMap慢10-20倍。见:cache benchmarks。当你完成一个完整的预加载并且没有任何突变时,你只需要一张地图。
我想在所有Web应用程序中使用的分布式(在所有上下文中)缓存支持的存储库的使用不仅应该显着减少内存占用,而且应该不会显着降低
分布式缓存需要遍历网络并添加序列化/反序列化开销。这可能是另一个因素较慢的因素。何时更新分布式缓存?
我非常感谢每一个提示或提示以及你的想法。
总结: