首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是为每个web应用程序(上下文)保留一个存储库更好,还是通过JNDI或类似技术共享一个公共实例更好

是为每个web应用程序(上下文)保留一个存储库更好,还是通过JNDI或类似技术共享一个公共实例更好
EN

Stack Overflow用户
提问于 2017-01-18 01:34:35
回答 1查看 129关注 0票数 0

在我们公司中,为最初存储在数据库中的数据创建存储库是一种标准,例如在https://thinkinginobjects.com/2012/08/26/dont-use-dao-use-repository/中描述的那样。

我们的web基础设施由Tomcat7中几个独立的web应用程序组成,用于打印、产品描述、产品订单(这不是持久存储在数据库中!)、类别描述等。它们都是基于Servlet 2 API构建的。

因此,存储库的每个实例/实现都包含由可序列化类表示的特定类型的数据,这种可序列化类的实例由定期执行的数据库查询设置/填充(对于每个结果,字段的设置器都会被调用;这让我想起了使用CMP的面向领域的实体bean)。存储库是在servlet init序列上初始化的(因此每个servlet都保留自己的一组实例)。每个上下文都有自己的到Oracle数据库的连接(由部署时的资源描述文件设置)。所有数据都是只读的,我们永远不需要写回数据库。

因为我们需要将这些数据类型中的一些用于多个web应用程序(上下文),甚至需要用于同一web上下文存储库中的多个servlet,因此具有相同数据类型的存储库被实例化不止一次-例如,在同一应用程序中实例化四次、两次。

最后,一些数据被加倍了,我不确定这是否像它应该的那样聪明和有效。应该可以将相同的存储库对象共享给多个应用程序(JNDI?)但至少必须能够在同一应用程序上下文中为多个servlet共享它。尽管我对使用“自建”存储库而不是像经过良好测试的开放开发缓存(ehcache,jcs,...)的想法感到恼火。因为这些缓存中的一些还提供了分布式缓存的选项(因此它也应该在同一个容器中工作)。如果搜索到某些条目,搜索算法将迭代存储库中的所有条目(上面的S.链接)。对于每个搜索模式,都有专门的函数,可以使用“实体bean”从业务逻辑类中直接调用这些函数;没有规范对象或接口。

最后,应用服务器作为一个整体并不能很好地执行,它使用了大量的RAM (至少大约10000个DB条目);在我看来,这很可能与使用可序列化的XSD- to -JAXB生成的类有关。

此外,每次为测试部署应用程序时,都必须等待至少两分钟,直到数据库的所有条目都加载到存储库中--在实时部署时,在上下文/servlet启动时会有一个明显的停止服务阶段。我倾向于认为所有这一切都与我上面描述的解决方案密切相关。

因为我在这个领域没有任何经验,而且我是新来的公司,所以我不想太唐突。

也许你可以帮助我评估更好的设置的想法:

将所有存储库统一到一个“存储库servlet”中,并通过HTTP从那里请求对象是更好的性能和内存吗(我不这么认为,尽管它看起来非常模块化/分布式系统友好),还是应该尝试使用JNDI (以前从未这样做过),并连接到类似于JDBC数据库的存储库?

至少为整个Tomcat使用一个连接池(并在web应用程序部署描述符中引用此连接池),不是更明智、更快、更高效吗?或者这会减慢连接速度,或者在任何其他方面限制它?我被告知缓存系统(ehcache)不能很好地工作(至少没有自己编写的解决方案的性能-尽管:我不能相信这一点)。我设想在所有web应用程序中使用分布式(跨所有上下文)缓存支持的存储库的使用,不仅应该显着减少内存占用,而且不应该显着降低速度。-我相信它会更快,启动时间更短,不应该经常重新部署它。

我非常感谢您的每一条提示和您的想法。如果能在实践经验的基础上对我的想法进行同行评议,那就太棒了。

因此,非常感谢您提前!

EN

回答 1

Stack Overflow用户

发布于 2017-01-21 05:51:41

是为每个web应用程序(上下文)保留一个存储库更好,还是通过JDNI或类似技术共享一个公共实例更好

除非有人以其他方式证明我,否则我会说,没有办法以标准的方式做到这一点,这意味着在Servlet Sepc或Java规范规范的其余部分中定义的那样。

有一些技术方法可以做到这一点,这些方法可能取决于特定的应用服务器实现,但这不可能是普遍意义上的“更好”。

如果您有两个应用程序在同一数据上操作,我想知道应用程序的分区是否有用。也许在某种数据上操作的所有功能都需要在同一个应用程序中?

在我们公司内部,为数据创建存储库是一种标准,这些数据最初存储在数据库中,例如在https://thinkinginobjects.com/2012/08/26/dont-use-dao-use-repository/中描述的那样。

我在我们的书架上查了查埃文斯。这篇博文很奇怪。存储库和DAO基本上是一回事,它为对象或对象树提供CRUD操作(Evans只说聚合根)。

存储库是在servlet初始化序列上初始化的(因此每个servlet都保留自己的一组实例)。每个上下文都有自己的到Oracle数据库的连接(由部署时的资源描述文件设置)。..。最后,应用程序服务器作为一个整体并不能很好地执行,它使用了大量的RAM

当性能不佳时,最好使用性能分析,例如使用YourKit,或者使用perf和FlameGraphs (如果是在Linux上)。如果您的应用程序需要大量RAM,可以分析堆,例如使用Eclipse MAT。在没有看到任何代码的情况下,别人不可能给你一个最佳实践的建议或提示。

一般的答案将包括任何有关Oracle数据库、JDBC、Java集合和并发编程、网络和操作系统的性能调整。

我被告知缓存系统(ehcache)不能很好地工作(至少不能与自己编写的解决方案的性能相比-尽管:我不敢相信)

我可以的。与简单的HashMap相比,EHCache的速度要慢10-20倍。请参阅:cache benchmarks你只需要一个map,当你做一个完整的预加载并且没有任何突变的时候。

我设想所有web应用程序中使用的由分布式(跨所有上下文)缓存支持的存储库的使用不仅应该显著减少内存占用,而且不应该显著降低速度

分布式缓存需要遍历网络并增加序列化/反序列化开销。这可能是另一个慢了30倍的原因。分布式缓存什么时候更新?

我非常感谢你的每一条提示和你的想法。

总结:

  1. 做普通的软件工程作业,做概要分析和分析,并在正确的地方花费调优的努力
  2. 在堆栈溢出的一个主题上提出特定的问题,并分享您的代码和性能数据。一次问一个关于一件事的问题,阅读https://stackoverflow.com/help/on-topic
  3. You可能也会得出结论,没有什么需要调整的。有些应用程序需要一天的时间来从持久化数据构建内存中的数据结构。也许它只是大量的数据?如果您不喜欢停机,请使用绿色蓝色部署。还可以使用较小的数据集进行

的开发和测试

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41703502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档