I'm currently developing an Angular/Groovy Application and have a very slow performance by marshaling a payload in backend (groovy). It needs a very long time to get it finish, send it to frontend and render.
In backend I have:
def getAll(String userName) {
def payload = marshalSteps(Step.findAllByUserName(userName))
if (payload.size() <= 0) {
payload = NO_STEPS
}
payload
}
marshalSteps looks like this:
private static def marshalSteps(List<Step> steps) {
def payload = []
steps.each {
payload << marshalMinimalStep(it)
}
payload
}
Because we send different marshaling for every request, marshalMinimalStep looks like:
private static def marshalMinimalStep(Step step) {
def payload = [
id : step.id,
name : step.name,
names : marshalTranslation(step.names),
shortcut : step.shortcut,
week : step.week.doubleValue(),
isRelevant : step.isRelevant
]
payload
}
In frontend I'm using ng-repeat to display all the steps.
<ul class="list-group" ng-show="stepCtrl.steps.length > 0">
<div ng-repeat="step in stepCtrl.steps | orderBy:'name' track by step.id">
<div class="col-md-10">
<li class="list-group-item overview" ng-click="stepCtrl.edit(step.id)">
<display-name translations="step.names"></display-name>
<span class="pull-right">{{step.week}}</span>
</li>
</div>
</div>
</ul>
I have around 9.000 steps and need around 150,000ms to perform that getAll() method and render the steps in frontend, which is too slow.
What can I do to improve the performance?
Do I have to bulk-fetching in Hibernate, like sessionFactory.currentSession.clear()?
I put also the marshalTranslation() as a part of the question.
private static def marshalTranslation(List<Translation> translations) {
def payload = []
translations.each {
payload << [
language: it.language,
content : it.content
]
}
payload
}