From cb29bcb923804e844411fb4872f55993bf29ee91 Mon Sep 17 00:00:00 2001 From: rowanbeentje Date: Tue, 8 May 2012 01:03:31 +0000 Subject: Rework connection loss handling in SPMySQL, particularly to improve background loss of connections: - Attempt to fix a condition causing a reconnection loop by fixing the order of connection state check and a query variable - If a connection is lost in the background, only attempt a single reconnect instead of requiring user intervention at once - Add a new connection state to handle background disconnects - If the connection has been lost in the background but is about to be used, reconnect it automatically (informing the user of loss if appropriate) - Don't attempt background reconnections if the connection has not been used for some time (Also update localisable strings, and tweak navigator controller connection usage) --- .../SPMySQLConnection Categories/Delegate & Proxy.m | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Delegate & Proxy.m') diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Delegate & Proxy.m b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Delegate & Proxy.m index 59e78c35..e0b745e0 100644 --- a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Delegate & Proxy.m +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Delegate & Proxy.m @@ -109,8 +109,19 @@ // Clear the state change selector on the proxy until a connection is re-established proxyStateChangeNotificationsIgnored = YES; - // Trigger a reconnect - [NSThread detachNewThreadSelector:@selector(reconnect) toTarget:self withObject:nil]; + // Trigger a reconnect depending on connection usage recently. If the connection has + // actively been used in the last couple of minutes, trigger a full reconnection attempt. + if (_elapsedSecondsSinceAbsoluteTime(lastConnectionUsedTime) < 60 * 2) { + [NSThread detachNewThreadSelector:@selector(reconnect) toTarget:self withObject:nil]; + + // If used within the last fifteen minutes, trigger a background/single reconnection attempt + } else if (_elapsedSecondsSinceAbsoluteTime(lastConnectionUsedTime) < 60 * 15) { + [NSThread detachNewThreadSelector:@selector(_reconnectAfterBackgroundConnectionLoss) toTarget:self withObject:nil]; + + // Otherwise set the state to connection lost for automatic reconnect on next use + } else { + state = SPMySQLConnectionLostInBackground; + } } // Update the state record -- cgit v1.2.3