在.Net&amp ;;之间共享数据(而不是对象)的最快(以性能为导向)方式Java的

时间:2010-01-22 07:30:24

标签: java .net integration

我知道至少有一个帖子里面有这样的字。但这与该帖子不完全相同。我正在尝试在.NET和Java应用程序之间“共享”数据。我不关心对象,但如果你愿意的话,我只是简单的字符串。

我有一个.NET应用程序捕获实时数据和一个Java应用程序,它具有分析和处理这些数据的能力。我正在寻找方法来重用这个相同的Java应用程序而无需在.NET中完全编码。

我的问题是数据是“相当”的实时(.NET),因此必须是分析(Java)。我可以忍受微秒延迟,但我负担不起一秒延迟。 Web服务,队列(如在消息队列中),RDBMS是我能想到的一些选项。有没有更好的方法?

或者有没有人为我上面提到的解决方案中选择其中一个获得一些真实的性能数字?并且刚刚开始:RDBMS对于并发(连接正在进行)插入/更新/读取并不“好”,至少在粗略的DBMS方式方面是这样。 (死锁?)

9 个答案:

答案 0 :(得分:7)

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

我认为微秒延迟对这里的任何方法都是一个挑战......会有毫秒延迟吗?

答案 1 :(得分:2)

为了完整性:

另一种可能是使用Named pipes,它应该非常快,我想象(作为一个我只能想象的java人).NET本身支持它们。不利的一面是,在Windows上,您必须编写JNI扩展或使用像JNA这样的库在Java的Win32 API中进行搜索。

答案 2 :(得分:0)

听起来像本地套接字可以做到的。延迟应该在低ms或更低。

答案 3 :(得分:0)

根据您的计划,您可能会对@Cowan在回答“Any Concept of shared memory in java”时所报告的内容有所了解,他的回答是:Any concept of shared memory in Java

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

答案 4 :(得分:0)

不同的机器通过向套接字发送消息来相互通信。请查看以下链接。

Socket programming in the real world

答案 5 :(得分:0)

这里提供的答案很棒。可能感兴趣的一个想法,但可能要求更多麻烦而不是它的价值是在一个进程中加载​​两个VM(JVM和CLR都可以在本机Windows应用程序中加载)并让他们访问本机代码。 Java通过JNI和.Net通过映射函数到它们允许的本机代码。

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

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

答案 6 :(得分:0)

您的Java应用程序目前是如何部署的?听起来我觉得你愿意对它做一些修改,所以我假设你有权访问源代码。

我知道这有点儿,但是你可以在J#编译器中编译Java应用程序,以便你的.NET应用程序具有本机访问权限吗?

答案 7 :(得分:0)

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

答案 8 :(得分:0)

有许多JMS服务器支持.NET和Java客户端。这些可以在毫秒内执行消息。

但是,您可能想尝试像Hessian RPC或Protobuf RPC这样的RPC解决方案。这些可以实现更低的延迟,并且可以在平台之间提供直接调用的外观。这些也支持.NET和Java。