Re: PQstatus() detect change in connection...

Поиск
Список
Период
Сортировка
От Mark Pritchard
Тема Re: PQstatus() detect change in connection...
Дата
Msg-id EGECIAPHKLJFDEJBGGOBEEECEOAA.mark@tangent.net.au
обсуждение исходный текст
Ответ на PQstatus() detect change in connection...  (Matthew Hagerty <mhagerty@voyager.net>)
Ответы Re: PQstatus() detect change in connection...  (Matthew Hagerty <mhagerty@voyager.net>)
Список pgsql-hackers
I presume you are trying to re-establish a connection automatically...if
that doesn't apply, ignore the rest of this email :)

The way I interpreted the docs was that you can use the return codes from
PQexec() to establish whether the command was sent to the backend correctly.
PQresultStatus() returns whether the command was syntactically
correct/executed OK.

I've attached a chunk of code from a back-end independent DB driver
(supports Oracle, PgSQL, MySQL through the same front end API), which
implements this auto-reconnect. Take a look at the sqlExec() method.

This code successfully recovers when used in a client connection pool in the
following sequence:

1) start postmaster
2) connect through pool/driver
3) issue SQL statements
4) kill postmaster
5) start postmaster
6) issue SQL statements
7) driver detects connection invalid, reconnects and re-issues
automatically.

Perhaps those infinitely more knowledgeable on the list have a better/more
correct way of doing things?

Cheers,

Mark Pritchard

> -----Original Message-----
> From: pgsql-hackers-owner@postgresql.org
> [mailto:pgsql-hackers-owner@postgresql.org]On Behalf Of Matthew Hagerty
> Sent: Thursday, 18 October 2001 10:47 AM
> To: pgsql-hackers@postgresql.org
> Subject: [HACKERS] PQstatus() detect change in connection...
>
>
> Greetings,
>
> PostgreSQL 7.1.3, FreeBSD-4.3-RELEASE, gcc 2.95.3
>
> I'm trying to attempt to detect a failed backend connection, but
> a call to
> PQstatus() always returns the state of the backend when the call was
> made.  For example, take this test code:
>
>     PGconn *pgConn;
>     PGresult *pgRes;
>     int fdPGconn;
>
>     int i = 0;
>     int iNewState = 0;
>     int iOldState = 60;
>
>     pgConn = PQconnectdb("dbname=pglogd user=postgres");
>
>     while ( i == 0 )
>     {
>         iNewState = PQstatus(pgConn);
>
>         if ( iNewState != iOldState )
>         {
>             iOldState = iNewState;
>             printf("Connection State [%d]\n", iNewState);
>
>             fdPGconn = PQsocket(pgConn);
>             printf("Connection Socket [%d]\n", fdPGconn);
>         }
>
>         sleep(1);
>     }
>
>     PQfinish(pgConn);
>
> If you start this with the backend running, the status is CONNECTION_OK,
> then pull the plug on the backend, the call to PQstatus() will
> still return
> CONNECTION_OK, even though the backend is not running.  Start
> this program
> with the backend not running, then start the backend, PQstatus()
> never sees
> the backend come to life...
>
> Am I reading PQstatus() wrong?  Is there any way to detect when
> the backend
> goes down or comes back up?
>
> Thanks,
> Matthew
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 2: you can get off all lists at once with the unregister command
>     (send "unregister YourEmailAddressHere" to majordomo@postgresql.org)
>

Вложения

В списке pgsql-hackers по дате отправления:

Предыдущее
От: "Christopher Kings-Lynne"
Дата:
Сообщение: Re: pg_sorttemp files
Следующее
От: bpalmer
Дата:
Сообщение: autoconf taking forever?