On 12/12/11 20:24, Martin J. Evans wrote:
> On 12/12/2011 18:15, Charles Jardine wrote:
>> On 12/12/11 16:13, Martin J. Evans wrote:
>>> On 09/12/11 18:02, Charles Jardine wrote:
>>>> On 09/12/11 14:01, Martin J. Evans wrote:
>>>>> Hi,
>>>>>
>>>>> If anyone is around who wrote or has worked on the object/collections
>>>>> support in DBD::Oracle I'd greatly appreciate it if you could take a
>>>>> quick look at this problem as the code in DBD::Oracle for this has
>>>>> defeated me so far.
>>>>>
>>>>> The problem is I have a query which uses types and collect and
>>>>> although it works fine initially once it has been run a number of
>>>>> times in the same connection it eventually goes from a 3s fetch time
>>>>> to a number of minutes. I have reduced it to the example below.
>>>>>
>>>>> I can run this code all day long in sqlplus without a problem so I
>>>>> don't think it is an Oracle issue.
>>>> I have been re-writing parts of the of the object/collections
>>>> support with a view to correcting aspects of the storage management.
>>>> The existing code has some store drains, and some incorrect
>>>> freeing of Perl SVs, which can lead to crashes.
>>>>
>>>> The changes I have made so far do not fix your problem, but
>>>> the problem might provide me with a useful test case.
>>>>

>> I shall stare at the prepare/destroy code a bit more before
>> I give up.
>>
> 
> I'm juggling a few problems right now but we are not going to let this one go.

I think I have found the resource drain which causes your slow-down
problem. Buffers implicitly allocated in the cache by OCIDefineObject()
need to be deallocated explicitly by OCIObjectFree() 'when they are no
longer needed'. This is counter-intuitive, but it is documented
in the reference description of OCIDefineObject(), and has been since
Oracle 8.

I have attached a demonstration patch against the trunk for you to test.
This patch is not fit to go into service. We need a logging macro for
OCIObjectFree().

> If at any stage, you want a tester for any changes you've made to the
> code please put me in the front of the queue.

Now I have found this resource drain, I feel happier about submitting
a patch intended to remove all resource drains from the object/collection
stuff. Expect me to be offering you something bigger to test after the
Christmas break.

-- 
Charles Jardine - Computing Service, University of Cambridge
c...@cam.ac.uk    Tel: +44 1223 334506, Fax: +44 1223 334679
Index: dbdimp.c
===================================================================
--- dbdimp.c    (revision 15051)
+++ dbdimp.c    (working copy)
@@ -3967,8 +3967,11 @@
        sv_free(fbh->name_sv);
        if (fbh->desc_h)
        OCIDescriptorFree_log(fbh->desc_h, fbh->desc_t);
-       if (fbh->obj)
+       if (fbh->obj) {
+               if (fbh->obj->obj_value) 
+                       OCIObjectFree(fbh->imp_sth->envhp, fbh->imp_sth->errhp, 
fbh->obj->obj_value, (ub2)0);
                Safefree(fbh->obj);
+       }
 
 }
 

Reply via email to