首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Servlet容器中使用JNI库

问在Servlet容器中使用JNI库
EN

Stack Overflow用户
提问于 2016-06-07 20:22:19
回答 1查看 441关注 0票数 1

我正在开发一个web应用程序,但我需要调用某些专有的C++库函数。正如我所理解的,本机方法不是线程安全的,因此本机代码中的访问冲突可能会导致应用程序服务器JVM崩溃。(猫)这个本地API在整个web应用程序功能中只占很小的一部分,我想说只有5%的用户会访问这个功能。无论应用程序经过多么彻底的测试(我无法访问本机源代码),本机库中存在潜在缺陷的风险可能会导致整个应用程序服务器注销用户,并可能导致停机。

所以问题是-哪种策略更好?

1)是否应该将本机库包装在单独的进程中,这样主web服务器就不会受到本机代码中的错误的影响。我可能可以使用UNIX套接字与我的web服务器中的这个独立进程进行通信。(避免TCP套接字的开销)。如果出现这种情况,请尽快修复问题,并接受5%的用户的停机时间。

或

2)在servlet容器中继续使用JNI。(每一个人都有潜在的停机风险)

你好,罗希特

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-09 11:44:24

这取决于:

考虑到,如果一个函数不是线程安全的,这并不一定意味着如果从多个线程调用它就会崩溃。它可能只是返回完全错误的结果。

  1. 如果您的应用程序无法克服它,那么您就没有其他选项,您需要序列化对本机代码的访问。
  2. 如果您确信调用非线程安全函数的唯一副作用是它可能崩溃,那么您需要确保崩溃不会导致其他类型的错误,例如后端应用程序中的数据不一致(数据库损坏等)。(您可以使用事务来防止这种情况发生。)
  3. 如果您的应用程序能够克服上述所有问题,那么仍然需要第三条信息:您需要研究您的用户容忍多少停机/崩溃。如果他们容忍可能的停机时间,那就去做吧,不要担心崩溃,你可以安全地“咬紧牙关”,因为它不会伤害你的用户或你的应用程序。

在所有其他情况下,您必须序列化对本机函数的访问。

将它们封装到进程中可能是个好主意,但您必须确保函数一次只能在一个线程中运行。因此,您可能需要实现某种机制,让其他线程/servlet等待,直到其中一个线程/servlet完成对函数的调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37688629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档