develooper Front page | perl.dbi.dev | Postings from December 2011

Re: Problem with Oracle collections/objects

Thread Previous | Thread Next
From:
Charles Jardine
Date:
December 21, 2011 05:05
Subject:
Re: Problem with Oracle collections/objects
Message ID:
4EF1D9A4.8020006@cam.ac.uk
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
cj10@cam.ac.uk    Tel: +44 1223 334506, Fax: +44 1223 334679


Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About