直接通过 servlet 调用数据库与使用 EAO 和 EJB 中介
Posted
技术标签:
【中文标题】直接通过 servlet 调用数据库与使用 EAO 和 EJB 中介【英文标题】:Calling to a database directly through servlet vs using an EAO and EJB intermidiary 【发布时间】:2011-12-24 14:15:21 【问题描述】:我正在通过 servlet 在网页上显示文本和 xml。 servlet 只是通过调用 getPost() 方法将 html/XML 加载到加载页面。现在我已经按照我想要的方式工作了,下一步是用对数据库的调用替换静态显示文本,以便它可以动态显示信息。我的问题是:
最好的方法是什么。我正在使用 JPA 和实体进行持久化,但我可以选择直接调用持久化项目或通过我创建的数据/实体访问对象。我遵循了一个教程,该教程使用 EAO 和 EJB 实体作为教授最佳实践的一种方式。但是,我还没有看到这样做的价值。当我可以直接访问数据时,通过 3 个类似乎过于复杂。
那么这是首选方法吗?或者 servlet 应该直接访问数据还是通过 EAO 访问数据?
谢谢
【问题讨论】:
我的问题可能不是很清楚,我想我真的只是在为我认为应该根据我所读内容的方式寻找理由。我可以阅读 DAO 模式,但我认为有人可能会更简单地解释为什么通过 EJB 和 DAO 是有益的,但如果问题/答案不是很明显,我可以将其标记为删除:/ 【参考方案1】:如果您不需要它 - 不要这样做。
不要无缘无故地引入额外的抽象层。它只是更难维护,如果你真的不需要它 - 你会以一堆死代码(空委托)结束。
所以,如果我是你,我会做的第一步是使用 JPA 作为持久层。它会让你摆脱额外的 DAO 类。 EntityManager(您可以将其视为 JPA 的入口点)本身就是一个数据访问对象。 您的 servlet 代码不应直接依赖于数据库,因此 EntityManager 在您的情况下是一个很好的关注点分离。
然后您可以考虑将您的表示代码(Servlet)与面向数据的操作分开。您可以通过使用即 CDI 并在简单的 POJO 中实现此逻辑来做到这一点。这将使您(Servlet)不依赖用于获取或转换数据的代码。您的 servlet 通常只会“获取数据”(它不必知道数据来自哪里)。
如果您需要 EJB 引入的服务(事务性、线程安全、计时器、异步调用、SOAP 或 REST Web 服务等附加入口点、JMX 访问、池...),请使用 EJB。
HTH。
【讨论】:
谢谢您,我希望获得有关此类主题的更多信息。现在作为 JEE 的新学生,我觉得我可能在使用 POJO 时不必要地使用 EJB。您可以将 CDI 与 POJO 一起使用吗?现在我有一个会话 bean,我用它来处理我的“业务逻辑”,它实际上不是逻辑,而只是调用我的 DAO,以及我拥有的任何其他主要执行块/类。它几乎就像一个调度程序/接口,因为那时我只需将该 bean 注入到我的 servlet 中,我就可以在我的项目中引用任何方法。 @user988231 如果涉及到 CDI,只需查看 Weld(CDI 的实现)文档:docs.jboss.org/weld/reference/latest/en-US/html - 它真的是很好的知识来源。 虽然我可能希望最终使这些调用中的很多异步调用,因此当我添加功能时,必要性可能会变得更加明显。 好吧,不要误会我的意思 - EJB 仍然是 POJO(如您所知,您只需注释类@Stateless
、@Stateful
等)如果您的逻辑非常简单CRUD 比你可以创建一个通用服务并扩展/实现它。
@user988231 正是这一点。如果您需要异步访问,您将看到使用 EJB 的附加价值。一旦您开始使用 EntityManager,您就会看到另一个附加值 - 容器管理的事务,这将使您免于显式编码它们。【参考方案2】:
有不同的因素,了解这两种方法很有用。
EJB 更简单,并且具有许多用于事务管理的功能。如果没有 EJB,要持久化的代码会更加冗长。
也许这将有助于更好地理解。
http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html
【讨论】:
【参考方案3】:是否应在每个用例的基本 IMO 中使用 DAO。
点击可以帮助您解决这个问题的答案的链接。
How should EntityManager be used in a nicely decoupled service layer and data access layer?
【讨论】:
以上是关于直接通过 servlet 调用数据库与使用 EAO 和 EJB 中介的主要内容,如果未能解决你的问题,请参考以下文章
为啥我不能“直接”从 HTML 调用 Servlet? [复制]