DS-3086: Optimized query and entity caching

This commit is contained in:
Tom Desair
2016-03-31 14:44:52 +02:00
committed by dylan
parent b09594ed04
commit bbb707358c
8 changed files with 34 additions and 15 deletions

View File

@@ -8,10 +8,13 @@
package org.dspace.content; package org.dspace.content;
import org.dspace.core.Context; import org.dspace.core.Context;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.proxy.HibernateProxyHelper; import org.hibernate.proxy.HibernateProxyHelper;
import javax.persistence.*; import javax.persistence.*;
/** /**
* DSpace object that represents a metadata field, which is * DSpace object that represents a metadata field, which is
* defined by a combination of schema, element, and qualifier. Every * defined by a combination of schema, element, and qualifier. Every
@@ -23,6 +26,8 @@ import javax.persistence.*;
* @see org.dspace.content.MetadataSchema * @see org.dspace.content.MetadataSchema
*/ */
@Entity @Entity
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Table(name="metadatafieldregistry") @Table(name="metadatafieldregistry")
public class MetadataField { public class MetadataField {
@@ -32,7 +37,7 @@ public class MetadataField {
@SequenceGenerator(name="metadatafieldregistry_seq", sequenceName="metadatafieldregistry_seq", allocationSize = 1, initialValue = 1) @SequenceGenerator(name="metadatafieldregistry_seq", sequenceName="metadatafieldregistry_seq", allocationSize = 1, initialValue = 1)
private int id; private int id;
@ManyToOne(fetch = FetchType.LAZY) @ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "metadata_schema_id",nullable = false) @JoinColumn(name = "metadata_schema_id",nullable = false)
private MetadataSchema metadataSchema; private MetadataSchema metadataSchema;

View File

@@ -8,9 +8,12 @@
package org.dspace.content; package org.dspace.content;
import org.dspace.core.Context; import org.dspace.core.Context;
import org.hibernate.annotations.*;
import org.hibernate.proxy.HibernateProxyHelper; import org.hibernate.proxy.HibernateProxyHelper;
import javax.persistence.*; import javax.persistence.*;
import javax.persistence.Entity;
import javax.persistence.Table;
/** /**
* Class representing a schema in DSpace. * Class representing a schema in DSpace.
@@ -26,6 +29,8 @@ import javax.persistence.*;
* @see org.dspace.content.MetadataField * @see org.dspace.content.MetadataField
*/ */
@Entity @Entity
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Table(name="metadataschemaregistry") @Table(name="metadataschemaregistry")
public class MetadataSchema public class MetadataSchema
{ {

View File

@@ -36,7 +36,7 @@ public class MetadataValue
private int valueId; private int valueId;
/** The primary key for the metadata value */ /** The primary key for the metadata value */
@ManyToOne @ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "metadata_field_id") @JoinColumn(name = "metadata_field_id")
private MetadataField metadataField = null; private MetadataField metadataField = null;
@@ -62,7 +62,7 @@ public class MetadataValue
@Column(name = "confidence") @Column(name = "confidence")
private int confidence = -1; private int confidence = -1;
@ManyToOne(fetch = FetchType.EAGER, cascade={CascadeType.PERSIST}) @ManyToOne(fetch = FetchType.LAZY, cascade={CascadeType.PERSIST})
@JoinColumn(name="dspace_object_id") @JoinColumn(name="dspace_object_id")
protected DSpaceObject dSpaceObject; protected DSpaceObject dSpaceObject;

View File

@@ -13,6 +13,7 @@ import org.dspace.content.dao.MetadataFieldDAO;
import org.dspace.core.Context; import org.dspace.core.Context;
import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.AbstractHibernateDAO;
import org.hibernate.Criteria; import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.criterion.Order; import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions; import org.hibernate.criterion.Restrictions;
@@ -45,6 +46,7 @@ public class MetadataFieldDAOImpl extends AbstractHibernateDAO<MetadataField> im
Restrictions.eqOrIsNull("qualifier", qualifier) Restrictions.eqOrIsNull("qualifier", qualifier)
) )
); );
criteria.setFetchMode("metadataSchema", FetchMode.JOIN);
criteria.setCacheable(true); criteria.setCacheable(true);
return singleResult(criteria); return singleResult(criteria);
@@ -61,6 +63,7 @@ public class MetadataFieldDAOImpl extends AbstractHibernateDAO<MetadataField> im
Restrictions.eqOrIsNull("qualifier", qualifier) Restrictions.eqOrIsNull("qualifier", qualifier)
) )
); );
criteria.setFetchMode("metadataSchema", FetchMode.JOIN);
criteria.setCacheable(true); criteria.setCacheable(true);
return singleResult(criteria); return singleResult(criteria);
@@ -70,6 +73,7 @@ public class MetadataFieldDAOImpl extends AbstractHibernateDAO<MetadataField> im
public List<MetadataField> findAll(Context context, Class<MetadataField> clazz) throws SQLException { public List<MetadataField> findAll(Context context, Class<MetadataField> clazz) throws SQLException {
Criteria criteria = createCriteria(context, MetadataField.class); Criteria criteria = createCriteria(context, MetadataField.class);
criteria.createAlias("metadataSchema", "s").addOrder(Order.asc("s.name")).addOrder(Order.asc("element")).addOrder(Order.asc("qualifier")); criteria.createAlias("metadataSchema", "s").addOrder(Order.asc("s.name")).addOrder(Order.asc("element")).addOrder(Order.asc("qualifier"));
criteria.setFetchMode("metadataSchema", FetchMode.JOIN);
criteria.setCacheable(true); criteria.setCacheable(true);
return list(criteria); return list(criteria);
} }
@@ -85,6 +89,7 @@ public class MetadataFieldDAOImpl extends AbstractHibernateDAO<MetadataField> im
Restrictions.eqOrIsNull("qualifier", qualifier) Restrictions.eqOrIsNull("qualifier", qualifier)
) )
); );
criteria.setFetchMode("metadataSchema", FetchMode.JOIN);
criteria.setCacheable(true); criteria.setCacheable(true);
return singleResult(criteria); return singleResult(criteria);
@@ -100,6 +105,7 @@ public class MetadataFieldDAOImpl extends AbstractHibernateDAO<MetadataField> im
Restrictions.eq("element", element) Restrictions.eq("element", element)
) )
); );
criteria.setFetchMode("metadataSchema", FetchMode.JOIN);
criteria.setCacheable(true); criteria.setCacheable(true);
return list(criteria); return list(criteria);
@@ -113,6 +119,7 @@ public class MetadataFieldDAOImpl extends AbstractHibernateDAO<MetadataField> im
criteria.createAlias("metadataSchema", "s"); criteria.createAlias("metadataSchema", "s");
criteria.add(Restrictions.eq("s.id", metadataSchema.getSchemaID())); criteria.add(Restrictions.eq("s.id", metadataSchema.getSchemaID()));
criteria.addOrder(Order.asc("s.name")).addOrder(Order.asc("element")).addOrder(Order.asc("qualifier")); criteria.addOrder(Order.asc("s.name")).addOrder(Order.asc("element")).addOrder(Order.asc("qualifier"));
criteria.setFetchMode("metadataSchema", FetchMode.JOIN);
criteria.setCacheable(true); criteria.setCacheable(true);
return list(criteria); return list(criteria);

