I ran across an old question on Stack Overflow the other day in which a user was having issues maintaining his connection to MySQL from C. I left a brief answer there for anyone else who might stumble across the same problem in the future, but I felt it was worth expanding on a bit more.
The error "MySQL server has gone away" means the client's connection to the MySQL server was lost. This could be because of many reasons; perhaps MySQL isn't running, perhaps there's network problems, or perhaps there was no activity after a certain amount of time and the server closed the connection. Detailed information on the error is available in the MySQL documentation.
It's possible for the client to attempt to re-connect to the server when it's "gone away" although it won't try to by default. To enable the reconnecting behavior, you need to set the MYSQL_OPT_RECONNECT option to 1 using the mysql_options() function. It should be set after mysql_init() is called and before calling mysql_real_connect(). This should solve the problem if the connection was closed by the server because of a time-out.
The MySQL documentation that discusses the reconnect behavior points out that only one re-connect attempt will be made, which means the query can still fail if the server is stopped or inaccessible. I ran across this problem myself while writing a daemon in C that would periodically pull data from MySQL. The daemon was polling at set intervals far less than the time-out period, so any such errors were the result of an unreachable or stopped server. I simply jumped execution to just prior to my work loop's sleep() call and the daemon would periodically try to re-connect until the server came back up.
#define DBHOSTNAME localhost #define DBHOSTNAME dbuser ... MYSQL *db = mysql_init(NULL); if (db == NULL) { fprintf(stderr, "Insufficient memory to allocate MYSQL object."); exit(EXIT_FAILURE); } /* enable re-connect behavior */ my_bool reconnect = 1; int success = mysql_options(db, MYSQL_OPT_RECONNECT, &reconnect); assert(success == 0); if (mysql_real_connect(db, DBHOSTNAME, DBUSERNAME, DBPASSWORD, DBDATABASE, 0, NULL, 0) == NULL) { fprintf(stderr, "Connection attempt failed: %s\n", mysql_error(db)); exit(EXIT_FAILURE); } for (;;) { success = mysql_query(db, "<MYSQL QUERY HERE>"); if (success != 0) { /* The error is most likely "gone away" since the query is * hard-coded, doesn't return much data, and the result is * managed properly. */ fprintf(stderr, "Unable to query: %s\n", mysql_error(db)); goto SLEEP; } /* call mysql_use_result() and do something with data */ ... SLEEP: sleep(SLEEP_SECONDS); }
Comments
Post a Comment