Georg Kallidis commented on TORQUE-364:

Thanks for reporting this issue. To check, if this could be included in the 
upcoming release and to tackle it down a little bit more, what about it is 
exactly and what to do, some more information would be helpful:

Indeed mappers are applied for each single row, there is some overhead here, 
but I could not find any usage of StringBuilder used in any RecordMapper<T> 
classes. Do yo mean applying some SQL expression e.g. in (always assuming 
package {{org.apache.torque) in }}{{{}ColumnImpl.ColumnImpl(.. String 
sqlExpression){}}}? This happens of course already in building the SQL query 
(e.g {{sql.SqlBuilder.buildQuery(Criteria)) }}in doSelect() methods. The query 
is indeed build with StringBuilder in 

More generally this may be about some caching mechanism, e.g. applying some 
kind of save immutable context.

Could you give a more exact example, where this happens most obviously in the 
Torque template or runtime code? 

> RecordMapper very slow on many columns in table
> -----------------------------------------------
>                 Key: TORQUE-364
>                 URL: https://issues.apache.org/jira/browse/TORQUE-364
>             Project: Torque
>          Issue Type: Improvement
>          Components: Runtime, Templates
>    Affects Versions: 5.1
>            Reporter: Max Philipp Wriedt
>            Priority: Major
>              Labels: criteria_api, om, performance, recordmapper, templates
> When "doSelect()" a large quantity of columns in a table the default 
> RecordMappers generated by Om-Templates (processRow()) cause an  
> !https://wikimedia.org/api/rest_v1/media/math/render/svg/4441d9689c0e6b2c47994e2f587ac5378faeefba!
>  Problem. (technically O(rows * columns))
> Specifically, constantly generating the SQL expression of all possible 
> columns for every row in the result causes excessive use of StringBuilders 
> which slow the mapping process to a crawl.
> I currently have two ideas on how best to tackle this problem:
>  # Either generate all SQL column expressions once when a (template 
> generated) RecordMapper is first created (using final static String fields) 
> thus reducing the cost for every row to generating all selected column SQL 
> expressions  once(instead of every selected column times every available 
> column)
>  # Or (in case the first approach generates unacceptably excessive number of 
> fields for RecordMappers) adjust the RecordMapper API to allow a 
> "prepare(Criteria, int offset)" method to be called once before processing 
> any rows and implement it on generated RecordMappers to scan the Criteria and 
> build two lists: One containing references to the setXXX methods of the 
> mapper in the order they appear in the ResultSet (via the order in the 
> Criteria) and a second list containing the corresponding column offsets. This 
> would allow the processRow method to only iterated over both lists 
> simultaneously and call the referenced methods with the result set and offset 
> immediately. (Alternatively one list using lambdas could be used but I am 
> currently not sure about the stance or impact of these lambdas in the Torque 
> project.)
> credits to [~refarb] 

This message was sent by Atlassian Jira

To unsubscribe, e-mail: torque-dev-unsubscr...@db.apache.org
For additional commands, e-mail: torque-dev-h...@db.apache.org

Reply via email to