Fonte de dados JNDI fora do contêiner

Eu gostaria de configurar um DataSource usando JNDI em um aplicativo Java SE. Qual é a melhor maneira de fazer isso?

Até agora, me deparei com dois projetos:

  1. Apache Naming . A página do projeto tem um exemplo específico para configurar uma fonte de dados, mas parece que o projeto é super antigo e não está mais ativo.
  2. JBossNS . Parece fácil configurar um JNDI somente local usando LocalOnlyContextFactory , mas não encontrei nenhum documento sobre como configurar realmente uma fonte de dados.

Se possível, gostaria de também configurar a fonte de dados com um gerenciador de transactions JTA (usando JOTM?).

Por que você está usando o JNDI para isso? Não é uma má solução se você tiver um provedor, mas existem alternativas como injeção de dependência (IoC: via Spring ou Guice ).

O access aos dados do Spring JDBC é descrito aqui . O melhor é que você pode usar o Spring para injetar um DataSource em seu código:

    

A origem de dados pode ser definida usando uma consulta JNDI:

  

Em um ambiente de teste, você pode injetar a fonte de dados diretamente:

    

Essas referências são bem antigas, mas podem ajudar a usar o jnpserver (provedor de serviços de nomeação do JBoss):

  • Trabalhando com o JNDI em um aplicativo J2SE
  • Servidor JNDI independente usando jnpserver.jar

Uma solução muito fácil de usar para JNDI independente é simples-jndi . Funciona como um charme, desde que você precise apenas de uma única JVM, já que é uma biblioteca sem servidor de rede.

A versão Simple-JNDI, referenciada por klenkes74, não está mais em desenvolvimento ativo. Porque eu encontrei alguns problemas com ele eu bifurquei, fiz algumas correções de bugs e implementei alguns novos resources. Eu já usei a versão antiga não só para testes, mas também em produção, porque eu prefiro um padrão de Service Locator sobre Dependency Injection, embora o último seja mais moderno atualmente.

Você pode facilmente usar o Simple-JNDI para definir um DataSource ou um conjunto de conexões declarativamente e obtê-lo vinculado a um Contexto JNDI.

Defina um arquivo jndi.properties no seu classpath:

 java.naming.factory.initial=org.osjava.sj.SimpleContextFactory org.osjava.sj.root=[absolute_or_relative_path_to_a_property_file] 

O arquivo de propriedades se parece com:

 type=javax.sql.DataSource driver=org.gjt.mm.mysql.Driver url=jdbc:mysql://localhost/testdb user=testuser password=testing 

Agora você pode acessar seu DataSource de dentro do seu código desta maneira:

  InitialContext ctxt = new InitialContext(); DataSource ds = (DataSource) ctxt.lookup("name_of_your_datasource"); 

Para mais informações, consulte https://github.com/h-thurow/Simple-JNDI

Intereting Posts