You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-dev@db.apache.org by "Brett Wooldridge (JIRA)" <ji...@apache.org> on 2012/11/08 06:24:12 UTC
[jira] [Reopened] (DERBY-3108) Iteratively creating and closing
client connection yields java.net.BindException: Address already in use:
connect after many connections
[ https://issues.apache.org/jira/browse/DERBY-3108?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Brett Wooldridge reopened DERBY-3108:
-------------------------------------
Bug behavior facts: Performance
I'm not sure why this issue was closed all those years ago. While the reasoning given for closing is accurate, the problem can also be easily mitigated by a simple code change.
That simple change is to simply call setReuseAddress(true) on the client's socket. The JavaDoc for the setReuseAddress() method states:
----------------------------------
Enable/disable the SO_REUSEADDR socket option.
When a TCP connection is closed the connection may remain in a timeout state for a period of time after the connection is closed (typically known as the TIME_WAIT state or 2MSL wait state). For applications using a well known socket address or port it may not be possible to bind a socket to the required SocketAddress if there is a connection in the timeout state involving the socket address or port.
Enabling SO_REUSEADDR prior to binding the socket using bind(SocketAddress) allows the socket to be bound even though a previous connection is in a timeout state.
----------------------------------
In NetAgent.java there is code like this
// Set TCP/IP Socket Properties
try {
if (exceptionOpeningSocket_ == null) {
socket_.setTcpNoDelay(true); // disables nagles algorithm
socket_.setKeepAlive(true); // PROTOCOL Manual: TCP/IP connection allocation rule #2
socket_.setSoTimeout(loginTimeout * 1000);
}
} catch (java.net.SocketException e) {
Simply adding socket_.setReuseAddress(true) will basically fix this issue. My company recently ran into this issue, and Googling turned up this closed bug.
> 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.<init>(NetAgent.java:129)
> at org.apache.derby.client.net.NetConnection.newAgent_(NetConnection.java:1086)
> at org.apache.derby.client.am.Connection.<init>(Connection.java:349)
> at org.apache.derby.client.net.NetConnection.<init>(NetConnection.java:209)
> at org.apache.derby.client.net.NetConnection40.<init>(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.<init>(Socket.java:366)
> at java.net.Socket.<init>(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.<init>(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