My new Model Glue app is painfully slow so I did some detective work to find
out what is causing the problem. I determined at least part of the problem
is due to a query in reactor. I'll post the enhancement at the bottom of
this message. There may be drawbacks to my change so someone should look it
over before I submit a Trac ticket.
I created a default Model Glue application based on the modelglueapplication
template. All it has added to It is one scaffold for a table that has an
auto increment primary key field and one other text field.
Using a stop watch I timed list, insert, and update events. (the hundreds of
seconds could be off due to my button pushing on my stop watch)
I did this for the basic app on my local machine.
I did this for the same table inside my full application on my local
machine.
I did this for the same table inside my full application on our development
UNIX server.
The full application has a pretty big reactor.xml with a lot of one to many
and many to many relationships defined.
I hope this comes out formatted so everyone can read it easily. If not let
me know and I'll try again.
time in seconds Local Basic App Local Full App UNIX Full App
Before ObjectDao Change
init 1.1 4.96 20.18 list 1.05 1.26 4.59 edit (time for form to
come up) 45.7 45.46 27.03 save (time for list to come back)
43.08 44.24 27.73 edit (again) 1.09 1.02 4.44 save
(again) 42.61 44.61 26.54 edit (third time) 0.75 1.12 4.37 save
(third time) 42.93 44.44 26.72
After ObjectDao Change
init 1.58 5.1 19.78 list 1.11 1.28 4.15 edit (time for form to
come up) 14.95 14.81 11.71 save (time for list to come back)
12.01 13.77 11.72 edit (again) 0.94 1.1 4.58 save
(again) 11.78 13.19 11.44 edit (third time) 0.85 1.19 4.61 save
(third time) 11.65 13.51 12.06
Here is the change I made to reactor\data\oracle\ObjectDao.cfc
cffunction name="readFields"
LOOK FOR THE ALL CAPS COMMENTS
<cfquery name="qFields" datasource="#getDsn()#"
username="#getUsername()#" password="#getPassword()#">
SELECT
col.COLUMN_NAME as name,
CASE
WHEN primaryConstraints.column_name IS NULL THEN
'false'
ELSE 'true'
END as primaryKey,
/* Oracle has no equivalent to autoincrement or
identity */
'false' AS
"IDENTITY",
CASE
WHEN col.NULLABLE = 'Y' THEN 'true'
ELSE 'false'
END as NULLABLE,
col.DATA_TYPE as dbDataType,
case
/* 26 is the length of now() in ColdFusion (i.e. {ts
'2006-06-26 13:10:14'})*/
when col.data_type = 'DATE' then 26
/* Oracle can compress a number in a smaller field so
use precision if available */
else nvl(col.data_precision, col.data_length)
end as length,
col.data_scale as scale,
col.DATA_DEFAULT as "DEFAULT",
CASE
WHEN updateCol.updatable = 'YES' THEN 'false'
ELSE 'true'
END as readonly
FROM all_tab_columns col,
all_updatable_columns updateCol,
( select colCon.column_name,
colcon.table_name
from all_cons_columns colCon,
all_constraints tabCon
where tabCon.table_name = <cfqueryparam
cfsqltype="cf_sql_varchar" maxlength="128"
value="#arguments.Object.getName()#" />
AND colCon.CONSTRAINT_NAME = tabCon.CONSTRAINT_NAME
<!--- ORIGINAL CODE
AND colCon.TABLE_NAME = tabCon.TABLE_NAME
--->
<!--- ENHANCED CODE --->
AND colCon.TABLE_NAME = <cfqueryparam
cfsqltype="cf_sql_varchar" maxlength="128"
value="#arguments.Object.getName()#" />
AND 'P' = tabCon.CONSTRAINT_TYPE
) primaryConstraints
where col.table_name = <cfqueryparam
cfsqltype="cf_sql_varchar" maxlength="128"
value="#arguments.Object.getName()#" />
and col.COLUMN_NAME =
primaryConstraints.COLUMN_NAME (+)
AND col.TABLE_NAME = primaryConstraints.TABLE_NAME(+)
<!--- ORIGINAL CODE
and updateCol.table_name (+) = col.table_name
and updateCol.COLUMN_NAME (+) = col.COLUMN_NAME
--->
<!--- ENHANCED CODE --->
and updateCol.table_name = <cfqueryparam
cfsqltype="cf_sql_varchar" maxlength="128"
value="#arguments.Object.getName()#" />
and updateCol.COLUMN_NAME = col.COLUMN_NAME
order by col.column_id
</cfquery>
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
Reactor for ColdFusion Mailing List
[EMAIL PROTECTED]
Archives at: http://www.mail-archive.com/reactor%40doughughes.net/
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --