mirror of
https://github.com/DSpace/DSpace.git
synced 2025-10-13 13:03:11 +00:00
DS-3086: Optimized query and entity caching
This commit is contained in:
@@ -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;
|
||||||
|
|
||||||
|
@@ -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
|
||||||
{
|
{
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
@@ -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))
|
||||||
{
|
{
|
||||||
|
@@ -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>
|
||||||
|
Reference in New Issue
Block a user