You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@fineract.apache.org by "HuangXi (Jira)" <ji...@apache.org> on 2026/03/27 14:31:00 UTC
[jira] [Created] (FINERACT-2561) Performance issue: repeated organisation currency validation query inside saveAllDebitOrCreditEntries() loop
HuangXi created FINERACT-2561:
---------------------------------
Summary: Performance issue: repeated organisation currency validation query inside saveAllDebitOrCreditEntries() loop
Key: FINERACT-2561
URL: https://issues.apache.org/jira/browse/FINERACT-2561
Project: Apache Fineract
Issue Type: Bug
Components: Accounting
Affects Versions: 1.14.0
Reporter: HuangXi
h2. Summary
Performance issue: repeated organisation currency validation query inside journal entry insertion loop.
h2. Description
There is a database-related performance issue in the manual journal entry creation flow.
In the following class and method, the same organisation currency validation query is executed inside the per-entry loop.
h3. Class
{{org.apache.fineract.accounting.journalentry.service.JournalEntryWritePlatformServiceJpaRepositoryImpl}}
h3. Source file
{{fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java}}
h3. Method
{{saveAllDebitOrCreditEntries(...)}}
h2. Current implementation
Inside the loop, the code executes:
{{this.organisationCurrencyRepository.findOneWithNotFoundDetection(currencyCode);}}
Since {{currencyCode}} does not change within a single request, this causes the same validation query to be executed repeatedly for every debit/credit entry.
h2. Relevant code path
{{createJournalEntry(...)}} → {{saveAllDebitOrCreditEntries(...)}}
h2. Why this looks unnecessary
In the same class, the comparable method for opening balance processing already performs the same currency validation once before entering the loop.
h3. Method
{{saveAllDebitOrCreditOpeningBalanceEntries(...)}}
That means the current implementation in {{saveAllDebitOrCreditEntries(...)}} is inconsistent with the similar logic already used elsewhere in the same class.
h2. Current behavior
For each journal entry line, the service does the following:
# Loads the GL account
# Validates the GL account
# Validates the same organisation currency again
# Persists the journal entry
As a result, one manual journal entry request with many debit/credit lines triggers repeated identical database lookups for the same {{currencyCode}}.
h2. Expected behavior
Organisation currency validation should still happen, but it should be executed once per request (or once per method invocation before iterating over the entries), instead of once per loop iteration.
h2. Impact
* Avoidable repeated database round-trips
* Increased latency when creating journal entries with many lines
* Unnecessary database load in an accounting write path
h2. Steps to reproduce
# Submit a manual journal entry request with multiple debit and/or credit lines using the same currency code.
# Enable SQL logging or use query profiling.
# Observe that {{organisationCurrencyRepository.findOneWithNotFoundDetection(currencyCode)}} is executed repeatedly during the same request.
h2. Notes
This issue is not about removing validation. The issue is that the same validation query is executed repeatedly inside the loop even though {{currencyCode}} remains constant for the whole operation.
h2. Additional reference
A similar flow in the same class already validates currency outside the loop: {{saveAllDebitOrCreditOpeningBalanceEntries(...)}}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)