Re: [Maria-discuss] Question about MariaDB Non-blocking Client

2013-08-07 Thread Kristian Nielsen
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


Re: [Maria-discuss] Question about MariaDB Non-blocking Client

2013-08-07 Thread Mike Gibson
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.orgwrote:

 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