Edit report at http://bugs.php.net/bug.php?id=52056&edit=1

 ID:               52056
 User updated by:  jonarobinson at rim dot com
 Reported by:      jonarobinson at rim dot com
-Summary:          gargbage collection interferes with oci_connect
+Summary:          garbage collection interferes with oci_connect
                   connection pooling
 Status:           Open
 Type:             Bug
 Package:          OCI8 related
 Operating System: RHEL 4 R5
 PHP Version:      5.2.13

 New Comment:

I found a work around.  By hanging on to a reference to the DB handle
(whether you use it or not) it will prevent the DB handle from being
garbage collected in your app.  Thus subsequent calls to oci_connect
will use the cached resource as expected.



If you're only using one connection you can do something like this:

$dbh_keep_alive = connect(); // Hang on to a reference - if it gets
garbage collected then our connection pooling will stop working



If you're using multiple connections like me than you'll need to keep a
cache of connections used.  This should do the trick:



connect($username, $password, $conn_info) {

    $dbh = oci_connect($username, $password, $conn_info);

    $key = hash('md5', "$username|$password|$conn_info");

    $GLOBALS[$key] = $dbh;

    return $dbh;

}


Previous Comments:
------------------------------------------------------------------------
[2010-06-11 22:45:09] jonarobinson at rim dot com

Description:
------------
Once your handle gets garbage collected by PHP (falls off the method
scope), subsequent calls to oci_connect will generate new connections.



This is true in PHP 5.2.13.  I wasn't able to verify on PHP 5.3.

Test script:
---------------
connect();

connect();

$dbh1 = connect();

$dbh2 = connect();



function connect()

{

    $conn_info = '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST =
localhost) (PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = TEST)))';

    $dbh = oci_connect('username', 'password', $conn_info);

    echo "Our handle is: $dbh<br/>\n";

    return $dbh;

}



function getConnection($sid)

Expected result:
----------------
Our handle is: Resource id #35

Our handle is: Resource id #35

Our handle is: Resource id #35

Our handle is: Resource id #35

Actual result:
--------------
Our handle is: Resource id #35

Our handle is: Resource id #36

Our handle is: Resource id #37

Our handle is: Resource id #37


------------------------------------------------------------------------



-- 
Edit this bug report at http://bugs.php.net/bug.php?id=52056&edit=1

Reply via email to