WEB APP - JNI - Thread Safe

Olá Pessoal,

Não sei se coloquei no local certo essa questão.
Pesquisei muito pela internet, e achei algumas idéias, mas nenhuma delas resolve o problema completamente.
Tenho uma biblioteca legada desenvolvilda em C++, estou desenvolvendo uma biblioteca JNI e uma aplicação
web para usar essa biblioteca legada.
O maior problema é que ao criar uma nova instancia da classe JNI (interface), ela usa a mesma instancia da classe DLL (.so).
Como a aplicação legada tem váriaveis para cada usuário em C++, ao realizar mais de uma chamada via web,
eh usada a mesma instância e misturada as sessões. Na classe em JNI, tenho vários método que fazem um pass throught (conversão de tipos),
para a biblioteca legada.
Esse problema tem duas soluções que jah apliquei.

  • A primeira é separar todas as chamadas a classe nativa em blocos syncronized, portanto o método
    só é acessado por uma thread por vez.
  • A segunda é lá na DLL JNI, criei um MAP<sessionId, Objeto> na qual o objeto é a classe legada, e sempre quando chamo qualquer método
    da classe JNI passo o id da sessão do usuário e verifico se o usuário tem um objeto já, se não crio um novo. Assim todos tem sua própria sessão
    lá em baixo também.

As duas funcionaram como deveriam, mais agora estou com outro problema, se eu usar o syncronized vou colocar um gargalo, pois a aplicação legada,
leva bastante tempo em cada processamento, enquantos os outros usuário ficam esperando. Usei o Jmeter e não deu muito certo não. 10 throughtput por minuto.

Na segunda opção acreditei que seria diferente, pois não teria gargalo, mais não, ele estava processando a mesma quantidade por minuto que quando usava o syncronized.
Cheguei a conclusão que pode ser a fila do processador mesmo.
Minha dúvida é, na aplicação JNI provavelmente é um thread só, certo?
É possivel eu criar threads separados para cada instancia da aplicação legada, para daí poderem ter um melhor rendimento e maquinas multiprocessadas?
Na verdade essa aplicação será muito acessada…

Alguém tem alguma idéia?

Pessoal desde já obrigado

Abraço

Bogô

Pessoal,

achei a solução para esse problema mas esqueci de postar, portanto vou postar para garantir que se alguém passar por esse problema
possa resolver com facilidade.
A opção syncronized não deve ser levada em consideração, pois cria realmente o gargalo, o problema estava sim dentro da aplicação JNI.
Mantive a idéia do MAP de instancias da classe C++ legada por sessão web.
JNI definitivamente é multithread, portanto podem entrar vários threads ao mesmo tempo nos métodos da mesma instancia JNI.
Existem alguns cuidados que se deve ter ao implementar os métodos JNI:

  • Nada de váriaveis globais, caso precise como o caso do MAP use esse bloco syncronizado, existem métodos no C++ para fazer isso.
  • Não encaminhe nenhuma váriavel do JNI para outro método C++, como por exemplo a ‘Env’.

Qualquer dúvida posso esclarecer por email.

Abraços