2009-10-23 17 views
15

Chciałbym skonfigurować źródło danych przy użyciu JNDI w aplikacji Java SE. Jaki jest najlepszy sposób na zrobienie tego?Źródło danych JNDI kontenera

Dotychczas Natknąłem 2 projekty:

  1. Apache Naming. Strona projektu zawiera konkretny przykład konfiguracji źródła danych, ale wygląda na to, że projekt jest bardzo stary i nie jest już aktywny.
  2. JBossNS. Wygląda na to, że łatwo jest skonfigurować JNDI lokalny tylko za pomocą LocalOnlyContextFactory, ale nie znalazłem żadnych dokumentów dotyczących faktycznego konfigurowania źródła danych.

Jeśli to możliwe, chciałbym również skonfigurować źródło danych za pomocą menedżera transakcji JTA (przy użyciu JOTM?).

Odpowiedz

10

Dlaczego używasz do tego JNDI? Nie jest tak, że to złe rozwiązanie, jeśli masz dostawcę, ale istnieją alternatywy, takie jak wstrzyknięcie zależności (IoC: via Spring lub Guice).

Wiosenny dostęp do danych JDBC jest opisany here. Wspaniałą rzeczą jest to, że można użyć Wiosna wstrzyknąć DataSource w kodzie:

<bean class="com.my.Persister"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

Źródłem danych może być zdefiniowany za pomocą JNDI-odnośnika:

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDataSource" /> 

W środowisku testowym, można wstrzyknąć bezpośrednio źródło danych:

<bean id="dataSource" class="apache.db.PoolingDataSource"> 
    <!-- config goes here --> 
</bean> 
+0

Powinienem był o tym wspomnieć w poście. Piszę komponent, który będzie działał w aplikacji internetowej, ale chciałbym również móc go wywołać z prostych aplikacji wiersza poleceń Java SE i testów JUnit. Mój początkowy pomysł polegał na tym, że powinienem umieć skonfigurować niezbędne środowisko (JNDI, DBCP, JTA), aby kod komponentu mógł zawsze na nich polegać. Jestem niechętny wprowadzeniu zupełnie nowych ram, takich jak Spring, do aplikacji, ale to może być opcja. Czy są jakieś specjalne strony z dokumentacją Spring, które poleciłbyś? – nikita

+0

Edytowałem odpowiedź, aby podać link i wskazanie, co robić. Wiosna JDBC jest bardzo potężna –

+0

Dziękuję za szczegóły. Nie mam wystarczającej liczby punktów, aby oznaczyć odpowiedź jako pomocną: | – nikita

3

Bardzo łatwe w użyciu rozwiązanie do JNDI autonomicznym jest simple-jndi. Działa jak czar tak długo, jak tylko potrzebujesz go w pojedynczej wirtualnej maszynie wirtualnej, ponieważ jest to biblioteka bez serwera sieciowego.

1

Wersja Simple-JNDI, do której odwołuje się klenkes74, nie jest już aktywnie rozwijana. Ponieważ napotkałem na pewne problemy, rozwinąłem je, naprawiłem kilka błędów i zaimplementowałem kilka nowych funkcji. Używałem już starej wersji nie tylko do testowania, ale także do produkcji, ponieważ wolę wzór Service Locator niż Dependency Injection, chociaż ten drugi jest obecnie bardziej modny.

Możesz łatwo użyć Simple-JNDI do zdefiniowania DataSource lub puli połączeń deklaratywnie i przekonwertować je do Kontekstu JNDI.

Zdefiniuj jndi.właściwości pliku w ścieżce klas:

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

Plik właściwości wygląda następująco:

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

Teraz można uzyskać dostęp do DataSource od wewnątrz kodu w ten sposób:

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

Więcej informacji można znaleźć https://github.com/h-thurow/Simple-JNDI

Powiązane problemy