代码之家  ›  专栏  ›  技术社区  ›  Elister

在.NET和Java之间共享数据(不是对象)最快的方式

  •  4
  • Elister  · 技术社区  · 14 年前

    我知道至少有一个帖子有这样的词。但这和那个帖子不完全一样。我正在尝试一种在.NET和Java应用程序之间“共享”数据的方法。我不在乎什么东西,只要你愿意,我只在乎简单的字符串。

    我有一个.NET应用程序捕捉实时数据和一个Java应用程序,它有能力分析和处理这些数据。我想在没有.NET中完全编码的情况下重新使用同样的Java应用程序。

    我的问题是数据是“相当”的实时(.NET),因此必须是分析(Java)。我可以忍受微秒的延迟,但我不能承受一秒的延迟。webservices、queues(如消息队列中的队列)和rdbms是我可以想到的一些选项。有更好的办法吗?

    或者是否有人得到了我上面提到的解决方案的实际性能数据来选择其中一个?仅仅是开始:rdbms对于并发(连接)插入/更新/读取不是“那么”好,至少对于处理dbms事务的粗糙方式是这样的。(死锁?)

    9 回复  |  直到 14 年前
        1
  •  7
  •   Marc Gravell    14 年前

    如果不是描述“数据”的机制,“对象”是什么?但我有点离题了-我想我会看看两者之间的TCP套接字。如果数据是 非常 基本的,然后很好-直接写入流;如果有任何复杂性,可以使用类似“协议缓冲区”的东西来提供一种简单的方式来读/写密集数据到流,而不必自己写每一个最后的字节。

    我想 微秒 延误将是一个挑战 任何 靠近这里…毫秒延迟可以吗?

        2
  •  2
  •   Gareth Davis    14 年前

    完整性:

    另一种可能是 Named pipes 它应该相当快,我可以想象(作为一个Java的家伙,我只能想象).NET为他们提供了本地支持。缺点是,在windows上,您必须编写jni扩展或使用类似于 JNA 从Java中窥探Win32 API。

        3
  •  0
  •   Jonas Elfström    14 年前

    听起来像是本地的插座。延迟应在低毫秒或更低。

        4
  •  0
  •   Community Egal    7 年前

    根据你的程序,你可能会从@cowan的回答中得到一些相似之处 Any Concept of shared memory in java ,他的答案是: Any concept of shared memory in Java

    总而言之:他说你可以在同一台机器上的两个进程之间使用内存映射文件。这在理论上可以在.NET和Java之间工作。假设.NET有一些内存映射文件支持。

        5
  •  0
  •   Isabel Jinson    14 年前

    不同的机器通过将消息发送到套接字来相互通信。例如,请检查下面的链接。

    Socket programming in the real world

        6
  •  0
  •   Jim Rush    14 年前

    这里提供的答案很好。有一个想法可能很有趣,但可能会带来更多的麻烦,而不是值得的,那就是在一个进程中加载两个vm(jvm和clr都可以在本机windows应用程序中加载),并允许它们访问本机代码。JAVA通过JNI和.NET通过映射函数到它们允许的本机代码。

    您还可以利用本机队列信号量在数据更新时唤醒一侧或另一侧的线程。

    虽然JNI转换是开销,但它们可能仍然比本机本地套接字实现快。

        7
  •  0
  •   Jack Leow    14 年前

    你的Java应用程序是如何部署的?在我看来,您似乎愿意对它进行一些修改,所以我假设您可以访问源代码。

    我知道这有点小,但是你能把Java应用程序编译到J*编译器中,这样你的.NET应用程序就有了本地访问权限吗?

        8
  •  0
  •   okutane    14 年前

    您可以将编译后的Java应用程序转换为.NET。 IKVM . 之后,您可以更改.NET应用程序的逻辑,这样它就不会向Java应用程序传送数据,而只需调用为Java编写和编译的数据处理代码。

        9
  •  0
  •   Peter Lawrey    14 年前

    有许多jms服务器支持.net和java客户端。它们可以在毫秒内执行消息。

    不过,您可能希望尝试像hessian rpc或protobuf rpc这样的rpc解决方案。这些可以实现较低的延迟,并且可以在平台之间提供直接调用的外观。这些支持.NET和Java。