[ https://issues.apache.org/jira/browse/DERBY-3108?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13492980#comment-13492980 ] Brett Wooldridge commented on DERBY-3108: ----------------------------------------- Sorry, I jumped the gun on the code change suggestion. setReuseAddress() must be call before the socket is connected, which requires a minor change to how the socket is created. Here is the appropriate patch (against the head): Index: java/client/org/apache/derby/client/net/NetAgent.java =================================================================== --- java/client/org/apache/derby/client/net/NetAgent.java (revision 1406929) +++ java/client/org/apache/derby/client/net/NetAgent.java (working copy) @@ -21,6 +21,7 @@ package org.apache.derby.client.net; +import java.net.InetSocketAddress; import java.net.SocketException; import org.apache.derby.client.am.Agent; @@ -129,7 +130,7 @@ } try { - socket_ = (java.net.Socket) java.security.AccessController.doPrivileged(new OpenSocketAction(server, port, clientSSLMode_)); + socket_ = (java.net.Socket) java.security.AccessController.doPrivileged(new OpenSocketAction(clientSSLMode_)); } catch (java.security.PrivilegedActionException e) { throw new DisconnectException(this, new ClientMessageId(SQLState.CONNECT_UNABLE_TO_CONNECT_TO_SERVER), @@ -144,6 +145,8 @@ socket_.setTcpNoDelay(true); // disables nagles algorithm socket_.setKeepAlive(true); // PROTOCOL Manual: TCP/IP connection allocation rule #2 socket_.setSoTimeout(loginTimeout * 1000); + socket_.setReuseAddress(true); + socket_.connect(new InetSocketAddress(server, port)); } } catch (java.net.SocketException e) { try { @@ -153,7 +156,12 @@ exceptionOpeningSocket_ = new DisconnectException(this, new ClientMessageId(SQLState.CONNECT_SOCKET_EXCEPTION), e.getMessage(), e); + } catch (java.io.IOException e) { + exceptionOpeningSocket_ = new DisconnectException(this, + new ClientMessageId(SQLState.CONNECT_SOCKET_EXCEPTION), + e.getMessage(), e); } + try { if (exceptionOpeningSocket_ == null) { Index: java/client/org/apache/derby/client/net/OpenSocketAction.java =================================================================== --- java/client/org/apache/derby/client/net/OpenSocketAction.java (revision 1406929) +++ java/client/org/apache/derby/client/net/OpenSocketAction.java (working copy) @@ -27,13 +27,9 @@ import javax.net.ssl.SSLSocket; public class OpenSocketAction implements java.security.PrivilegedExceptionAction { - private String server_; - private int port_; private int clientSSLMode_; - public OpenSocketAction(String server, int port, int clientSSLMode) { - server_ = server; - port_ = port; + public OpenSocketAction(int clientSSLMode) { clientSSLMode_ = clientSSLMode; } @@ -64,7 +60,7 @@ sf = SocketFactory.getDefault(); break; } - return sf.createSocket(server_, port_); + return sf.createSocket(); } } > Iteratively creating and closing client connection yields java.net.BindException: Address already in use: connect after many connections > ---------------------------------------------------------------------------------------------------------------------------------------- > > Key: DERBY-3108 > URL: https://issues.apache.org/jira/browse/DERBY-3108 > Project: Derby > Issue Type: Bug > Components: Network Client, Network Server > Affects Versions: 10.4.1.3 > Reporter: Kathey Marsden > Attachments: ConnLoop.java > > > The attached program ConnLoop just creates client connections, uses them and then closes them. After about 3000 connections I get the following error. Also the memory usage seems to be increasing rapidly. This may be the cause of DERBY-2344. > [C:/kmarsden/repro/DERBY-2344] java ConnLoop > Apache Derby Network Server - 10.4.0.0 alpha - (578868M) started and ready to accept connections on port 1527 at 2007-10 > -05 15:56:57.500 GMT > 0:total memory: 5435392 free: 2749776 Fri Oct 05 08:57:09 PDT 2007 > 1000:total memory: 13701120 free: 10586720 Fri Oct 05 08:57:40 PDT 2007 > 2000:total memory: 20738048 free: 12805336 Fri Oct 05 08:58:09 PDT 2007 > 3000:total memory: 24006656 free: 11053832 Fri Oct 05 08:58:40 PDT 2007 > Exception in thread "main" java.sql.SQLNonTransientConnectionException: java.net.BindException : Error connecting to ser > ver localhost on port 1527 with message Address already in use: connect. > at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:70) > at org.apache.derby.client.am.SqlException.getSQLException(SqlException.java:362) > at org.apache.derby.jdbc.ClientDriver.connect(ClientDriver.java:149) > at java.sql.DriverManager.getConnection(DriverManager.java:582) > at java.sql.DriverManager.getConnection(DriverManager.java:207) > at ConnLoop.main(ConnLoop.java:18) > Caused by: org.apache.derby.client.am.DisconnectException: java.net.BindException : Error connecting to server localhost > on port 1527 with message Address already in use: connect. > at org.apache.derby.client.net.NetAgent.(NetAgent.java:129) > at org.apache.derby.client.net.NetConnection.newAgent_(NetConnection.java:1086) > at org.apache.derby.client.am.Connection.(Connection.java:349) > at org.apache.derby.client.net.NetConnection.(NetConnection.java:209) > at org.apache.derby.client.net.NetConnection40.(NetConnection40.java:77) > at org.apache.derby.client.net.ClientJDBCObjectFactoryImpl40.newNetConnection(ClientJDBCObjectFactoryImpl40.java > :209) > at org.apache.derby.jdbc.ClientDriver.connect(ClientDriver.java:140) > ... 3 more > Caused by: java.net.BindException: Address already in use: connect > at java.net.PlainSocketImpl.socketConnect(Native Method) > at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) > at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) > at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) > at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) > at java.net.Socket.connect(Socket.java:519) > at java.net.Socket.connect(Socket.java:469) > at java.net.Socket.(Socket.java:366) > at java.net.Socket.(Socket.java:179) > at javax.net.DefaultSocketFactory.createSocket(SocketFactory.java:196) > at org.apache.derby.client.net.OpenSocketAction.run(OpenSocketAction.java:62) > at java.security.AccessController.doPrivileged(Native Method) > at org.apache.derby.client.net.NetAgent.(NetAgent.java:127) > ... 9 more > [C:/kmarsden/repro/DERBY-2344] -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira