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

Michael Dick resolved OPENJPA-464.
----------------------------------

    Resolution: Fixed

> Performance improvement with Statement Batching support
> -------------------------------------------------------
>
>                 Key: OPENJPA-464
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-464
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: kernel
>    Affects Versions: 1.1.0
>            Reporter: Teresa Kan
>            Assignee: Michael Dick
>             Fix For: 1.1.0
>
>         Attachments: OPENJPA-464.patch, OPENJPA-464.patch2, 
> OPENJPA-464.patch3, statement batch design_1211.doc
>
>
> The current OpenJPA implementation did not provide the SQL statement 
> batching. All SQL statements will be executed one statement at a time to the 
> database. Consequently, the runtime performance was decreased due to lots of 
> database flows. JDBC Specification provides the batch capability for insert, 
> update and delete statements through the addBatch() and executeBatch() APIs. 
> We should be able to take advantage of this capability to support SQL 
> statement batching in OpenJPA.
> According to the old version of the OpenJPA manual (i.e., Kodo), statement 
> batching was part of the initial functions. Conscious decision by BEA that 
> this function was not contributed back to OpenJPA. We can still use this info 
> as the implementation base with some modifications. 
> I have completed the work for this statement batching support and the patch 
> has been tested by CTS against Derby and DB2, OPENJPA regression test as well 
> as our internal FVT test bucket.  The following section describes the design 
> and implementation info. I also attached the whole design documentation and 
> the patch in this jira. Once the design and implementation are accepted, then 
> I will update the OPENJPA manual to include this function. Thanks,
> Design and implementation:
> •     Configuration:
> o     Batch Limit value: 
>      0 - Disable batch support.
>      -1 - Unlimited number of statements for a batch.
>      Any positive number - Maximum number of statements for a batch.
> o     By default, the batch support is based on each Dictionary to define the 
> default batch limit. Currently only DB2 and Oracle dictionaries are set the 
> default batch limit to 100. The default batch limit for rest of the 
> dictionaries is set to zero (disabled).
> o     To enable the batch support, user can specify the following property in 
> the persistence.xml file:
> <property name="openjpa.jdbc.DBDictionary" value="BatchLimit=25"/>
> or
> <property name="openjpa.jdbc.DBDictionary"
> value="db2(batchLimit=25)"/>
> •     Basic design is to cache all the insert/update/delete statements during 
> the execution of the PreparedStatementManagerImpl.flushInternal() method. 
> There is a cache structure which uses the LinkHashMap to maintain the order 
> of the SQL statements for execution:
> o     _cacheSql - a LinkHashMap to store the rows that associate with one 
> PrepareStatement. Key: SQL statement string; Value: array list of rows.
> During the PreparedStatementManagerImpl.flush() process, it will go through 
> the cache to prepare the SQL statement; add the statement to the batch; and 
> execute the batch when the batch limit is reached or all the rows are 
> processed for that statement. Validate the update count after the 
> executeBatch() method.
> •     If the batch limit =0 (disabled), execute the statement as the normal 
> process; no need to use the batching process.  Same rule applies to the 
> statement that only has one row, execute it as the normal process. 
> •     The batch process will be disabled if the primary key generation is 
> used the Identity strategy. When the GeneratedType=IDENTITY, we need to get 
> the ID value right away for the in-memory entity to use. Therefore, we can't 
> batch this kind of statement.
> •     Batch exception process: a checkUpdateCount() is used to validate the 
> batch process after the executeBatch(). According to the javadoc, there are 
> three cases to consider:
> o     Case of EXECUTE_FAILED: (-3): 
>      This is a failure case. If the action is UPDATE or there is 
> FailedObject, treats it as OptimisticException. Otherwise, throws the 
> SQLException.
>      This is the same process as current implementation.
> o     Case of  SUCCESS_NO_INFO: (-2): 
>      We treat this as successful case and log the info in the log.
> o     Case of 0: 
>      If there is a FailedObject or the action is INSERT, then throws the 
> SQLException. Otherwise, treats it as successful case. 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to