Java 使用Hibernate时的性能问题
我有一个查询,需要使用不同的参数连续运行大约200次。查询(与Hibernate生成的查询相同)本身非常快(小于1ms),但每个查询的Hibernate开销为2-3ms,大约为500ms 我使用条件或命名查询获得相同的结果,即使我简化了查询并删除了所有参数。当使用简单的Session.get(Class,Id)时,获取同一个实体所需的时间不到1ms,因此我知道Hibernate能够足够快地从数据库中获取和创建对象 数据库中只有一行,这需要3毫秒:Java 使用Hibernate时的性能问题,java,mysql,performance,hibernate,Java,Mysql,Performance,Hibernate,我有一个查询,需要使用不同的参数连续运行大约200次。查询(与Hibernate生成的查询相同)本身非常快(小于1ms),但每个查询的Hibernate开销为2-3ms,大约为500ms 我使用条件或命名查询获得相同的结果,即使我简化了查询并删除了所有参数。当使用简单的Session.get(Class,Id)时,获取同一个实体所需的时间不到1ms,因此我知道Hibernate能够足够快地从数据库中获取和创建对象 数据库中只有一行,这需要3毫秒: Criteria criteria = sess
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(TestEntity.class)
criteria.list();
虽然这需要0毫秒:
sessionFactory.getCurrentSession().get(TestEntity.class, 1);
产生这种开销的原因是什么?有什么办法可以解决吗
运行于:Hibernate 4.3.4.Final、Spring 4.0.2.RELEASE和MySQL 5.5.35
编辑:
这是我正在测试的实体:
@Entity
@Table(name = "TEST")
public class TestEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
@Column(name = "ID", updatable = false, insertable = false)
public long id;
@Column(name = "VALUE")
public BigDecimal value;
public TestEntity() {
super();
}
}
你能发布更多的数据吗?是否使用映射/注释联接?您的id是复合id吗?按id获取实体使用一级缓存。所以,若实体已经在缓存中,那个么它的速度非常快。但即使是第一个get-by-id也非常快。我还尝试启用/禁用二级缓存,以了解这对性能的影响,但这并不是什么大的改变。