[ 
https://issues.apache.org/jira/browse/FINERACT-2561?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Adam Saghy resolved FINERACT-2561.
----------------------------------
    Fix Version/s: 1.15.0
       Resolution: Fixed

> 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
>            Priority: Major
>              Labels: accounting, database, journal-entry, performance
>             Fix For: 1.15.0
>
>   Original Estimate: 2h
>  Remaining Estimate: 2h
>
> 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)

Reply via email to