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 по дате отправления: