【发布时间】:2017-06-01 16:43:56
【问题描述】:
我遇到了一个优化问题,我不知道为什么我的查询这么慢。
这是我的实体:
@Entity
@Table(name = "CLIENT")
public class Client {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "CLIENT_ID")
@SequenceGenerator(name = "ID_GENERATOR", sequenceName = "CLIENT_S", allocationSize = 1, initialValue = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ID_GENERATOR")
private Long id;
@Column(name="LOGIN")
private String login;
@Column(name="PASSWORD")
private String password;
还有 DAO
@NoRepositoryBean
public interface ClientDao extends JpaRepository<Client, Long>, JpaSpecificationExecutor<Client> {
Client findByPasswordAndLogin(@Param("login") String customerLogin,@Param("password") String customerHashedPassword);
}
执行 findByPasswordAndLogin 方法时,大约需要 200 毫秒才能完成(通过 Junit 测试和 JProfiler 都可以看到)。
这里是休眠查询: 休眠:从客户端 clientx0_ 中选择 clientx0_.CLIENT_ID 作为 CLIENT_ID1_4_,clientx0_.LOGIN 作为 LOGIN9_4_,clientx0_.PASSWORD 作为 PASSWORD10_4_,clientx0_.STATUT 作为 STATUT13_4_,其中 clientx0_.PASSWORD=?和clientx0_.LOGIN=?
当我在数据库上手动执行 SQL 查询时,只需要 3ms :
select * from CLIENT where PASSWORD='xxxxx' and LOGIN='yyyyyyyy'
我们的开发环境中有 4000 个客户。超过一百万的产量。
这里是上下文:
- JDK 8
- Spring 4.1.6.RELEASE + JPA + Hibernate
- Oracle 数据库 10
有什么想法吗?
【问题讨论】:
-
什么是
CustomAuditable<Long>?创建Client实例是否昂贵? -
你试过在应用端测量事务执行时间吗?
-
能贴出hibernate生成的实际sql吗?可能您正在运行一些急切加载或其他后续查询。 Hibernate 统计信息还可以向您展示实际的查询执行时间。
-
我已经用 Hibernate 查询更新了帖子并删除了 CustomAuditable(在这种情况下没用,我不想详细说明如何不使帖子超载 - 结果是一样的)。为什么我要在应用端采取措施?在 DAO 方面它很慢。
-
能否为密码、登录组合添加索引。它可能会提高查询性能。
标签: java spring oracle hibernate jpa