Usando uma única database session

Pessoal,

Minha dúvida, como primeiro post, é a seguinte. É possível/viável fazer com que minha aplicação java utilize apenas uma única sessão de banco de dados? Parece um absurdo perguntar isso, mas como minha aplicação está inserida num cenário maior, que primordialmente foi escrito para aplicações Oracle Forms, e que estas usam apenas uma sessão de banco. O problema está no fato de haver um sistema de gerenciamento de acesso, visibilidade de dados em tabelas, baseado em global temporary tables, as quais só existem numa única sessão. Basicamente toda vez que uma aplicação é loga-se no sistema, um conjunto de procedimentos de bancos cria essas tabelas temporárias. Tais tabelas temporárias são utilizadas para mostrar a quantidade de dados que o perfil do usuário possui e pode consultar.

Minha app vai precisar se adaptar de alguma maneira a este cenário. A primeira ideia que vejo é utilizar uma única conexão/sessão de banco durante seu ciclo de vida e não aquele tão famoso pool de conexões uma vez que seria custoso para o sistema gerar os “contextos de usuários” a cada criação de conexão.

Minha arquitetura está baseada em sua grande parte em Spring Framework.

Forte abraço,

Daniel

Eu acho que usar uma única sessão pode trazer problemas de concorrência caso a aplicação seja utilizada por vários usuários ao mesmo tempo.

Mmm… então eu utilizar um paradigma contrário ao proposto a aplicações java pode ser arriscado? então quer dizer que pode haver problemas sérios de concorrência?

Acho que sim. Uma solução seria sincronizar os métodos que utilizam o session para acessar o banco. No entanto, isso pode trazer problema de desempenho, dependendo do número de usuários acessando o sistema.

Se a aplicação for web é possível sim. Vc abre uma conexão com o banco e compartilha com todos os usuários em uso. (Se for dektop não pq cada instalação de cada usuário ira abrir uma conexão para o banco.)
Único problema será que os usuários poderão apenas ler os dados concorrentemente.
As transações terão que ser sincronizadas, podendo comprometer e muito a performance da solução, dependendo é claro do numero de usuários simultâneos.

[quote]Se a aplicação for web é possível sim. Vc abre uma conexão com o banco e compartilha com todos os usuários em uso. (Se for dektop não pq cada instalação de cada usuário ira abrir uma conexão para o banco.)
Único problema será que os usuários poderão apenas ler os dados concorrentemente.
As transações terão que ser sincronizadas, podendo comprometer e muito a performance da solução, dependendo é claro do numero de usuários simultâneos.[/quote]

O grande problema que tenho de resolver é o seguinte. As aplicações legadas da empresa são todas em Oracle Forms 10g, aquela gamba que a Oracle criou pra disponibilizar um forms na web através de um applet. Então essas aplicações quando se conectam ao sistema SSO recebem do LDAP dados de conexão ao banco. Dados esses que são utilizados não só para a aplicação conectar-se ao banco, como também para geração de contextos de usuários.

Mas o que são os contextos de usuários?

Basicamente, é o conjunto de informações que o usuário pode acessar no banco de acordo com seu perfil de acesso. Esse contextos/visões ficam disponíveis em tabelas temporárias (Oracle Global Temporary Tables) de cujos dados ficam disponíveis durante o ciclo de vida da sessão do banco de dados. Como o um Oracle Forms usa uma única Sessão de banco, como uma aplicação Desktop que tu mencionastes, esse paradigma é possível.

Agora, transpondo para um ambiente cliente/servidor, como eu poderia resolver esse problema? Eu penso em minha app web usar uma única sessão, mas já de início percebi que isso não é a melhor abordagem.

Forte abraço,

Daniel Barcellos

Acho que vc não deve seguir o modelo do forms/report.
Use datasource normal das aplicações web !
Qual é o impedimento :?: :?:

[quote]Acho que vc não deve seguir o modelo do forms/report.
Use datasource normal das aplicações web !
Qual é o impedimento [/quote]

Olha, meu caro, de uma maneira ou outra eu já estou me preparando, digamos, psicologicamente, para informar-lhes de que esse conceito é ultrapassado exatamente como a tecnologia que eles usam. Eu ainda estou estudando maneiras claras de como trabalhar isso.

Mas o lance todo é que muitas vezes esses antigos analistas oracle são muito ortodoxos e por desconhecimento das novas tecnologias e abordagens de mercado não entendem ou não aceitam modificações substanciais em abordagens, que no passado, funcionavam.

Estou trabalhando como arquiteto java num sub-projeto de uma empresa sub-alocada em outra maior e que, esta última, se vê a deriva no mercado por usar ainda, ou por ter apostado no passado, na tecnologia oracle forms.

Nosso ambiente não é muito “parrudo”. Minha arquitetura não é baseada em EJB’s, mas sim em Spring.

Daniel

…continuando!

Contamos com aplicações que rodam sobre o container TomCat e uma app server Glassfish (cheaper).

Forte abraço,

Daniel

Atualmente eu tb não tenho projetos EJB.
Minhas soluções hoje são:
JSF+SPRING+JPA+TOMCAT+SQLServer
As aplicações tem em media 10 mil usuários cadastradas com 600 sessões por minuto.
Uso apenas uma instância de tomcatzinho devidamente turbinado e ainda sobra uns 50% dos recursos de máquina.
Tranquilo, tranquilo… 8)

Pois é meu bruxo, mas eu ainda tenho de resolver o problema das tabelas temporárias que ficam disponíveis em uma única sessão. Outra coisa que esqueci de informar é que tais tabelas de contextos (tabelas temporárias que vivem durante uma única sessão de banco) são criadas/populadas uma procedure de banco. Hoje eu uso um c3p0 para gerenciar meu pool de conexões. Pergunto se há alguma forma de, no criar de cada conexão, o próprio bean do c3p0 “rodar” a procedure de geração de contexto.

Daniel

Da sim…é só fazer um proxy do DataSource do seu pool, interceptando getConnection(). Dai vc pode executar oq vc quiser.
T+

Greate Idea!

Do you have any IM?!

criaresoftware@criaresoftware.com.br

ou

danielpoa.rs@gmail.com