Dieter Maurer wrote:
> Jim Washington wrote at 2005-12-13 21:40 -0500:
>>Now, looking closer at the code, a ping like this might be not too bad, 
>>because isConnected() is only called when a connection is requested, not 
>>for every SQL statement executed.  So, it might not be so onerous as 
>>originally thought. Still not ideal, though.
> Be careful what you do when you find that "isConnected()" returns false.
> Note, that, in general, it would be a bug to just reopen a new connection
> in this case: previous operations against the connection might have
> been lost without notice when you simply reopen a new connection
> and do as if nothing bad had happened.
> Instead, you should reopen the connection and then raise an exception
> similar to "ZODB.POSException.ConflictError". Hopefully, the publisher
> will handle this kind of exception correctly (by retrying the complete
> request).

MySQL::Ping will automatically reopen a closed connection in a way where
the existing connection object can still be used.
If MySQL::Ping fails something really bad is going on.

To reduce the number of ping's in my application I used a timer which
was tested before every call to a database function.
If the timer expired I did a ping to ensure mysql is reconnected.

This is the code sqlobject is using :

while (1):
       return cursor.execute(query)
    except MySQLdb.OperationalError, e:
       if e.args[0] == 2013: # SERVER_LOST error
           if self.debug:
               self.printDebug(conn, str(e), 'ERROR')

So, checking for SERVER_LOST and then eventually using MySQL::Ping would
do the trick.



Jürgen Kartnaller

Zope3-dev mailing list

Reply via email to