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ô