【问题标题】:Java RMI connection-pooling detailsJava RMI 连接池详细信息
【发布时间】:2012-04-10 08:13:34
【问题描述】:

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

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

如何保存这些连接?除了将 HashMap 与目标 ip/port 作为键和套接字作为值一起使用之外,我会。

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

【问题讨论】:

  • 所有这些问题都可以通过查看 OpenJDK 的源代码来回答。从sun.rmi.transport.proxy.RMIMasterSocketFactory开始

标签: java sockets rmi connection-pooling


【解决方案1】:

请记住,我只是在谈论 Sun 实现:

我认为由 RMI 套接字工厂缓存在池中。对吗?

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

如何保存这些连接?我会除了使用 HashMap 以目标 ip/port 为 key,socket 为 value。

假设逻辑上必须有一个从 ip:port 到 Socket 的 Map。实现细节实际上并不重要。

使用超时关闭套接字。上的信息如何 获得了连接空闲时间?

通过记录连接被放入池中的时间。

【讨论】:

    【解决方案2】:

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

    Channels 以 WeakHashMap 的形式存储在 Map<TCPEndpoint,Reference<TCPChannel>> sun.rmi.transport.tcp.TCPTransport#channelTable 中。

    顺便说一句,接受端的处理线程 (-Dsun.rmi.transport.tcp.maxConnectionThreads=unlimited) 可能存在(全局)限制。

    【讨论】:

      猜你喜欢
      • 2012-01-17
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      相关资源
      最近更新 更多