Spring JPA Repository n + 1问题,EBEAN替代方案

时间:2015-02-22 10:05:58

标签: java spring hibernate ebean

我正在为现有的MySQL数据库编写基于Java的服务器。我可以改变数据库的结构,但任何改变也意味着要挖掘一个相当古老的CakePHP项目,并且我希望尽可能保持原状。

我对Java中的数据库访问没有太多经验,所以当我开始寻找一个好的框架时,我最终得到了Spring Data Repositories(主要是因为我已经有了用于REST服务的Spring Boot Actuator)并因为滚动Hibernate或者手动的其他JPA实现看起来既乏味又复杂。

现在的问题是,我的查询不是很快。一个例子是查询我的~200个用户,并加载他们的关联(user.groups,user.groups.rights,user.groups.rights.permissions,user.rights,user.rights.permissions,users.nfc_keys)。我需要所有这些数据,因为连接到Java Server的其中一个客户端需要此信息才能登录用户,即使主服务器出现故障也会加速登录(换句话说,它会缓存信息)。

问题是,查询需要花费8秒才能执行!我知道这些问题,n + 1问题具体。因为我的所有集合都是延迟加载的,所以hibernate会为每个用户单独查询groups,groups.rights,....例如,我的组字段如下所示:

@ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
@JoinTable(
        name = "user_group_memberships",
        joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
        inverseJoinColumns={@JoinColumn(name="group_id", referencedColumnName="id")}
)
private List<Group> groups;

我尝试将FetchType更改为EAGER,这样做的唯一方法是,使用查询急切地获取所有组,但不是通过SQL连接,而是通过执行n查询。

我查看了this blog post并在UserRepository中使用LEFT JOIN FETCH加载信息实现了一个查询,需要从Lists更改为Sets,因为我的hashCode / equals导致空指针问题烦恼实现和再次延迟加载/设置代理,以发现查询时间减少到大约2秒,这也不错,但与CakePHP执行相同查询所用的相比仍然非常慢。

我现在的问题主要是:是否有直接的解决方案来解决使用Spring Data Repositories的那些问题,或者我是否更好地切换到不同的框架(这仍然可以在这个早期的项目阶段)?我特别关注了Play框架中使用的Ebeans,它们似乎有一个非常好的API,并且还允许定义获取路径(这应该更好地解决n + 1问题),但是我也读到了关于项目维护不善的问题。你有什么看法?

2 个答案:

答案 0 :(得分:1)

请注意,我有偏见,因为我是Ebean ORM的主要维护者。

Ebean存在的一个主要原因是因为我认为JPQL设计不佳以优化ORM查询/对象图构造。特别是缺乏对“部分对象”和“获取路径”的支持。在某种程度上,JPA获取组试图解决这些问题但是您注意到这两个问题都是由Ebeans查询语言直接处理的。 JPA获取组不足IMO(例如,DB,L2和L3的混合对象图构造)。

请注意,我特意在生活繁忙时期(孩子等)保持Ebean低调。 Ebean ORM有一个赞助商,如果你看项目发布,你会发现它健康状况良好。

Ebean ORM实际上已经达到10年了,所以它不是一个新的或年轻的项目。

最近 ElasticSearch集成已经发布,能够从ElasticSearch构建对象图(或对象图的路径)。这可以在不加载数据库的情况下添加提供读取可伸缩性。

此外,您可能知道Ebean可以分析应用程序并自动调整ORM查询(如果您没有,请查看视频)。

希望这会有所帮助。 干杯,罗布。

<强>更新 添加一些链接以引用对细节感兴趣的人(并避免N + 1,优化ORM查询等):

答案 1 :(得分:0)

查询速度与很多事情有关:

  

1.Driver - 2.Database - 3.Connection pooling config

根据我对JPA的经验:

  

尝试在View层中打开会话,并尝试使用HikariCP   加速连接速度