Hi, I'm having problems with performance degrading dramatically when I deploy our application to a Tomcat container. The application uses Apache Cayenne ORM on top of Derby.
Does anyone have any pointers on how I can debug this to figure out what I'm doing wrong? Generating a report which includes ca. 100 queries and thousands of records takes less than one second on Jetty, but in the Tomcat container it takes more than 10 seconds, so a 10x slowdown or so. I can't believe that Jetty is 10x faster than Tomcat. I've tried to figure out what the differences are between these two environments without luck. Jetty and Tomcat are equal in terms of: - same VM options - debug vs. non-debug mode - tests run on same machine side-by-side - same database files(copied to another location on the harddisk) Some differences: - Jetty is using org.apache.cayenne.conn.PoolManager rather than Tomcat's connection pools. When I suspend Tomcat in the debugger, the typical stack trace is something about fetching pages: BaseContainerHandle(Observable).addObserver(Observer) line: 82 StoredPage(BasePage).preLatch(BaseContainerHandle) line: not available StoredPage(BasePage).setExclusive(BaseContainerHandle) line: not available RAFContainer4(BaseContainer).latchPage(BaseContainerHandle, BasePage, boolean) line: not available RAFContainer4(FileContainer).latchPage(BaseContainerHandle, BasePage, boolean) line: not available RAFContainer4(FileContainer).getUserPage(BaseContainerHandle, long, boolean, boolean) line: not available RAFContainer4(FileContainer).getPage(BaseContainerHandle, long, boolean) line: not available BaseContainerHandle.getPage(long) line: not available OpenHeap(OpenConglomerate).latchPage(RowPosition) line: not available HeapController(GenericConglomerateController).fetch(RowLocation, DataValueDescriptor[], FormatableBitSet) line: not available IndexRowToBaseRowResultSet.getNextRowCore() line: not available ProjectRestrictResultSet.getNextRowCore() line: not available NestedLoopJoinResultSet.getNextRowCore() line: not available ProjectRestrictResultSet.getNextRowCore() line: not available SortResultSet.getRowFromResultSet() line: not available SortResultSet.getNextRowFromRS() line: not available SortResultSet.loadSorter() line: not available SortResultSet.openCore() line: not available SortResultSet(BasicNoPutResultSetImpl).open() line: not available GenericPreparedStatement.executeStmt(Activation, boolean, boolean, long) line: not available GenericPreparedStatement.execute(Activation, boolean, long) line: not available EmbedPreparedStatement(EmbedStatement).executeStatement(Activation, boolean, boolean) line: not available EmbedPreparedStatement.executeStatement(Activation, boolean, boolean) line: not available EmbedPreparedStatement.executeQuery() line: not available SelectAction.performAction(Connection, OperationObserver) line: 75 DataNodeQueryAction.runQuery(Connection, Query) line: 87 -- Øyvind Harboe - Can Zylin Consulting help on your project? http://www.zylin.com/
