【问题标题】:Flex Java BlazeDS Dashboard - use Spring/JDBC or Hibernate?Flex Java BlazeDS Dashboard - 使用 Spring/JDBC 还是 Hibernate?
【发布时间】:2009-11-04 09:40:34
【问题描述】:

我正在为我工​​作的公司开发一个 IT 监控仪表板。该系统将主要执行对文件、数据库和服务器的监控。系统的一小部分将允许用户配置有关系统的静态数据,例如:文件位置、服务器名称等...

作为应用程序。将是一个仪表板,许多应用程序将包含向 flex 客户端发布数据以更新所有监控视图。所以会有有限的数据库活动,即:插入/更新/删除。

我目前在后端 Java 代码中使用 Spring/JDBC 组合。我最近考虑迁移到 Hibernate,以便在 CRUD 操作(与 Spring/JDBC 相比)方面易于使用。

有人对此有任何想法吗?对于我正在做的事,Spring/JDBC 就足够了吗? Spring/JDBC 是否可扩展?如果仪表板在用户(可扩展性)和功能(更多的数据库操作)方面有所增长,我会更多地展望未来。

PS:我以前没有使用过休眠,但使用过 JDO/Kodo 和 Toplink,它们的工作原理与休眠方式相同。

谢谢 迈克

【问题讨论】:

    标签: java apache-flex hibernate spring jdbc


    【解决方案1】:

    Hibernate(和大多数其他 ORM)与 Spring/JDBC 之间的主要区别在于,大多数 ORM 支持“延迟加载”,这实际上在远程应用程序中可能存在很大问题。假设您正在使用 Hibernate 并且有一个 Person 类,该类包含一组 Address 对象。如果您向 Hibernate 询问 Person 实例,默认情况下它将仅加载 Person 的简单属性,并且“addresses”集合将是一个空代理。当您第一次访问“地址”时,Hibernate 会执行一些 SQL 来神奇地为您将数据“延迟加载”到地址集合中。当您将带有惰性地址的 Person 传递给正在使用的任何序列化程序时,它将遍历整个对象图并触发它可以到达的每个惰性代理的惰性加载。在复杂的对象模型中,这可能会导致数以千计的 SQL 查询在将对象图发送到服务器之前完全加载它,更不用说将通过网络发送的数兆字节数据了。

    其他海报之一提到了将 DTO 与 Hibernate 一起使用,这不是一个糟糕的建议,因为它有助于解决这个延迟加载问题。您基本上用 DTO 包装了所有实体,然后仅将 DTO 返回给序列化程序。扩展前面的示例,假设 Person 还有一个与之关联的 Department 对象。 PersonDto 可以有一个“departmentId”属性,当访问它时,它只从底层的 Department 对象中提取“id”属性。由于 Hibernate 惰性实体代理总是使用其标识符填充,因此您可以访问此数据而无需延迟加载对象。由于 PersonDto 实际上并没有将 Department 对象公开给序列化程序,因此它将无法遍历它并尝试加载所有数据。

    在 Hibernate 中使用 DTO 有另一种选择,那就是对那些 Hibernate 惰性代理做一些非常奇特的事情,这样它们就可以很好地与序列化程序配合使用。如果您想了解更多信息,请查看名为 Gilead 的项目。

    您还提到了可扩展性,当然答案是“视情况而定”。 :) 在处理更多用户方面,使用 Spring/JDBC 调整 SQL 会更容易,这可能会提高性能并减轻数据库的负载,可能让您支持更多用户。但是,就代码可维护性和您需要完成的大量工作而言,Hibernate 可能会提供更好的选择,因为它可以自动执行许多繁琐的 crud 功能。

    【讨论】:

      【解决方案2】:

      出于上述所有原因,我会选择 Hibernate,并使用 DTO 模式在 Java 和 Flex 之间进行通信。您可能不想直接通过网络发送 Hibernate 域对象。

      【讨论】:

        【解决方案3】:

        我猜您已经了解了 blaze ds 的远程类功能以及 pub/sub 功能。这有效地允许您将 Java 类映射到动作脚本类,然后可以通过网络发送。

        如果您已经在服务器上定义了可以使用的实体模型,那么集成休眠或类似技术将很容易,因为它可以在实体/域级别工作。

        您可以采用自上而下的方法并使用 hibernate 从带注释的实体模型中为您生成架构。我不熟悉 spring/jdbc,但是即使对于简单的应用程序,hibernate 也可以大大简化事情。

        就可扩展性而言,休眠应该不是问题,因为它具有许多高级功能,例如二级/分布式缓存。

        如果您有兴趣学习如何从类中生成 JPA/hibernate 映射,请查看 netbeans 教程。

        【讨论】:

          【解决方案4】:

          如果您使用过 Kodo/JDO,那么 DataNucleus 对您来说应该很简单。取决于对象图的复杂性,是否有必要采用针对 JDBC 的解决方案;您不了解数据的关系复杂性。使用 DataNucleus,您可以像使用 Kodo 一样拥有 L2 缓存,从而在可扩展性方面提供很大帮助。

          --安迪 (DataNucleus)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-04-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-11
            • 2012-01-06
            • 1970-01-01
            相关资源
            最近更新 更多