Java RMI连接池细节

时间:2012-04-10 08:13:34

标签: java sockets rmi connection-pooling

我正在研究Java RMI主题,并且需要有关客户端连接池的一些信息。在文献和文献中没有明确的答案这些主题。我知道连接池不是RMI规范的一部分。但是在一些实现中(例如在SUN的实现中),它已经完成。所以我的问题就是这个实现。

我认为由RMI套接字工厂创建的套接字(java.net.Socket)缓存在池中。这是对的吗?

如何保存这些连接?除了使用HashMap与目标ip / port作为密钥,套接字作为值。

使用超时关闭套接字。如何获得连接空闲时间的信息?可能在最后一次使用连接时存在某种时间戳。​​

2 个答案:

答案 0 :(得分:2)

请记住,我只是在讨论Sun实施:

  我猜想由socket创建的socket(java.net.Socket)   RMI套接字工厂缓存在池中。这是对的吗?

是的,从远程调用中释放后,当然远程调用首先在池中查找,然后要求套接字工厂创建一个新的Socket。

  

如何保存这些连接?我会使用HashMap   目的地ip / port为密钥,套接字为value。

我们只是说从逻辑上讲必须是从ip:port到Socket的Map。实施细节实际上并不重要。

  

使用超时关闭套接字。信息如何?   连接空闲时间到了吗?

注意连接放入池中的时间。

答案 1 :(得分:0)

在Oracle / OpenJDK中,某个端点(针对某个通道)的(空闲)连接列表保留在List<TCPConnectiont> sun.rmi.transport.tcp.TCPChannel#freeList中。没有最大尺寸。有一个收割者线程检查套接字是否空闲超过15秒(-Dsun.rmi.transport.connectionTimeout=15000)。

频道存储在Map<TCPEndpoint,Reference<TCPChannel>> sun.rmi.transport.tcp.TCPTransport#channelTable中作为WeakHashMap。

BTW可能(全局)限制处理线程(-Dsun.rmi.transport.tcp.maxConnectionThreads=unlimited)在接受方。