better logging on the backend (was: Re: When running with autocommit false only the first BEGIN) - Mailing list pgsql-jdbc

From Vadim Nasardinov
Subject better logging on the backend (was: Re: When running with autocommit false only the first BEGIN)
Date
Msg-id 200411230925.30941@vadim.nasardinov
Whole thread Raw
In response to Re: When running with autocommit false only the first BEGIN  (Oliver Jowett <oliver@opencloud.com>)
List pgsql-jdbc
On Tuesday 23 November 2004 07:18, Oliver Jowett wrote:
> Dave Cramer wrote:
> > That certainly doesn't seem acceptable. As Barry points out people
> > will really be in the dark when their code doesn't work.
>
> There's nothing much the driver can do about it other than not using
> the new features of V3. This needs a server-side fix.

Can some kind of statement logging be implemented on the client side?

Or do you think there isn't much to be gained by this beyond whatever
functionality is already provided by proxying JDBC drivers like P6Spy
(http://p6spy.sf.net)?


> We could make BEGIN/COMMIT/ROLLBACK more visible at the (small) cost
> of an extra Parse on each execution.

I'm not sure if you need an extra parse.  I'd be happy to have the
backend log a (semi-) unique statement ID for each statement it
executes.  If a statement is reused, its unique ID allows me to find
its prior occurrences in the log.  It then becomes a matter of having
an intelligent log viewer or post-processor, one that shouldn't be too
hard to write.

Additionally, another thing that could be _really_ useful is the
ability to send an arbitrary message to be logged on the backend side
along with each statement.  For instance, you can log the Java thread
name, so you can map statements to threads later on.  Another example
would be mapping each statement from the back end log to the
corresponding Java stack trace on the client side.  This could be done
by

  (a) capturing the current stack trace on the client side via
      org.postgresql.Driver.debug(uniqueID + ": " + p_sql,
                                  new Exception());

      or some such.

  (b) sending uniqueID to the backend along with the statement.


Thoughts?


Vadim



------------------------------------------------------------------------------

P.S. BTW, Driver#log(String,Exception) currently drops the stack
trace on the floor.  All it does is

    public static void debug(String msg, Exception ex)
    {
        if (logDebug)
        {
            DriverManager.println(msg);
            if (ex != null)
            {
                DriverManager.println(ex.toString());
            }
        }
    }

Would it make more sense to do something like this:

    public static void debug(String msg, Exception ex)
    {
        if (logDebug)
        {
            DriverManager.println(msg);
            if (ex != null)
            {
                ex.printStackTrace(DriverManager.getLogWriter());
            }
        }
    }


pgsql-jdbc by date:

Previous
From: Oliver Jowett
Date:
Subject: Re: When running with autocommit false only the first BEGIN
Next
From: Vadim Nasardinov
Date:
Subject: Re: Can't throw the dreaded 'idle in transaction' - need help!