Re: NullPointerException in RemoteDatabaseInterface.ConnectionThread

Tobias Downer <[email protected]> Fri, 17 Mar 2006 17:54:33 -0800
Newsgroups gmane.comp.db.mckoi
Message-ID <[email protected]>
Bruno,

This is actually a case of an incorrectly reported error.  The 
"Connection to server closed" check needs to be moved into the loop for 
the error to be reported correctly.  What is causing the error is an 
attempt to execute a query on a database connection that is closed at 
about the same time.

Thanks for reporting the problem,
Toby.


[email protected] wrote:
> Hi,
> 
> The NPE happens in RemoteDatabaseInterface.ConnectionThread:
> 
> java.lang.NullPointerException
>         at
> com.mckoi.database.jdbc.RemoteDatabaseInterface$ConnectionThread.getCommand(
> RemoteDatabaseInterface.java:510)
>         at
> com.mckoi.database.jdbc.RemoteDatabaseInterface.execQuery(RemoteDatabaseInte
> rface.java:196)
>         at
> com.mckoi.database.jdbc.MConnection.executeQuery(MConnection.java:348)
>         at
> com.mckoi.database.jdbc.MStatement.executeQuery(MStatement.java:110)
>         at
> com.mckoi.database.jdbc.MPreparedStatement.executeUpdate(MPreparedStatement.
> java:124)
> 
> I think the connection thread finishes and set commands_list to null:
> 
>     public void run() {
>       ...
>       finally {
>         // Invalidate this object when the thread finishes.
>         Object old_commands_list = commands_list;
>         synchronized (old_commands_list) {
>           commands_list = null;
>           old_commands_list.notifyAll();
>         }
>       }
>     }
> 
> I suppose that a different thread is waiting in getCommand(), then it awakes
> and goes on with its job but commands_list is null now:
> 
> ServerCommand getCommand(int timeout, int dispatch_id) throws SQLException {
>       final long time_in = System.currentTimeMillis();
>       final long time_out_high = time_in + ((long) timeout * 1000);
> 
>       synchronized (commands_list) {
>         if (commands_list == null) {
>           throw new SQLException("Connection to server closed");
>         }
> 
>         while (true) {
> 
>           for (int i = 0; i < commands_list.size(); ++i) {
>             ServerCommand command = (ServerCommand)
> commands_list.elementAt(i);
>             if (command.dispatchID() == dispatch_id) {
>               commands_list.removeElementAt(i);
>               return command;
>             }
>           }
> 
>           // Return null if we haven't received a response in the timeout
>           // period.
>           if (timeout != 0 &&
>               System.currentTimeMillis() > time_out_high) {
>             return null;
>           }
> 
>           // Wait a second.
>           try {
>             commands_list.wait(1000);
>           }
>           catch (InterruptedException e) { /* ignore */ }
> 
>         } // while (true)
> 
>       } // synchronized
> 
>     }
> 
> By the way, is there a scheduled next release?
> 
> Regards,
> 
> Bruno.


---------------------------------------------------------------
Mckoi SQL Database mailing list  http://www.mckoi.com/database/
To unsubscribe, send a message to [email protected]