ReleasePreparedCommands method in FbConnectionInternal does not work as 
expected - does not release resources of all prepared commands upon connection 
close.
-------------------------------------------------------------------------------------------------------------------------------------------------------------

                 Key: DNET-421
                 URL: http://tracker.firebirdsql.org/browse/DNET-421
             Project: .NET Data provider
          Issue Type: Bug
    Affects Versions: 2.7
         Environment: Not applicable, algorithmic issue
            Reporter: Jiří Farták
            Assignee: Jiri Cincura


Here's excerpt of the problematic method:

public void ReleasePreparedCommands()
                               {
                                               for (int i = 0; i < 
this.preparedCommands.Count; i++)
                                               {
                                                               if 
(!this.preparedCommands[i].IsAlive)
                                                                              
continue;
 
                                                               try
                                                               {
                                                                              
// Release statement handle
                                                                              
(this.preparedCommands[i].Target as FbCommand).Release();
...
                               }

Collection of preparedCommands that is being processed is changed due to side 
effect by the FbCommand.Release() call - this function indirectly calls 
preparedCommands.RemoveAt(i), that causes collection item (index) shifting and 
changing the Count property value in the for-cycle condition. The change of 
Count property is not problem. The problem is that  unconditional increment of 
condition control variable "i" at each cycle causes skipping of the item that 
follows the released one due to mentioned item shifting after RemoveAt(i) 
method call (item at index "i" is removed, thus following item gets to its 
position to "fill the gap", but "i" is increased at next for-cycle, so this 
item is skipped). By other words, if no prepared command was in Alive state, 
then each even prepared command is properly released.

Due to this bug, not all prepared commands are released - mainly their 
referenced Statement objects. This could lead to throwing exceptions when core 
of the driver works with non-properly released resources of FbCommand objects 
when they are about to be reused after database connection close and not 
disposed immediately. Such Statement objects are considered valid (but they 
reference GdsDatabase object that has input and outputStream properties filled 
with null values etc.)  and they are not recreated upon new database connection 
and executing the reused FbCommand.

One can avoid of this bug, if the FbCommand objects are not reused after 
connection close (by assigning new Connection and eventually Transaction to 
them), but  diposed and recreated again.

We observed the driver throwing NullPointerExceptions at GdsDatabase.Write() 
methods when calling FbCommand.ExecuteXXX methods, because FbCommand referenced 
invalid, previously unreleased Statement object, that referenced invalid old 
GdsDatabase object.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://tracker.firebirdsql.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

       

------------------------------------------------------------------------------
Try before you buy = See our experts in action!
The most comprehensive online learning library for Microsoft developers
is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
Metro Style Apps, more. Free future releases when you subscribe now!
http://p.sf.net/sfu/learndevnow-dev2
_______________________________________________
Firebird-net-provider mailing list
Firebird-net-provider@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/firebird-net-provider

Reply via email to