【问题标题】:java ORM for a read only DB用于只读数据库的 java ORM
【发布时间】:2010-08-16 08:14:43
【问题描述】:

我知道hibernate,但我想知道是否会有用于只读数据库的更轻量级的ORM引擎。我的意思是,我不需要一些事务性查询或更新一些记录。另一方面,我需要处理一些大的记录列表:

List<MyRecord> list= object.getMyRecords(); // list.size() > 1E7

这样的引擎存在吗? 非常感谢,

皮埃尔

【问题讨论】:

  • hibernate 出了什么问题,你开始搜索另一个 ORM 时达到了什么限制?
  • 我对 Hibernate 一无所知,但我想知道是否存在另一个 ORM。我发现休眠需要很长时间才能设置许多依赖项,事务是无用的(在我的情况下),而且我担心它不支持我列表中的大量项目。
  • 对于映射和只​​读的少数类,我会使用一个好的连接池库 (c3p0) 和 JDBC 作为“光引擎”。
  • 这些大型对象集合是打算通过自然键访问还是仅迭代?

标签: java database forms readonly


【解决方案1】:

您可以查看 JIRM(是的,这是一个无耻的插件),它是一个专注于使用不可变对象的 ORM。

它位于 Spring JDBC 之上,因此,如果您使用 Spring,尝试它的风险非常低。

它也有非常好的SQL placeholder templates,不需要 Spring。

您应该签出的另一个项目是jOOQ

【讨论】:

    【解决方案2】:

    我认为你应该考虑MyBatis (IBatis 3) ORM 库。它适合从轻量级工作到一些繁重的批处理执行的要求。因此,它将非常适合您当前的需求,并且当您需要从底层 ORM 库中进行一些繁重的工作时,它不会让您失望。

    【讨论】:

      【解决方案3】:

      如果您正在寻找一个轻量级的 ORM 框架,那就看看OrmLite。它允许您避免设置更复杂的 ORM 框架(如 Hibernate)的大部分开销。这个框架的缺点是它不支持标准的 JPA 注释,因此以后将这个 ORM 换成不同的 ORM 并不容易。

      我建议尝试OpenJPA,这是一个由 Apache 基金会维护的符合 JPA 标准的 ORM 框架。它是 Hibernate 的主要竞争对手之一。它确实有更多的设置开销,但它的优势在于,如果它不再适合您的需求,您可以在将来将其换成不同的 JPA 兼容框架(如 Hibernate)。

      这两个框架也是开源的,这始终是使用它们的好理由。

      【讨论】:

      • 实际上 ORMLite 确实支持 JPA 注释的子集,但不支持完整的补充。
      【解决方案4】:

      大约一年前,我也在 lite ORM 中搜索了一个项目。并尝试了其中的几个。我对所有解决方案都有些不满意,因为每个解决方案都试图朝着某个方向发展。

      Hibernate 非常庞大,当您只需要简单的解决方案时,它可能会带来额外的麻烦。目前我正在开发一个不错的项目,它在表格上使用了很少的自定义层。

      您可以尝试使用一些模式,如 Active Record 或 Table Gateway 等,使用 JDBC 在您的数据库上实现一个小层。

      任何 ORM 解决方案都只是试图非常统一,并为您的项目添加额外的尾巴。但是您可以创建自己的自定义无层解决方案 - 如果您的数据库具有预定义的表集并且不经常更改其结构,这将特别有效。

      【讨论】:

      • @Martin - 以前没见过 - 访问 API 看起来不错 - 非常类似于活动记录。感谢您的链接!
      • 如果您有兴趣,请尝试一下,让我们知道您的反馈。您选择的数据库引擎是什么?
      • @Martin 我会在任何新项目中牢记这一点。我不受任何特定数据库的约束,但 mysql 是目前最流行的数据库之一。
      【解决方案5】:

      看看Ebeans,这是一个轻量级的 ORM 工具:

      • 重用 JPA 注释(@Entity、@OneToMany ...)进行映射。
      • 使用 Session Less 架构(即具有比 JPA 更简单的 API)。
      • 支持不可变值对象。
      • 允许使用ORM or Relational features
      • 声称提供良好的large query 支持

      IMO 值得一看。

      【讨论】:

        【解决方案6】:

        Spring 的 SimpleJDBCTemplate 与结果映射器相结合,在只读场景中为我创造了奇迹,您不会获得不需要的休眠开销,所有的伪 ORM 映射都捆绑在一起,这对于此类场景来说是真正的胜利。

        【讨论】:

          【解决方案7】:

          如果您正在寻找轻量级 ORM,我会推荐 jORM。请注意,我的回答是有偏见的,因为我是该项目的贡献者之一。

          我们决定编写轻量级替代方案的主要原因是(需要):

          • Hazzlefree 配置
          • 清除事务定义
          • 内存管理和速度
          • 简单的代码生成
          • 手动调整的 SQL

          简而言之;发展迅速。

          示例配置

          DataSource dataSource = new DataSource();
          dataSource.setDriverClassName("org.postgresql.Driver");
          dataSource.setUrl("jdbc:postgresql://localhost:5432/moria");
          dataSource.setUsername("gandalf");
          dataSource.setPassword("mellon");
          
          Database.configure("moria", dataSource); // now there's a named database
          

          示例记录

          @Jorm(database="moria", table="goblins", id="id")
          public class Goblin extends Record {  
              public Integer getId() {
                  return get("id", Integer.class);
              }
              public void setId(Integer id) {
                  set("id", id);
              }
              public Integer getTribeId() {
                  return get("tribe_id", Integer.class);
              }
              public void setTribeId(Integer id) {
                  set("tribe_id", id);
              }
              public Tribe getTribe() {
                  return get("tribe_id", Tribe.class);
              }
              public void setTribe(Tribe tribe) {
                  set("tribe_id", tribe);
              }
              public String getName() {
                  return get("name", String.class);
              }
              public void setName(String name) {
                  set("name", name);
              }
          }
          

          映射查询示例

          Goblin goblin = Record.findById(Goblin.class 42);
          
          List<Goblin> goblins = Record.findAll(Goblin.class);Goblin bolg = Record.find(Goblin.class, new Column("name", "Bolg"));
          

          自定义查询示例

          Tribe tribe = new Tribe();
          tribe.setId(1);
          String name = "Azog";
          
          Goblin azog = Record.select(
              Goblin.class,
              "SELECT * FROM goblins WHERE name = #1# AND tribe_id = #2:id#",
              name, // #1#
              tribe // #2#
          );
          
          Goblin bolg = Record.find(Goblin.class, "SELECT * FROM goblins WHERE name = #1#", "Bolg");
          

          【讨论】:

            猜你喜欢
            • 2023-03-12
            • 1970-01-01
            • 2022-11-09
            • 1970-01-01
            • 1970-01-01
            • 2021-06-11
            • 1970-01-01
            • 2022-11-08
            • 1970-01-01
            相关资源
            最近更新 更多