Return-Path: Delivered-To: apmail-db-derby-dev-archive@www.apache.org Received: (qmail 40465 invoked from network); 22 Feb 2008 10:51:05 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 22 Feb 2008 10:51:05 -0000 Received: (qmail 92803 invoked by uid 500); 22 Feb 2008 10:50:56 -0000 Delivered-To: apmail-db-derby-dev-archive@db.apache.org Received: (qmail 92781 invoked by uid 500); 22 Feb 2008 10:50:56 -0000 Mailing-List: contact derby-dev-help@db.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: Delivered-To: mailing list derby-dev@db.apache.org Received: (qmail 92768 invoked by uid 99); 22 Feb 2008 10:50:56 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 22 Feb 2008 02:50:56 -0800 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.140] (HELO brutus.apache.org) (140.211.11.140) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 22 Feb 2008 10:50:17 +0000 Received: from brutus (localhost [127.0.0.1]) by brutus.apache.org (Postfix) with ESMTP id 672FA234C049 for ; Fri, 22 Feb 2008 02:50:19 -0800 (PST) Message-ID: <1959277514.1203677419421.JavaMail.jira@brutus> Date: Fri, 22 Feb 2008 02:50:19 -0800 (PST) From: "Knut Anders Hatlen (JIRA)" To: derby-dev@db.apache.org Subject: [jira] Commented: (DERBY-3192) Cache session data in the client driver In-Reply-To: <6185529.1194551030771.JavaMail.jira@brutus> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Virus-Checked: Checked by ClamAV on apache.org [ https://issues.apache.org/jira/browse/DERBY-3192?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12571345#action_12571345 ] Knut Anders Hatlen commented on DERBY-3192: ------------------------------------------- Thanks for the updated patch, Dyre. I think it looks good and ready for commit now. I still plan to test it more thoroughly, but that doesn't mean you should hold the commit. If I find any issues, they can be handled in follow-ups. One question about the SYNCCTL messages: Would it make sense to write PBSD in the reply even though the client ignores it for 10.4? Could that make it easier to implement the session state caching for XA later? I was thinking then it perhaps would be a pure client-side fix to enable it for XA, and the client didn't need special handling of yet another version (that is, you wouldn't need both serverSupportsSessionDataCaching() and serverSupportsSessionDataCachingForXA() on the client). I'm not sure whether this is possible and/or desirable, but I thought I'd mention it. > Cache session data in the client driver > --------------------------------------- > > Key: DERBY-3192 > URL: https://issues.apache.org/jira/browse/DERBY-3192 > Project: Derby > Issue Type: Improvement > Components: JDBC, Network Client, Network Server, Performance, SQL > Affects Versions: 10.3.1.4 > Reporter: Dyre Tjeldvoll > Assignee: Dyre Tjeldvoll > Attachments: derby-3192-mark2.v1.diff, derby-3192-mark2.v2.diff, derby-3192-mark2.v3.diff, derby-3192-mark2.v4.diff, derby-3192-mark2.v5.diff, derby-3192-mark2.v6.diff, derby-3192-test.fup1.diff, derby-3192-test.fup2.diff, derby-3192-test.v1.diff, derby-3192-test.v1.stat, derby-3192.prelim1.diff > > > The reason for doing this is to avoid a rather > substantial performance hit observed when the client driver is used > together with an appserver that uses connection pooling. There are two > problems: > 1) The connection pool will compare the isolation level it has > stored for the connection with the value returned from > Connection.getTransactionIsolation() each and every time someone > requests a new connection from the pool. > 2) The users of the connection pool (ab)use it to avoid having to keep > track of their current connection. So each time a query needs to be > executed a call to the connection pool's getConnection() method is > made. Getting a connection from the connection pool like this also > means that a new PreparedStatement must be prepared each time. > The net result is that each query results in the following sequence: > getConnection() > getTransactionIsolation() --> roundtrip + lookup in server's statement cache > prepareStatment() --> roundtrip + lookup in server's statement cache > executeQuery() --> roundtrip > Arguably this is a "user error" but when suggesting this I'm kindly > informed that this works "just fine" with other datbases (such as > PostgreSQL and ORACLE). > The reason why it works is that these databases do statement caching > in the driver. I've tried to implement a very (too) simple statement > cache in Derby's client driver and to re-enable caching of the > isolation level (see > https://issues.apache.org/jira/browse/DERBY-1148). With these changes > I observe a marked performance improvement when running with appserver > load. > A proper statment cache cannot be implemented without knowing what the > current schema is. If the current schema has changed since the > statement was prepared, it is no longer valid and must be evicted from > the cache. > The problem with caching both the isolation level and the current schema in > the driver is that both can change on the server without the client > detecting it (through SQL and XA and possibly stored procedures). > I think this problem can be overcome if we piggy-back the information we would > like to cache on messages going back to the client. This can be done by > utilizing the EXCSQLSET DRDA command. According to the DRDA spec (v4, volume 3, > page 359-360) it is possible to add one or more SQLSTT objects after SQLCARD in the reply, > I think it would be possible to cache additional session information when this becomes relevant. It > would also be possible to use EXCSQLSET to batch session state changes > going from the client to the server. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.