Considere o desenvolvimento de uma aplicação em um contexto de programação concorrente, em que é esperada a execução simultânea de múltiplas tarefas computacionais. O time utiliza a linguagem de programação JAVA e o framework ORM Hibernate no projeto. Para obter um objeto do tipo SessionFactory, o time decide utilizar o arquivo de configuração e as seguintes classes: org.hibernate.cfg.Configuration, org.hibernate.service.ServiceRegistry e org.hibernate.service.ServiceRegistryBuilder. No início do desenvolvimento da primeira funcionalidade com linhas de execução paralelas (Threads), o time discute se é seguro compartilhar o objeto do tipo SessionFactory. Um dos desenvolvedores afirma que é seguro. O time concluiu acertadamente que esse desenvolvedor está:
- A)errado, pois a classe SessionFactoryImpl implementa a interface Referenceable;
Errada, porque o fato de uma implementacao ser Referenceable nao diz nada sobre ser ou nao seguro para uso concorrente.
- B)errado, pois a classe SessionFactoryImpl não é thread-safe;
Errada, porque a SessionFactory e concebida para ser compartilhada entre threads; quem nao deve ser compartilhada e a Session.
- C)errado, pois a classe SessionFactoryImplementor não é thread-safe;
Errada, porque a afirmacao mistura tipo interno e thread-safety de forma incorreta, ja que a SessionFactory nao e descartavel por falta de seguranca concorrente.
- D)correto, pois o objeto do tipo SessionFactory é imutável e seu estado interno contém os metadados ORM;
Certa, pois a SessionFactory e imutavel no uso normal e concentra metadados do ORM, podendo ser compartilhada com seguranca entre threads.
- E)correto, pois a classe SessionFactoryImplementor implementa a interface ConcurrentHashMap.
Errada, porque SessionFactoryImplementor nao tem relacao com ConcurrentHashMap, que e uma estrutura de dados da biblioteca Java.
Gabarito: D
Em Hibernate, a SessionFactory e um objeto pesado de inicializacao, mas depois de criado ele fica pronto para uso compartilhado entre varias threads. Isso acontece porque ele e imutavel no uso normal e guarda principalmente metadados do ORM, como mapeamentos, configuracoes e caches, sem ficar alterando seu estado a cada operacao. Na pratica, a SessionFactory e pensada para ser criada uma vez e reutilizada pela aplicacao inteira, o que combina bem com ambientes concorrentes. O ponto importante e nao confundir SessionFactory com Session. A Session nao e thread-safe e nao deve ser compartilhada entre threads, pois representa a unidade de trabalho de cada fluxo de execucao. Ja a SessionFactory funciona como uma fabrica de Sessions, podendo ser usada em paralelo sem problema. Por isso, o gabarito D esta correto: ele diz exatamente que o objeto SessionFactory e imutavel e que seu estado interno contem os metadados ORM. Essa e a ideia doutrinaria consolidada no proprio uso do Hibernate: SessionFactory e compartilhavel, enquanto Session e contextual e descartavel.