Problem with Async (multiple) notifications

Поиск
Список
Период
Сортировка
От Andres Olarte
Тема Problem with Async (multiple) notifications
Дата
Msg-id 3fccaa6905062416392e578f58@mail.gmail.com
обсуждение исходный текст
Ответы Re: Problem with Async (multiple) notifications
Re: Problem with Async (multiple) notifications
Список pgsql-jdbc
I've been playing with async notifications lately, and I've found a
small problem: when several notifications are issued at once (for
example within a transaction) normally only one of those gets to the
client.  The rest of the notifications are not received until
something happens on the connection, for example a query or another
notification.  I'm using the latest CVS, updated yesterday.  I've
looked over the code, and there's nothing obvious. I think that this
has to do with java's handling of sockets, as the C example that deals
with notifications works fine.  It seems that some packages are
"stuck" in the socket, but my knowledge of sockets is very limited.  A
possible workarround would be to issue the simplest possible query or
message to the backend when a notification is found, to see if anymore
notifications are "stuck". This would generate a little bit of extra
traffic, but only when there is a notification.  Here is a small test
case showing what's happening:

public class TestAsync extends TestCase {

    Connection  conn2,conn1;

    public void testAsync() {
        String user = "andres";
        String pass = "";
        String url = "jdbc:postgresql://127.0.0.1/template1";
        try {
            Class.forName("org.postgresql.Driver");
        } catch (ClassNotFoundException cnf) {
            fail("Data Base Driver not Found: " + cnf.getMessage());

        }
        try {

            conn1 = DriverManager.getConnection(url, user, pass);
            conn2 = DriverManager.getConnection(url, user, pass);
            conn2.setAutoCommit(true);

            Statement stmt2 = conn2.createStatement();
            stmt2.execute("LISTEN test1");
            stmt2.execute("LISTEN test2");
            stmt2.execute("LISTEN test3");
            PGConnection pgconn = (PGConnection) conn2;


            Statement stmt1=conn1.createStatement();
            stmt1.execute("NOTIFY test1;");
            stmt1.execute("NOTIFY test2;");
            stmt1.execute("NOTIFY test3;");
            conn1.commit();


           PGNotification[] nots = pgconn.getNotifications();

                assertEquals(3,nots.length);


        } catch (SQLException sqle) {
            fail("SQLException sql" + sqle.getLocalizedMessage());
        }


    }

I'm running a 7.4 backend, but I don't think that's the problem.  But
if someone thinks I'm doing something wrong, please let me know!!
thanks to all of the people that have worked on PostreSQL

Andres Olarte

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

Предыдущее
От: Kevin Murphy
Дата:
Сообщение: Re: Statement setNull for Types.CLOB
Следующее
От: Oliver Jowett
Дата:
Сообщение: Re: Problem with Async (multiple) notifications