*hi*
this function *ConnectionPool_getConnection* is designed badly。
between code *LOCK(P->mutex)* and *END_LOCK*, *Connection_ping* and
*Connection_new* may block long time (reconnect/connect to sql server),so
other threads will wait long time.
* should't block when locked!!!!*
see below code for detail:
*Connection_T ConnectionPool_getConnection(T P) {*
* Connection_T con = NULL;*
* assert(P);*
* LOCK(P->mutex) *
* {*
* int size = Vector_size(P->pool);*
* for (int i = 0; i < size; i++) {*
* con = Vector_get(P->pool, i);*
* if (Connection_isAvailable(con) &&
Connection_ping(con)) {*
* Connection_setAvailable(con, false);*
* goto done;*
* } *
* }*
* con = NULL;*
* if (size < P->maxConnections) {*
* con = Connection_new(P, &P->error);*
* if (con) {*
* Connection_setAvailable(con, false);*
* Vector_push(P->pool, con);*
* } else {*
* DEBUG("Failed to create connection --
%s\n", P->error);*
* FREE(P->error);*
* }*
* }*
* }*
*done: *
* END_LOCK;*
* return con;*
*}*