So would over 2 minutes be considered acceptable/normal for OJB then?
|-----Original Message-----
|From: Ebersole, Steven [mailto:[EMAIL PROTECTED]
|Sent: Tuesday, March 18, 2003 10:28 AM
|To: 'OJB Users List'
|Subject: RE: performance
|
|
|I did I little more troubleshooting (hacking) and found
|that, at least in
|part, the problem is caused by the Contact's reference to
|the Person class
|and Company class. If I proxy those references or remove
|them, the load
|time goes from 2 minutes 5 seconds down to 30 seconds for
|the company with
|1524 employees.
|
|The problem with proxying the Person reference is that
|there is never a time
|when I would need the Contact without their name, which is
|kept on the
|PERSON table mapping to the Person class.
|
|Basically the concept I am trying to model here is a
|person's relationship
|to a company. Ideally, the Contact class would simply be
|a sub-class of
|Person with the company relation information on that
|Contact concrete
|subclass. Yet from what I have read OJB does not support
|subclassing across
|tables, aside from indirectly as I have modeled it. Is
|there a better way
|to map this relationship using OJB? Or maybe a way to
|force OJB to perform
|an outer join here since it is a single association going
|from the Contact
|to the Person? Maybe a custom RowReader impl?
|
|I also verified (as I think Cristian was trying to imply)
|that the queries
|themselves are pretty quick, at least through Oracle's sqlplus.
|
|
|Anyway, any help would be great.
|
|
|
|-----Original Message-----
|From: Malinescu, Cristian [mailto:[EMAIL PROTECTED]
|Sent: Tuesday, March 18, 2003 8:43 AM
|To: 'OJB Users List'
|Subject: RE: performance
|
|
|Hi, surprising how much similarity, we are doing also some CRM
|and we used some commercial appsrv( like "t3://myserver:7001" ;-) )
|till we become very piss off because of entity ejb performance
|and now we will migrate to tomcat and ojb ( currently
|4.1.18/1.0rc1 )
|and our performance test are till now very satisfactory ...
|Regards,
|Cristian
|
|-----Original Message-----
|From: Ebersole, Steven [mailto:[EMAIL PROTECTED]
|Sent: Dienstag, 18. M�rz 2003 15:30
|To: 'OJB Users List'
|Subject: RE: performance
|
|
|Thanks for the response.
|
|First the database schema is completely normalized. And
|unfortunately I
|cant work with just 15 tables; this is the begining of a
|CRM app and phase
|one alone has over 300 tables. All PK and FK are also set
|up as indexes.
|Not that it (should) matter much, but we also use Oracle 8i.
|
|As for the source code, this is just a simple test class
|(code below) and as
|such, there is only one PB instance. This is not yet even
|incurring the
|overhead of the EJB calls.
|
|
|public class TestCompanyMappings
|{
| private static final Logger log = Logger.getRootLogger();
|
| public TestCompanyMappings()
| {
| System.setProperty( "OJB.properties",
|"properties/OJB.properties"
|);
| System.setProperty( Context.PROVIDER_URL,
|"t3://myserver:7001" );
| System.setProperty( Context.INITIAL_CONTEXT_FACTORY,
|"weblogic.jndi.WLInitialContextFactory" );
| }
|
| public static void main( String[] args )
| {
| TestCompanyMappings me = new TestCompanyMappings();
| me.execute();
| }
|
| private void execute()
| {
| PersistenceBroker broker = null;
| Criteria crit = null;
| crit = new Criteria();
| crit.addEqualTo( "id", new Integer(1) );
| Query query = new QueryByCriteria( Company.class, crit );
|
| try
| {
| broker =
|PersistenceBrokerFactory.defaultPersistenceBroker();
| log.debug( "Starting query" );
| java.util.Collection extent =
|broker.getCollectionByQuery( query
|);
| log.debug( "Done query; iterating" );
| java.util.Iterator iter = extent.iterator();
| while (iter.hasNext())
| {
| display( (Company)iter.next() );
| }
| log.debug( "Done iterating" );
| }
| catch( Throwable t )
| {
| log.error( "Error occurred", t );
| }
| finally
| {
| if (broker != null)
| {
| try
| {
| broker.close();
| }
| catch( Throwable t )
| {}
| }
| }
| }
| private void display( Company company )
| {
| System.out.println(
|"***********************************************" );
| System.out.println( " ID : " +
|company.getId() );
| System.out.println( " Name : " +
|company.getName() );
| System.out.println(
|"***********************************************" );
|
| log.debug( "Forcing load of employees" );
| System.out.println( " First contact last-name : " +
|((Contact)company.getEmployees().iterator().next()).getPers
|on().getLastName(
|) );
| log.debug( "Employees loaded" );
| }
|}
|
|
|
|-----Original Message-----
|From: Malinescu, Cristian [mailto:[EMAIL PROTECTED]
|Sent: Tuesday, March 18, 2003 8:18 AM
|To: 'OJB Users List'
|Subject: RE: performance
|
|
|Hi
|My opinion is basically to take a look at your sourcecode first and
|don't forget to index your tables.
|For me, for my typical situation/project I can tell next details :
|My Oracle 8 database schema for test contains ~ 15 tables
|with more than
|300 total defined columns, minimum indexed, with 1:n and
|n:m relations
|using indirection tables, and a total of more than 200.000
|entries and a
|complete test suite where full schema is parsed takes
|under 20 seconds.
|Some development advice is to take care to create in your
|source code
|one PBKey/PersistenceBroker instance and to cache this for
|later usage.
|Regards,
|Cristian
|
|
|-----Original Message-----
|From: Ebersole, Steven [mailto:[EMAIL PROTECTED]
|Sent: Dienstag, 18. M�rz 2003 15:03
|To: OJB Users List (E-mail)
|Subject: performance
|
|
|I am running into a huge performance issue and was hoping
|to get some
|guidance on where to start looking for a problem. Then
|mapping portion
|causing the problem deals with employees for a company. I
|currently have
|this modeled as a bi-directional 1:n mapping (Company has
|a collection of
|employees and Employee has a reference to its Company).
|Both sides of the
|association are set to be proxies (collection-proxy and
|reference-proxy).
|
|I then tested by loading 2 companies, one with 175
|employees and another
|with 1524 (the results were pretty much the same querying
|the Employee
|object by its company). Accessing the employee collection
|on the first
|company took 1.5 secs to load. Accessing the employee
|collection on the
|second took 2 minutes and 5 secs to load.
|
|Thats not even close to linear, so I am thinking I must be
|doing something
|wrong. Any help troubleshooting this would be greatly
|appreciated. Below
|are the mappings for both classes. I am using the
|PersistentFieldMaxPerformanceImpl for the
|PersistenceFieldClass and a JNDI
|Datasource.
|
|
|
|
|
|<!--
|###########################################################
|#################
|###
|## Company entity type mapping
|###########################################################
|#################
|###
|-->
| <class-descriptor
|
|class="com.vignette.it.apps.server.domain.entities.Company"
| table="COMPANY"
| >
| <field-descriptor
| name="id"
| column="COMP_ID"
| jdbc-type="INTEGER"
| primarykey="true"
| autoincrement="true"
| />
|
| <field-descriptor
| name="parentId"
| column="PRNT_COMP_ID"
| jdbc-type="INTEGER"
| />
|
| <field-descriptor
| name="pending"
| column="PENDING_APPRVL_FLG"
| jdbc-type="INTEGER"
|
|conversion="org.apache.ojb.broker.accesslayer.conversions.B
|oolean2IntFieldCo
|nversion"
| />
|
| <field-descriptor
| name="name"
| column="NAME"
| jdbc-type="VARCHAR"
| />
|
| <field-descriptor
| name="aliases"
| column="ALIASES"
| jdbc-type="VARCHAR"
| />
|
| <field-descriptor
| name="numberOfVignetteSites"
| column="NUM_OF_VIGN_SITES"
| jdbc-type="INTEGER"
| />
|
| <field-descriptor
| name="annualRevenueAmount"
| column="ANNUAL_REV"
| jdbc-type="DOUBLE"
| />
|
| <field-descriptor
| name="annualRevenueCurrencyId"
| column="ANNUAL_REV_CURR_ID"
| jdbc-type="INTEGER"
| />
|
| <field-descriptor
| name="potentialOpportunityAmount"
| column="POTNL_OPP"
| jdbc-type="DOUBLE"
| />
|
| <field-descriptor
| name="potentialOpportunityCurrencyId"
| column="POTNL_OPP_CURR_ID"
| jdbc-type="INTEGER"
| />
|
| <field-descriptor
| name="fortuneListId"
| column="FORT_LIST_ID"
| jdbc-type="INTEGER"
| />
|
| <field-descriptor
| name="geographyId"
| column="GEO_ID"
| jdbc-type="INTEGER"
| />
|
| <field-descriptor
| name="customerStatusId"
| column="CUST_PROD_STAT_ID"
| jdbc-type="INTEGER"
| />
|
| <field-descriptor
| name="createdBy"
| column="CRTD_BY"
| jdbc-type="VARCHAR"
| />
|
| <field-descriptor
| name="createdDate"
| column="CRTD_DT"
| jdbc-type="TIMESTAMP"
|
|conversion="org.apache.ojb.broker.accesslayer.conversions.J
|avaDate2SqlTimest
|ampFieldConversion"
| />
|
| <field-descriptor
| name="modifiedBy"
| column="CHGD_BY"
| jdbc-type="VARCHAR"
| />
|
| <field-descriptor
| name="modifiedDate"
| column="CHGD_DT"
| jdbc-type="TIMESTAMP"
|
|conversion="org.apache.ojb.broker.accesslayer.conversions.J
|avaDate2SqlTimest
|ampFieldConversion"
| />
|
| <reference-descriptor
| name="parent"
|
|class-ref="com.vignette.it.apps.server.domain.entities.Company"
| proxy="true"
| >
| <foreignkey field-ref="parentId"/>
| </reference-descriptor>
|
| <reference-descriptor
| name="annualRevenueCurrency"
|
|class-ref="com.vignette.it.apps.server.domain.entities.Currency"
| proxy="true"
| >
| <foreignkey field-ref="annualRevenueCurrencyId"/>
| </reference-descriptor>
|
| <reference-descriptor
| name="potentialOpportunityCurrency"
|
|class-ref="com.vignette.it.apps.server.domain.entities.Currency"
| proxy="true"
| >
| <foreignkey
|field-ref="potentialOpportunityCurrencyId"/>
| </reference-descriptor>
|
| <reference-descriptor
| name="fortuneList"
|
|class-ref="com.vignette.it.apps.server.domain.entities.FortuneList"
| proxy="true"
| >
| <foreignkey field-ref="fortuneListId"/>
| </reference-descriptor>
|
| <reference-descriptor
| name="geography"
|
|class-ref="com.vignette.it.apps.server.domain.entities.Geography"
| proxy="true"
| >
| <foreignkey field-ref="geographyId"/>
| </reference-descriptor>
|
| <reference-descriptor
| name="customerStatus"
|
|class-ref="com.vignette.it.apps.server.domain.entities.Cust
|omerStatus"
| proxy="true"
| >
| <foreignkey field-ref="customerStatusId"/>
| </reference-descriptor>
|
| <collection-descriptor
| name="addresses"
|
|element-class-ref="com.vignette.it.apps.server.domain.entit
|ies.CompanyAddres
|s"
| orderby="hqAddress"
| sort="DESC"
| proxy="true"
| >
| <inverse-foreignkey field-ref="companyId"/>
| </collection-descriptor>
|
| <collection-descriptor
| name="phones"
|
|element-class-ref="com.vignette.it.apps.server.domain.entit
|ies.PhoneNumber"
| proxy="true"
| indirection-table="COMP_PHONE_NUM_JT"
| >
| <fk-pointing-to-this-class column="COMP_ID"/>
| <fk-pointing-to-element-class column="PHONE_NUM_ID"/>
| </collection-descriptor>
|
| <collection-descriptor
| name="vignRelationships"
|
|element-class-ref="com.vignette.it.apps.server.domain.entit
|ies.CompanyRelati
|onship"
| proxy="true"
| indirection-table="COMP_COMP_TYPE_JT"
| >
| <fk-pointing-to-this-class column="COMP_ID"/>
| <fk-pointing-to-element-class column="COMP_TYPE_ID"/>
| </collection-descriptor>
|
| <collection-descriptor
| name="industries"
|
|element-class-ref="com.vignette.it.apps.server.domain.entit
|ies.Industry"
| proxy="true"
| indirection-table="COMP_IND_JT"
| >
| <fk-pointing-to-this-class column="COMP_ID"/>
| <fk-pointing-to-element-class column="IND_ID"/>
| </collection-descriptor>
|
| <collection-descriptor
| name="employees"
|
|element-class-ref="com.vignette.it.apps.server.domain.entit
|ies.Contact"
| proxy="true"
| >
| <inverse-foreignkey field-ref="companyId"/>
| </collection-descriptor>
|
| </class-descriptor>
|
|
|
|
|
|
|
|
|<!--
|###########################################################
|#################
|###
|## Contact entity type mapping
|###########################################################
|#################
|###
|-->
| <class-descriptor
|
|class="com.vignette.it.apps.server.domain.entities.Contact"
| table="COMP_PERS_JT"
| >
| <field-descriptor
| name="id"
| column="COMP_PERS_ID"
| jdbc-type="INTEGER"
| primarykey="true"
| autoincrement="true"
| />
|
| <field-descriptor
| name="companyId"
| column="COMP_ID"
| jdbc-type="INTEGER"
| />
|
| <field-descriptor
| name="personId"
| column="PERS_ID"
| jdbc-type="INTEGER"
| />
|
| <field-descriptor
| name="managerId"
| column="MGR_COMP_PERS_ID"
| jdbc-type="INTEGER"
| />
|
| <field-descriptor
| name="title"
| column="TITLE_1"
| jdbc-type="VARCHAR"
| />
|
| <field-descriptor
| name="title2"
| column="TITLE_2"
| jdbc-type="VARCHAR"
| />
|
| <field-descriptor
| name="primary"
| column="PRIMARY_FLG"
| jdbc-type="INTEGER"
|
|conversion="org.apache.ojb.broker.accesslayer.conversions.B
|oolean2IntFieldCo
|nversion"
| />
|
| <field-descriptor
| name="active"
| column="ACTIVE_FLG"
| jdbc-type="INTEGER"
|
|conversion="org.apache.ojb.broker.accesslayer.conversions.B
|oolean2IntFieldCo
|nversion"
| />
|
| <field-descriptor
| name="createdBy"
| column="CRTD_BY"
| jdbc-type="VARCHAR"
| />
|
| <field-descriptor
| name="createdDate"
| column="CRTD_DT"
| jdbc-type="TIMESTAMP"
|
|conversion="org.apache.ojb.broker.accesslayer.conversions.J
|avaDate2SqlTimest
|ampFieldConversion"
| />
|
| <field-descriptor
| name="modifiedBy"
| column="CHGD_BY"
| jdbc-type="VARCHAR"
| />
|
| <field-descriptor
| name="modifiedDate"
| column="CHGD_DT"
| jdbc-type="TIMESTAMP"
|
|conversion="org.apache.ojb.broker.accesslayer.conversions.J
|avaDate2SqlTimest
|ampFieldConversion"
| />
|
| <reference-descriptor
| name="company"
|
|class-ref="com.vignette.it.apps.server.domain.entities.Company"
| proxy="false"
| >
| <foreignkey field-ref="companyId"/>
| </reference-descriptor>
|
| <reference-descriptor
| name="person"
|
|class-ref="com.vignette.it.apps.server.domain.entities.Person"
| proxy="false"
| >
| <foreignkey field-ref="personId"/>
| </reference-descriptor>
|
| <reference-descriptor
| name="manager"
|
|class-ref="com.vignette.it.apps.server.domain.entities.Contact"
| proxy="true"
| >
| <foreignkey field-ref="managerId"/>
| </reference-descriptor>
|
| <collection-descriptor
| name="addresses"
|
|element-class-ref="com.vignette.it.apps.server.domain.entit
|ies.Address"
| proxy="true"
| indirection-table="COMP_PERS_ADDR_JT"
| >
| <fk-pointing-to-this-class column="COMP_PERS_ID"/>
| <fk-pointing-to-element-class column="ADDR_ID"/>
| </collection-descriptor>
|
| <collection-descriptor
| name="phones"
|
|element-class-ref="com.vignette.it.apps.server.domain.entit
|ies.PhoneNumber"
| proxy="true"
| indirection-table="COMP_PERS_PHONE_NUM_JT"
| >
| <fk-pointing-to-this-class column="COMP_PERS_ID"/>
| <fk-pointing-to-element-class column="PHONE_NUM_ID"/>
| </collection-descriptor>
|
| </class-descriptor>
|
|
|-----------------------------------------------------------
|----------
|To unsubscribe, e-mail: [EMAIL PROTECTED]
|For additional commands, e-mail: [EMAIL PROTECTED]
|
|-----------------------------------------------------------
|----------
|To unsubscribe, e-mail: [EMAIL PROTECTED]
|For additional commands, e-mail: [EMAIL PROTECTED]
|
|-----------------------------------------------------------
|----------
|To unsubscribe, e-mail: [EMAIL PROTECTED]
|For additional commands, e-mail: [EMAIL PROTECTED]
|
|-----------------------------------------------------------
|----------
|To unsubscribe, e-mail: [EMAIL PROTECTED]
|For additional commands, e-mail: [EMAIL PROTECTED]
|
|-----------------------------------------------------------
|----------
|To unsubscribe, e-mail: [EMAIL PROTECTED]
|For additional commands, e-mail: [EMAIL PROTECTED]
|
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]