PATCH: Update LISTEN/NOTIFY documentation, PGConnection JavaDoc

Поиск
Список
Период
Сортировка
От Craig Ringer
Тема PATCH: Update LISTEN/NOTIFY documentation, PGConnection JavaDoc
Дата
Msg-id 4B226ACA.4080103@postnewspapers.com.au
обсуждение исходный текст
Ответы Re: PATCH: Update LISTEN/NOTIFY documentation, PGConnection JavaDoc  (Craig Ringer <craig@postnewspapers.com.au>)
Список pgsql-jdbc
Hi folks

It seems the JDBC driver no longer requires a query to be issued before
it will notice new notify messages and be able to process them via
getNotifications() . The JDBC driver documentation doesn't reflect this.

I've attached a patch that updates the documentation. It includes one
thing I'm not 100% sure of, though:

- It states that the need for a dummy query was removed in the 8.1
driver, but I'm not sure that it was in fact 8.1 (and have no idea what
the build number was). Before I went CVS-history-diving I thought I'd
ask and see if anybody knew when the change was.

In addition to correcting the confusion, I've added @see links to the Pg
 LISTEN/NOTIFY docs, added a note about older versions requiring a dummy
select, noted that calling getNotifications() doesn't create network
traffic, and fixed an unrelated place where "8.1" should've read "8.1 or
later".

--
Craig Ringer
Index: doc/pgjdbc.xml
===================================================================
RCS file: /cvsroot/jdbc/pgjdbc/doc/pgjdbc.xml,v
retrieving revision 1.39
diff -u -r1.39 pgjdbc.xml
--- doc/pgjdbc.xml    20 Jun 2009 15:19:40 -0000    1.39
+++ doc/pgjdbc.xml    11 Dec 2009 15:36:53 -0000
@@ -2294,11 +2294,16 @@
    </para>

    <note>
-    <para>
-     A key limitation of the <acronym>JDBC</acronym> driver is that it
-     cannot receive asynchronous notifications and must poll the
-     backend to check if any notifications were issued.
-    </para>
+     <para>
+       In <productname>PgJDBC</productname> drivers earlier than 8.1,
+       notifications were not processed until a statement was next executed.
+       Dummy statements like <literal>SELECT 1;</literal> were used to force
+       the driver to check for notifications. If your application must be compatible with
+       such old versions, you will need to check
+       <function>org.postgresql.Driver.getVersion()</function> and
+       issue dummy statements before <function>getNotifications()</function>
+       calls if necessary.
+     </para>
    </note>

    <example id="listen-notify-example">
@@ -2346,13 +2351,8 @@
     public void run() {
         while (true) {
             try {
-                // issue a dummy query to contact the backend
-                // and receive any pending notifications.
-                Statement stmt = conn.createStatement();
-                ResultSet rs = stmt.executeQuery("SELECT 1");
-                rs.close();
-                stmt.close();
-
+                // Check the connection's read buffer for any unprocessed
+                // notifications and return them.
                 org.postgresql.PGNotification notifications[] = pgconn.getNotifications();
                 if (notifications != null) {
                     for (int i=0; i<notifications.length; i++) {
@@ -2425,7 +2425,7 @@
      avoid these changes in query results, but the V3 protocol is only
      available beginning with server version 7.4.  Enabling server-prepared
      statements will have no affect when connected to a 7.3 server or when
-     explicitly using the V2 protocol to connect to a 7.4 server.
+     explicitly using the V2 protocol to connect to a 7.4 or later server.
     </para>
    </note>

Index: org/postgresql/PGConnection.java
===================================================================
RCS file: /cvsroot/jdbc/pgjdbc/org/postgresql/PGConnection.java,v
retrieving revision 1.17
diff -u -r1.17 PGConnection.java
--- org/postgresql/PGConnection.java    1 Jul 2009 05:00:39 -0000    1.17
+++ org/postgresql/PGConnection.java    11 Dec 2009 15:36:53 -0000
@@ -22,10 +22,21 @@
 public interface PGConnection
 {
     /**
-     * This method returns any notifications that have been received
-     * since the last call to this method.
-     * Returns null if there have been no notifications.
+     * <p>This method returns any notifications that have been received
+     * since the last call to this method.</p>
+     *
+     * <p><code>getNotifications()</code> does not cause any network
+     * communication with the server. It only checks a local receive
+     * buffer for notifications, and is a fairly cheap operation.</p>
+     *
+     * <p><b>Version Compatibility Note:</b> In driver versions older
+     * than 8.1 it was necessary to execute an SQL query via the JDBC
+     * driver before the driver would notice waiting notifications.</p>
+     *
+     * @see <a href="http://www.postgresql.org/docs/current/static/sql-notify.html">PostgreSQL documentation for the
LISTENand NOTIFY commands</a> 
      * @since 7.3
+     *
+     * @return Array of notifications or null if there have been no notifications
      */
     public PGNotification[] getNotifications() throws SQLException;

Index: org/postgresql/PGNotification.java
===================================================================
RCS file: /cvsroot/jdbc/pgjdbc/org/postgresql/PGNotification.java,v
retrieving revision 1.12
diff -u -r1.12 PGNotification.java
--- org/postgresql/PGNotification.java    8 Jan 2008 06:56:26 -0000    1.12
+++ org/postgresql/PGNotification.java    11 Dec 2009 15:36:53 -0000
@@ -10,7 +10,9 @@
 package org.postgresql;

 /**
- *    This interface defines the public PostgreSQL extension for Notifications
+ *    This interface defines the public PostgreSQL extension for Notifications.
+ *    @see PGConnection#getNotifications()
+ *    @see <a href="http://www.postgresql.org/docs/current/static/sql-notify.html">PostgreSQL documentation for the
LISTENand NOTIFY commands</a> 
  */
 public interface PGNotification
 {

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

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: Connection.setReadOnly()
Следующее
От: Michael Nacos
Дата:
Сообщение: real -> numeric -> real result different through jdbc