Skip to content

Commit 732d462

Browse files
authored
Improve XmlDsDump performance and resource handling using EntityQuery and auto-closing iterators (#1164)
1 parent 9fd008f commit 732d462

1 file changed

Lines changed: 47 additions & 52 deletions

File tree

  • framework/webtools/src/main/groovy/org/apache/ofbiz/webtools/entity

framework/webtools/src/main/groovy/org/apache/ofbiz/webtools/entity/XmlDsDump.groovy

Lines changed: 47 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import org.apache.ofbiz.entity.condition.EntityCondition
2525
import org.apache.ofbiz.entity.condition.EntityJoinOperator
2626
import org.apache.ofbiz.entity.model.ModelViewEntity
2727
import org.apache.ofbiz.entity.transaction.TransactionUtil
28-
import org.apache.ofbiz.entity.util.EntityFindOptions
28+
import org.apache.ofbiz.entity.util.EntityQuery
2929

3030
outpath = parameters.outpath
3131
filename = parameters.filename
@@ -188,7 +188,6 @@ if (passedEntityNames) {
188188
session.setAttribute('xmlrawdump_entitylist', passedEntityNames)
189189
session.setAttribute('entityDateCond', entityDateCond)
190190
} else {
191-
efo = new EntityFindOptions(true, EntityFindOptions.TYPE_SCROLL_INSENSITIVE, EntityFindOptions.CONCUR_READ_ONLY, false)
192191
numberOfEntities = passedEntityNames?.size() ?: 0
193192
context.numberOfEntities = numberOfEntities
194193
numberWritten = 0
@@ -213,22 +212,22 @@ if (passedEntityNames) {
213212
beganTransaction = TransactionUtil.begin(3600)
214213
try {
215214
me = reader.getModelEntity(curEntityName)
216-
if (me.getNoAutoStamp() || me instanceof ModelViewEntity) {
217-
values = delegator.find(curEntityName, null, null, null, null, efo)
218-
} else {
219-
values = delegator.find(curEntityName, entityDateCond, null, null, null, efo)
215+
entityQuery = EntityQuery.use(delegator).from(curEntityName).cursorScrollInsensitive()
216+
if (!me.getNoAutoStamp() && !(me instanceof ModelViewEntity) && entityDateCond) {
217+
entityQuery.where(entityDateCond)
220218
}
221219

222220
curNumberWritten = 0
223-
while ((value = values.next()) != null) {
224-
value.writeXmlText(writer, '')
225-
numberWritten++
226-
curNumberWritten++
227-
if (curNumberWritten % 500 == 0 || curNumberWritten == 1) {
228-
Debug.log("Records written [$curEntityName]: $curNumberWritten Total: $numberWritten")
221+
entityQuery.queryIterator().withCloseable { values ->
222+
while ((value = values.next()) != null) {
223+
value.writeXmlText(writer, '')
224+
numberWritten++
225+
curNumberWritten++
226+
if (curNumberWritten % 500 == 0 || curNumberWritten == 1) {
227+
Debug.log("Records written [$curEntityName]: $curNumberWritten Total: $numberWritten")
228+
}
229229
}
230230
}
231-
values.close()
232231
Debug.log("Wrote [$curNumberWritten] from entity : $curEntityName")
233232
TransactionUtil.commit(beganTransaction)
234233
} catch (Exception e) {
@@ -258,7 +257,6 @@ if (passedEntityNames) {
258257
fileName = preConfiguredSetName ? UtilFormatOut.formatPaddedNumber((long) fileNumber, 3) + '_' : ''
259258
fileName = fileName + curEntityName
260259

261-
values = null
262260
beganTransaction = false
263261
try {
264262
beganTransaction = TransactionUtil.begin(3600)
@@ -268,47 +266,48 @@ if (passedEntityNames) {
268266
results.add("[$fileNumber] [vvv] $curEntityName skipping view entity")
269267
return
270268
}
271-
if (me.getNoAutoStamp() || me instanceof ModelViewEntity) {
272-
values = delegator.find(curEntityName, null, null, null, null, efo)
273-
} else {
274-
values = delegator.find(curEntityName, entityDateCond, null, null, null, efo)
269+
entityQuery = EntityQuery.use(delegator).from(curEntityName).cursorScrollInsensitive()
270+
if (!me.getNoAutoStamp() && !(me instanceof ModelViewEntity) && entityDateCond) {
271+
entityQuery.where(entityDateCond)
275272
}
276273
isFirst = true
277274
writer = null
278275
fileSplitNumber = 1
279-
while ((value = values.next()) != null) {
280-
//Don't bother writing the file if there's nothing
281-
//to put into it
282-
if (isFirst) {
283-
writer = new PrintWriter(
284-
new BufferedWriter(
285-
new OutputStreamWriter(new FileOutputStream(new File(outdir, fileName + '.xml')), 'UTF-8')))
286-
writer.println('<?xml version="1.0" encoding="UTF-8"?>')
287-
writer.println('<entity-engine-xml>')
288-
isFirst = false
289-
}
290-
value.writeXmlText(writer, '')
291-
numberWritten++
276+
entityQuery.queryIterator().withCloseable { values ->
277+
while ((value = values.next()) != null) {
278+
//Don't bother writing the file if there's nothing
279+
//to put into it
280+
if (isFirst) {
281+
writer = new PrintWriter(
282+
new BufferedWriter(
283+
new OutputStreamWriter(new FileOutputStream(new File(outdir, fileName + '.xml')), 'UTF-8')))
284+
writer.println('<?xml version="1.0" encoding="UTF-8"?>')
285+
writer.println('<entity-engine-xml>')
286+
isFirst = false
287+
}
288+
value.writeXmlText(writer, '')
289+
numberWritten++
292290

293-
// split into small files
294-
if (maxRecordsPerFile > 0 && (numberWritten % maxRecordsPerFile == 0)) {
295-
fileSplitNumber++
296-
// close the file
297-
writer.println('</entity-engine-xml>')
298-
writer.close()
291+
// split into small files
292+
if (maxRecordsPerFile > 0 && (numberWritten % maxRecordsPerFile == 0)) {
293+
fileSplitNumber++
294+
// close the file
295+
writer.println('</entity-engine-xml>')
296+
writer.close()
299297

300-
// create a new file
301-
splitNumStr = UtilFormatOut.formatPaddedNumber((long) fileSplitNumber, 3)
302-
writer = new PrintWriter(
303-
new BufferedWriter(
304-
new OutputStreamWriter(
305-
new FileOutputStream(new File(outdir, fileName + '_' + splitNumStr + '.xml')), 'UTF-8')))
306-
writer.println('<?xml version="1.0" encoding="UTF-8"?>')
307-
writer.println('<entity-engine-xml>')
308-
}
298+
// create a new file
299+
splitNumStr = UtilFormatOut.formatPaddedNumber((long) fileSplitNumber, 3)
300+
writer = new PrintWriter(
301+
new BufferedWriter(
302+
new OutputStreamWriter(
303+
new FileOutputStream(new File(outdir, fileName + '_' + splitNumStr + '.xml')), 'UTF-8')))
304+
writer.println('<?xml version="1.0" encoding="UTF-8"?>')
305+
writer.println('<entity-engine-xml>')
306+
}
309307

310-
if (numberWritten % 500 == 0 || numberWritten == 1) {
311-
Debug.log("Records written [$curEntityName]: $numberWritten")
308+
if (numberWritten % 500 == 0 || numberWritten == 1) {
309+
Debug.log("Records written [$curEntityName]: $numberWritten")
310+
}
312311
}
313312
}
314313
if (writer) {
@@ -322,11 +321,7 @@ if (passedEntityNames) {
322321
Debug.log(thisResult)
323322
results.add(thisResult)
324323
}
325-
values.close()
326324
} catch (Exception ex) {
327-
if (values != null) {
328-
values.close()
329-
}
330325
thisResult = "[$fileNumber] [xxx] Error when writing $curEntityName: $ex"
331326
Debug.log(thisResult)
332327
results.add(thisResult)

0 commit comments

Comments
 (0)