View File

@@ -48,7 +48,7 @@ public class MetadataSchemaDAOImpl extends AbstractHibernateDAO<MetadataSchema>
criteria.add(Restrictions.eq("namespace", namespace)); criteria.add(Restrictions.eq("namespace", namespace));
criteria.setCacheable(true); criteria.setCacheable(true);
return uniqueResult(criteria); return singleResult(criteria);
} }
@Override @Override
@@ -81,7 +81,7 @@ public class MetadataSchemaDAOImpl extends AbstractHibernateDAO<MetadataSchema>
)); ));
criteria.setCacheable(true); criteria.setCacheable(true);
return uniqueResult(criteria) == null; return singleResult(criteria) == null;
} }
/** /**
@@ -103,7 +103,7 @@ public class MetadataSchemaDAOImpl extends AbstractHibernateDAO<MetadataSchema>
)); ));
criteria.setCacheable(true); criteria.setCacheable(true);
return uniqueResult(criteria) == null; return singleResult(criteria) == null;
} }
/** /**
@@ -125,6 +125,6 @@ public class MetadataSchemaDAOImpl extends AbstractHibernateDAO<MetadataSchema>
); );
criteria.setCacheable(true); criteria.setCacheable(true);
return uniqueResult(criteria); return singleResult(criteria);
} }
} }

View File

@@ -11,9 +11,10 @@ import org.dspace.content.DSpaceObject;
import org.dspace.content.MetadataField; import org.dspace.content.MetadataField;
import org.dspace.content.MetadataValue; import org.dspace.content.MetadataValue;
import org.dspace.content.dao.MetadataValueDAO; import org.dspace.content.dao.MetadataValueDAO;
import org.dspace.core.Context;
import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.AbstractHibernateDAO;
import org.dspace.core.Context;
import org.hibernate.Criteria; import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.Query; import org.hibernate.Query;
import org.hibernate.criterion.Restrictions; import org.hibernate.criterion.Restrictions;
@@ -40,8 +41,10 @@ public class MetadataValueDAOImpl extends AbstractHibernateDAO<MetadataValue> im
{ {
Criteria criteria = createCriteria(context, MetadataValue.class); Criteria criteria = createCriteria(context, MetadataValue.class);
criteria.add( criteria.add(
Restrictions.eq("metadataField", metadataField) Restrictions.eq("metadataField.id", metadataField.getFieldID())
); );
criteria.setFetchMode("metadataField", FetchMode.JOIN);
return list(criteria); return list(criteria);
} }
@@ -51,6 +54,8 @@ public class MetadataValueDAOImpl extends AbstractHibernateDAO<MetadataValue> im
criteria.add( criteria.add(
Restrictions.like("value", "%" + value + "%") Restrictions.like("value", "%" + value + "%")
); );
criteria.setFetchMode("metadataField", FetchMode.JOIN);
return list(criteria); return list(criteria);
} }
@@ -66,7 +71,7 @@ public class MetadataValueDAOImpl extends AbstractHibernateDAO<MetadataValue> im
public MetadataValue getMinimum(Context context, int metadataFieldId) public MetadataValue getMinimum(Context context, int metadataFieldId)
throws SQLException throws SQLException
{ {
String queryString = "SELECT m FROM MetadataValue m WHERE metadata_field_id = :metadata_field_id ORDER BY text_value"; String queryString = "SELECT m FROM MetadataValue m JOIN FETCH m.metadataField WHERE m.metadataField.id = :metadata_field_id ORDER BY text_value";
Query query = createQuery(context, queryString); Query query = createQuery(context, queryString);
query.setParameter("metadata_field_id", metadataFieldId); query.setParameter("metadata_field_id", metadataFieldId);
query.setMaxResults(1); query.setMaxResults(1);

View File

@@ -150,6 +150,7 @@ public abstract class AbstractHibernateDAO<T> implements GenericDAO<T> {
*/ */
public T singleResult(Criteria criteria) public T singleResult(Criteria criteria)
{ {
criteria.setMaxResults(1);
List<T> list = list(criteria); List<T> list = list(criteria);
if(CollectionUtils.isNotEmpty(list)) if(CollectionUtils.isNotEmpty(list))
{ {

View File

@@ -22,6 +22,7 @@
<property name="hibernate.cache.use_second_level_cache">true</property> <property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.use_query_cache">true</property> <property name="hibernate.cache.use_query_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property> <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
<property name="javax.persistence.sharedCache.mode">ENABLE_SELECTIVE</property>
<!-- Entities to be loaded by hibernate --> <!-- Entities to be loaded by hibernate -->
@@ -74,10 +75,5 @@
<!--<mapping class="org.dspace.xmlworkflow.storedcomponents.WorkflowItemRole"/>--> <!--<mapping class="org.dspace.xmlworkflow.storedcomponents.WorkflowItemRole"/>-->
<!--<mapping class="org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem"/>--> <!--<mapping class="org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem"/>-->
<!--*********************-->
<!-- Cache configuration -->
<!--*********************-->
<class-cache class="org.dspace.content.MetadataSchema" usage="read-write" />
<class-cache class="org.dspace.content.MetadataField" usage="read-write" />
</session-factory> </session-factory>
</hibernate-configuration> </hibernate-configuration>