mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-10-01 14:41:46 +00:00
[ACS-10041] Repository - CPU spikes and OOM errors with SQL Server 2019 (#3588)
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -2,7 +2,7 @@
|
||||
* #%L
|
||||
* Alfresco Repository
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||
* Copyright (C) 2005 - 2025 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
@@ -36,8 +36,7 @@ import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
|
||||
/**
|
||||
* Class holding properties associated with the <b>sys:referenceable</b> aspect.
|
||||
* This aspect is common enough to warrant direct inclusion on the <b>Node</b> entity.
|
||||
* Class holding properties associated with the <b>sys:referenceable</b> aspect. This aspect is common enough to warrant direct inclusion on the <b>Node</b> entity.
|
||||
*
|
||||
* @author Derek Hulley
|
||||
* @since 3.4
|
||||
@@ -87,10 +86,8 @@ public class ReferenceablePropertiesEntity
|
||||
/**
|
||||
* Adds all {@link ContentModel#ASPECT_REFERENCEABLE referencable} properties.
|
||||
*/
|
||||
public static void addReferenceableProperties(Node node, Map<QName, Serializable> properties)
|
||||
public static void addReferenceableProperties(Long nodeId, NodeRef nodeRef, Map<QName, Serializable> properties)
|
||||
{
|
||||
Long nodeId = node.getId();
|
||||
NodeRef nodeRef = node.getNodeRef();
|
||||
properties.put(ContentModel.PROP_STORE_PROTOCOL, nodeRef.getStoreRef().getProtocol());
|
||||
properties.put(ContentModel.PROP_STORE_IDENTIFIER, nodeRef.getStoreRef().getIdentifier());
|
||||
properties.put(ContentModel.PROP_NODE_UUID, nodeRef.getId());
|
||||
|
@@ -2,7 +2,7 @@
|
||||
* #%L
|
||||
* Alfresco Repository
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||
* Copyright (C) 2005 - 2025 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
@@ -28,8 +28,10 @@ package org.alfresco.repo.node.getchildren;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.alfresco.repo.domain.node.NodeEntity;
|
||||
import org.alfresco.repo.domain.node.AuditablePropertiesEntity;
|
||||
import org.alfresco.repo.domain.node.NodePropertyEntity;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.repository.StoreRef;
|
||||
|
||||
/**
|
||||
* Filterable/Sortable Node Entity
|
||||
@@ -42,12 +44,17 @@ import org.alfresco.repo.domain.node.NodePropertyEntity;
|
||||
public class FilterSortNodeEntity
|
||||
{
|
||||
private Long id; // node id
|
||||
private String nodeUuid;
|
||||
private Long typeQNameId;
|
||||
|
||||
private NodeEntity node;
|
||||
private AuditablePropertiesEntity auditablePropertiesEntity;
|
||||
private NodePropertyEntity prop1;
|
||||
private NodePropertyEntity prop2;
|
||||
private NodePropertyEntity prop3;
|
||||
|
||||
private String storeProtocol;
|
||||
private String storeIdentifier;
|
||||
|
||||
// Supplemental query-related parameters
|
||||
private Long parentNodeId;
|
||||
private Long prop1qnameId;
|
||||
@@ -80,6 +87,26 @@ public class FilterSortNodeEntity
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getNodeUuid()
|
||||
{
|
||||
return nodeUuid;
|
||||
}
|
||||
|
||||
public void setNodeUuid(String nodeUuid)
|
||||
{
|
||||
this.nodeUuid = nodeUuid;
|
||||
}
|
||||
|
||||
public Long getTypeQNameId()
|
||||
{
|
||||
return typeQNameId;
|
||||
}
|
||||
|
||||
public void setTypeQNameId(Long typeQNameId)
|
||||
{
|
||||
this.typeQNameId = typeQNameId;
|
||||
}
|
||||
|
||||
public String getPattern()
|
||||
{
|
||||
return pattern;
|
||||
@@ -100,8 +127,7 @@ public class FilterSortNodeEntity
|
||||
sb.append(escapeChar);
|
||||
offset = idx + 1;
|
||||
}
|
||||
}
|
||||
while(idx != -1);
|
||||
} while (idx != -1);
|
||||
sb.append(s.substring(offset));
|
||||
return sb.toString();
|
||||
}
|
||||
@@ -137,6 +163,16 @@ public class FilterSortNodeEntity
|
||||
this.namePropertyQNameId = namePropertyQNameId;
|
||||
}
|
||||
|
||||
public AuditablePropertiesEntity getAuditablePropertiesEntity()
|
||||
{
|
||||
return auditablePropertiesEntity;
|
||||
}
|
||||
|
||||
public void setAuditablePropertiesEntity(AuditablePropertiesEntity auditablePropertiesEntity)
|
||||
{
|
||||
this.auditablePropertiesEntity = auditablePropertiesEntity;
|
||||
}
|
||||
|
||||
public NodePropertyEntity getProp1()
|
||||
{
|
||||
return prop1;
|
||||
@@ -167,14 +203,24 @@ public class FilterSortNodeEntity
|
||||
this.prop3 = prop3;
|
||||
}
|
||||
|
||||
public NodeEntity getNode()
|
||||
public String getStoreProtocol()
|
||||
{
|
||||
return node;
|
||||
return storeProtocol;
|
||||
}
|
||||
|
||||
public void setNode(NodeEntity childNode)
|
||||
public void setStoreProtocol(String storeProtocol)
|
||||
{
|
||||
this.node = childNode;
|
||||
this.storeProtocol = storeProtocol;
|
||||
}
|
||||
|
||||
public String getStoreIdentifier()
|
||||
{
|
||||
return storeIdentifier;
|
||||
}
|
||||
|
||||
public void setStoreIdentifier(String storeIdentifier)
|
||||
{
|
||||
this.storeIdentifier = storeIdentifier;
|
||||
}
|
||||
|
||||
// Supplemental query-related parameters
|
||||
@@ -258,4 +304,9 @@ public class FilterSortNodeEntity
|
||||
{
|
||||
this.isPrimary = isPrimary;
|
||||
}
|
||||
|
||||
public NodeRef createNodeRef()
|
||||
{
|
||||
return new NodeRef(new StoreRef(storeProtocol, storeIdentifier), nodeUuid);
|
||||
}
|
||||
}
|
@@ -2,7 +2,7 @@
|
||||
* #%L
|
||||
* Alfresco Repository
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||
* Copyright (C) 2005 - 2025 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
@@ -38,13 +38,16 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.springframework.extensions.surf.util.I18NUtil;
|
||||
|
||||
import org.alfresco.error.AlfrescoRuntimeException;
|
||||
import org.alfresco.model.ContentModel;
|
||||
import org.alfresco.query.CannedQueryParameters;
|
||||
import org.alfresco.query.CannedQuerySortDetails;
|
||||
import org.alfresco.query.CannedQuerySortDetails.SortOrder;
|
||||
import org.alfresco.repo.domain.node.AuditablePropertiesEntity;
|
||||
import org.alfresco.repo.domain.node.Node;
|
||||
import org.alfresco.repo.domain.node.NodeDAO;
|
||||
import org.alfresco.repo.domain.node.NodeEntity;
|
||||
import org.alfresco.repo.domain.node.NodePropertyEntity;
|
||||
@@ -69,15 +72,11 @@ import org.alfresco.service.namespace.QName;
|
||||
import org.alfresco.util.AlfrescoCollator;
|
||||
import org.alfresco.util.Pair;
|
||||
import org.alfresco.util.ParameterCheck;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.springframework.extensions.surf.util.I18NUtil;
|
||||
|
||||
/**
|
||||
* GetChildren canned query
|
||||
*
|
||||
* To get paged list of children of a parent node filtered by child type.
|
||||
* Also optionally filtered and/or sorted by one or more properties (up to three).
|
||||
* To get paged list of children of a parent node filtered by child type. Also optionally filtered and/or sorted by one or more properties (up to three).
|
||||
*
|
||||
* @author janv
|
||||
* @since 4.0
|
||||
@@ -100,7 +99,6 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
|
||||
|
||||
public static final QName FILTER_QNAME_NODE_IS_PRIMARY = QName.createQName("", "IS_PRIMARY");
|
||||
|
||||
|
||||
private NodeDAO nodeDAO;
|
||||
private QNameDAO qnameDAO;
|
||||
private CannedQueryDAO cannedQueryDAO;
|
||||
@@ -246,7 +244,6 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
|
||||
|
||||
filterSortPropCnt = setFilterSortParams(sortFilterProps, params);
|
||||
|
||||
|
||||
List<NodeRef> result = new ArrayList<>(0);
|
||||
|
||||
try
|
||||
@@ -777,7 +774,8 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
|
||||
if (results.size() >= BATCH_SIZE)
|
||||
{
|
||||
// batch
|
||||
preloadFilterSort();
|
||||
preloadNodes();
|
||||
filterSort();
|
||||
}
|
||||
|
||||
results.add(result);
|
||||
@@ -790,24 +788,27 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
|
||||
if (results.size() >= 0)
|
||||
{
|
||||
// finish batch
|
||||
preloadFilterSort();
|
||||
preloadNodes();
|
||||
filterSort();
|
||||
}
|
||||
}
|
||||
|
||||
private void preloadFilterSort()
|
||||
private void preloadNodes()
|
||||
{
|
||||
List<NodeRef> nodeRefs = new ArrayList<>(results.size());
|
||||
for (FilterSortNodeEntity result : results)
|
||||
{
|
||||
nodeRefs.add(result.getNode().getNodeRef());
|
||||
nodeRefs.add(result.createNodeRef());
|
||||
}
|
||||
|
||||
preload(nodeRefs);
|
||||
}
|
||||
|
||||
private void filterSort()
|
||||
{
|
||||
for (FilterSortNodeEntity result : results)
|
||||
{
|
||||
Node node = result.getNode();
|
||||
NodeRef nodeRef = node.getNodeRef();
|
||||
NodeRef nodeRef = result.createNodeRef();
|
||||
|
||||
Map<NodePropertyKey, NodePropertyValue> propertyValues = new HashMap<NodePropertyKey, NodePropertyValue>(3);
|
||||
|
||||
@@ -832,7 +833,7 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
|
||||
Map<QName, Serializable> propVals = nodePropertyHelper.convertToPublicProperties(propertyValues);
|
||||
|
||||
// Add referenceable / spoofed properties (including spoofed name if null)
|
||||
ReferenceablePropertiesEntity.addReferenceableProperties(node, propVals);
|
||||
ReferenceablePropertiesEntity.addReferenceableProperties(result.getId(), nodeRef, propVals);
|
||||
|
||||
// special cases
|
||||
|
||||
@@ -854,7 +855,7 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
|
||||
}
|
||||
|
||||
// Auditable props (eg. cm:creator, cm:created, cm:modifier, cm:modified, ...)
|
||||
AuditablePropertiesEntity auditableProps = node.getAuditableProperties();
|
||||
AuditablePropertiesEntity auditableProps = result.getAuditablePropertiesEntity();
|
||||
if (auditableProps != null)
|
||||
{
|
||||
for (Map.Entry<QName, Serializable> entry : auditableProps.getAuditableProperties().entrySet())
|
||||
@@ -864,7 +865,7 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
|
||||
}
|
||||
|
||||
// Node type
|
||||
Long nodeTypeQNameId = node.getTypeQNameId();
|
||||
Long nodeTypeQNameId = result.getTypeQNameId();
|
||||
if (nodeTypeQNameId != null)
|
||||
{
|
||||
Pair<Long, QName> pair = qnameDAO.getQName(nodeTypeQNameId);
|
||||
|
@@ -133,6 +133,14 @@
|
||||
<resultMap id="result_FilterSortNode" type="FilterSortNode">
|
||||
|
||||
<id property="id" column="id" jdbcType="BIGINT" javaType="java.lang.Long"/>
|
||||
<result property="nodeUuid" column="uuid" jdbcType="VARCHAR" javaType="java.lang.String"/>
|
||||
<result property="typeQNameId" column="type_qname_id" jdbcType="BIGINT" javaType="java.lang.Long"/>
|
||||
|
||||
<result property="auditablePropertiesEntity.auditCreator" column="audit_creator" jdbcType="VARCHAR" javaType="java.lang.String"/>
|
||||
<result property="auditablePropertiesEntity.auditCreated" column="audit_created" jdbcType="VARCHAR" javaType="java.lang.String"/>
|
||||
<result property="auditablePropertiesEntity.auditModifier" column="audit_modifier" jdbcType="VARCHAR" javaType="java.lang.String"/>
|
||||
<result property="auditablePropertiesEntity.auditModified" column="audit_modified" jdbcType="VARCHAR" javaType="java.lang.String"/>
|
||||
<result property="auditablePropertiesEntity.auditAccessed" column="audit_accessed" jdbcType="VARCHAR" javaType="java.lang.String"/>
|
||||
|
||||
<result property="prop1.nodeId" column="prop1_node_id" jdbcType="BIGINT" javaType="java.lang.Long"/>
|
||||
<result property="prop1.key.qnameId" column="prop1_qname_id" jdbcType="BIGINT" javaType="java.lang.Long"/>
|
||||
@@ -170,7 +178,8 @@
|
||||
<result property="prop3.value.doubleValue" column="prop3_double_value" jdbcType="FLOAT" javaType="java.lang.Double"/>
|
||||
<result property="prop3.value.stringValue" column="prop3_string_value" jdbcType="VARCHAR" javaType="java.lang.String"/>
|
||||
|
||||
<association property="node" resultMap="alfresco.node.result_Node"/>
|
||||
<result property="storeProtocol" column="protocol" jdbcType="VARCHAR" javaType="java.lang.String"/>
|
||||
<result property="storeIdentifier" column="identifier" jdbcType="VARCHAR" javaType="java.lang.String"/>
|
||||
|
||||
</resultMap>
|
||||
|
||||
@@ -972,8 +981,8 @@
|
||||
</select>
|
||||
|
||||
<!-- GetChildren - with explicit prop filtering and/or sorting -->
|
||||
<select id="select_GetChildrenCannedQueryWithProps" parameterType="FilterSortNode" resultMap="result_FilterSortNode">
|
||||
select
|
||||
<select id="select_GetChildrenCannedQueryWithProps" parameterType="FilterSortNode" resultMap="result_FilterSortNode" flushCache="true">
|
||||
select distinct
|
||||
childNode.id as id,
|
||||
childNode.version as version,
|
||||
childStore.id as store_id,
|
||||
@@ -1067,9 +1076,6 @@
|
||||
#{item}
|
||||
</foreach>
|
||||
</if>
|
||||
<if test="prop1qnameId == null and auditableProps == false">
|
||||
<include refid="alfresco.node.select_ChildAssoc_OrderBy"/>
|
||||
</if>
|
||||
</select>
|
||||
|
||||
<!-- GetChildren - with no explicit sorting (or prop filtering) - note: still filtered by child type (and optionally primary or secondary) -->
|
||||
|
Reference in New Issue
Block a user