Thanks, Kristian. This cleared up a lot for me. I'll implement the async mysql_ping() and follow up if I have any serious issues.
On Wed, Aug 7, 2013 at 7:33 AM, Kristian Nielsen <kniel...@knielsen-hq.org>wrote: > Mike Gibson <notmikegib...@gmail.com> writes: > > > Greetings, > > Hi, sorry for taking a few days to get back to you: > > > I'm using the MariaDB Non-blocking API to write a C++ client, but I've > hit > > a wall regarding connection checking. I've been referencing the binding > > from node-mariasql ( > > https://github.com/mscdex/node-mariasql/blob/master/src/binding.cc). > > Ok, great that you can use the non-blocking API! > > > The problem I'm experiencing is if I have a connection and kill the > server > > (/etc/init.d/mysql stop) and then start it back (/etc/init.d/mysql > start), > > I can never get clean reconnects. It's usually a mixture of errcode 2058, > > 2003, 2013. > > > > I'm really confused how to gracefully manage connections. Before I was > > using the official MySQL C++ connector, and it provides a > > connection->isConnected() method. I'm wondering how I can get something > > similar with MariaDB's client, as I need the non-blocking interface. > > I am not familiar with the MySQL C++ connector. I tried downloading the > source > for mysql-connector-c++-1.1.3.tar.gz, but it does not seem to have any > isConnected() method? > > Anyway, the usual way to do this is to issue a mysql_ping() to the server, > to > check if the connection is working. With the non-blocking API, you would do > this with mysql_ping_start() and mysql_ping_cont(). This will issue a > request > to the server to check if the connection is ok. If you have autoconnect > enabled (MYSQL_OPT_RECONNECT), then this will automatically reconnect if > the > old connection was broken for some reason. > > (Note that you will need to be aware of the usual issues with automatic > reconnect. For example, even if ping is successful, the connection may > break > immediately afterwards. And an autoconnect will loose any existing state on > the connection such as temporary tables, SET @user_var, BEGIN, etc.) > > > Given: MYSQL mysql, *mysqlHandle; > > > > Look at the mysql_real_connect_start() or cont() functions. I provide > MYSQL > > struct and on connect I get a copy of the struct stored in *mysqlHandle. > > It's not clear to me what the purpose of the copy is at this point as I > > still use the initial struct to call query(). > > Agree, it is not very useful, it is just a copy of the pointer to your own > structure. You only need it to check for error (in which case the pointer > will > be NULL). After that you can just you the pointer to your own struct that > you > already have. > > > In the case that I can detect a disconnection, how do I properly clean up > > the connection and attempt reconnect? Do I mysql_close(&mysql) and/or > > mysql_close(mysqlHandle), shutdown/close the file descriptor, > mysql_init() > > a new handle and go through mysql_real_connect_start/cont()? > > I am not sure, but it seems to me from looking at the code that if you > already > got an error that the connection was closed, then you can just go through > the > mysql_real_connect_start/cont() sequence again to reconnect. But if that > does > not work, you can always mysql_close() and mysql_init() your struct again. > There is no need to explicitly shutdown or close the file descriptor. > > > Does it even make sense for each object to have its own MYSQL struct > that I > > mysql_init(), or would it be better to have layer on top that > mysql_init()s > > a single MYSQL struct, connects, and passes the returned *mysqlHandle to > > each query? > > This depends on your application. You can only have a single query in > progress > on one MYSQL struct at a time. So if you have multiple queries working at > the > same time on the server, you need one MYSQL struct for each. If you only > have > one query processing at a time, a single MYSQL struct will be sufficient. > > > Thanks for providing the async client, any help is appreciated. > > I hope this helps, though it is of a somewhat generic nature. If you need > more > details, please ask again, perhaps with some example code that shows your > problems. > > - Kristian. >
_______________________________________________ Mailing list: https://launchpad.net/~maria-discuss Post to : maria-discuss@lists.launchpad.net Unsubscribe : https://launchpad.net/~maria-discuss More help : https://help.launchpad.net/ListHelp