簡體   English   中英

在Servlet容器中使用JNI庫

[英]Use JNI library in Servlet container

我正在研究Web應用程序,但我需要調用某些專有的C ++庫函數。 據我所知,本機方法不是線程安全的,因此本機代碼中的訪問沖突可能會使應用程序服務器JVM崩潰。 (Tomcat)的。 這個本機API只是整個Web應用程序功能的一小部分,我想只有5%的用戶會訪問此功能。 無論應用程序的測試程度如何(我無法訪問本機源代碼),本機庫中存在潛在錯誤的風險可能導致整個應用程序服務器注銷用戶並可能導致停機。

那么問題 - 哪種策略更好?

1)我應該在單獨的進程中包裝本機庫,以便主Web服務器不受本機代碼中的錯誤的影響。 我可以使用UNIX套接字從我的Web服務器與這個單獨的進程通信。 (避免TCP套接字的開銷)。 如果發生這種情況,請盡快解決問題並接受5%用戶的停機時間。

要么

2)咬緊牙關並繼續在servlet容器中使用JNI。 (存在可能導致每個人停機的風險)

此致,羅希特

這取決於:

考慮到,如果函數不是線程安全的,那不一定意味着如果從多線程調用它將會崩潰。 它可能只是返回完全錯誤的結果。

  1. 如果您的應用程序無法以某種方式克服它,那么您沒有其他選項,您需要序列化對本機代碼的訪問。

  2. 如果您確定調用非線程安全函數的唯一副作用是它可能崩潰,那么您需要確保崩潰不會導致其他類型的錯誤,例如應用程序中的不一致數據后端(數據庫損壞等)。 (您可以使用交易來防止這種情況。)

  3. 如果您的應用程序能夠克服以上所有問題,那么仍然需要第三條信息:您需要研究用戶容忍的停機/崩潰程度。 如果他們容忍可能的停機時間,那么繼續並且不關心崩潰,你可以安全地“咬緊牙關”,因為它不會傷害你的用戶或你的應用程序。

在所有其他情況下,您必須序列化對本機函數的訪問。

將它們包裝到一個進程中可能是一個好主意,但您必須確保函數一次只能在一個線程中運行。 所以你可能需要實現一些機制來讓其他線程/ servlet等到其中一個完成調用函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM