Bug #71679 Avoid iterator creation when invoking statement interceptors in MysqlIO.
Submitted: 12 Feb 2014 7:47 Modified: 10 Mar 2014 16:28
Reporter: Andrej Golovnin (OCA) Email Updates:
Status: Closed Impact on me:
Category:Connector / J Severity:S5 (Performance)
Version:5.1.29 OS:Any
Assigned to: Filipe Silva CPU Architecture:Any
Tags: interceptors, jdbc, MysqlIO

[12 Feb 2014 7:47] Andrej Golovnin
In the methods MysqlIO#invokeStatementInterceptorsPost and MysqlIO#invokeStatementInterceptorsPre an iterator is used to loop over the list of statement interceptors. As far as I can tell, the list of the statement interceptors is always an ArrayList. So using the old-school for-loop should be the preferable way there to loop over the list. Even if the Hotspot would allocate the iterator on the thread's stack (and he does that), I think MySQL Connector/J should still avoid creation of the iterator, because the size of the thread stack is limited and I would prefer to see that objects from my application are allocated on the stack and not those from MySQL Connector/J.

One more thing. I won't submit a patch for this. But could you please review the method ConnectionImpl#isSameResource(Connection), lines 4030-4031:

                                if (!nullSafeCompare(otherOrigDatabase, this.origDatabaseToConnectTo)) {                        directCompare = false;
                                        directCompare = false;

I think the assignment "directCompare = false;" in the line 4030 can be removed. :-)

How to repeat:
See my patch.

Suggested fix:
Use the old-school for-loop to iterate over the list.
[12 Feb 2014 7:48] Andrej Golovnin
Patch for this issue.

Attachment: MysqlIO.patch (application/octet-stream, text), 1.78 KiB.

[12 Feb 2014 12:23] Filipe Silva
Hi Andrej,

Thank you for this bug report. Verified by code review.
Thanks for noticing the duplicated line too.
[18 Feb 2014 13:48] Andrej Golovnin
Patch for this issue.

(*) I confirm the code being submitted is offered under the terms of the OCA, and that I am authorized to contribute it.

Contribution: MysqlIO.patch (application/octet-stream, text), 1.78 KiB.

[21 Feb 2014 10:13] Alexander Soklakov
Thanks Andrej, accepted.
[10 Mar 2014 16:28] Daniel So
Added the following entry into the Connector/J 5.1.30 changelog:

"Avoided the use of an iterator over the list of statement interceptors in the methods MysqlIO.invokeStatementInterceptorsPost() and MysqlIO.invokeStatementInterceptorsPre(), so that Connector/J does not increase the stack size unnecessarily."