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

View File

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

View File

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

View File

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

View File

@@ -48,7 +48,7 @@ public class MetadataSchemaDAOImpl extends AbstractHibernateDAO<MetadataSchema>
criteria.add(Restrictions.eq("namespace", namespace));
criteria.setCacheable(true);
return uniqueResult(criteria);
return singleResult(criteria);
}
@Override
@@ -81,7 +81,7 @@ public class MetadataSchemaDAOImpl extends AbstractHibernateDAO<MetadataSchema>
));
criteria.setCacheable(true);
return uniqueResult(criteria) == null;
return singleResult(criteria) == null;
}
/**
@@ -103,7 +103,7 @@ public class MetadataSchemaDAOImpl extends AbstractHibernateDAO<MetadataSchema>
));
criteria.setCacheable(true);
return uniqueResult(criteria) == null;
return singleResult(criteria) == null;
}
/**
@@ -125,6 +125,6 @@ public class MetadataSchemaDAOImpl extends AbstractHibernateDAO<MetadataSchema>
);
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.MetadataValue;
import org.dspace.content.dao.MetadataValueDAO;
import org.dspace.core.Context;
import org.dspace.core.AbstractHibernateDAO;
import org.dspace.core.Context;
import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.Query;
import org.hibernate.criterion.Restrictions;
@@ -40,8 +41,10 @@ public class MetadataValueDAOImpl extends AbstractHibernateDAO<MetadataValue> im
{
Criteria criteria = createCriteria(context, MetadataValue.class);
criteria.add(
Restrictions.eq("metadataField", metadataField)
Restrictions.eq("metadataField.id", metadataField.getFieldID())
);
criteria.setFetchMode("metadataField", FetchMode.JOIN);
return list(criteria);
}
@@ -51,6 +54,8 @@ public class MetadataValueDAOImpl extends AbstractHibernateDAO<MetadataValue> im
criteria.add(
Restrictions.like("value", "%" + value + "%")
);
criteria.setFetchMode("metadataField", FetchMode.JOIN);
return list(criteria);
}
@@ -66,7 +71,7 @@ public class MetadataValueDAOImpl extends AbstractHibernateDAO<MetadataValue> im
public MetadataValue getMinimum(Context context, int metadataFieldId)
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.setParameter("metadata_field_id", metadataFieldId);
query.setMaxResults(1);

View File

@@ -150,6 +150,7 @@ public abstract class AbstractHibernateDAO<T> implements GenericDAO<T> {
*/
public T singleResult(Criteria criteria)
{
criteria.setMaxResults(1);
List<T> list = list(criteria);
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_query_cache">true</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 -->
@@ -74,10 +75,5 @@
<!--<mapping class="org.dspace.xmlworkflow.storedcomponents.WorkflowItemRole"/>-->
<!--<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>
</hibernate-configuration>