2013-03-04 10 views
5

Buduję aplikację, która ma autonomiczną warstwę "core", która jest również używana do tworzenia aplikacji webapp (jest to wielomodułowy projekt Maven, z modułem "core" i modułem "webapp", który ma zależność od modułu "core"). Używa bazy danych MySQL. Próbuję wdrożyć DataSource, który byłby dobry w obu kontekstach (tylko jedno połączenie wystarcza w kontekście autonomicznym).Które źródło danych dla aplikacji jest używane zarówno w kontekście autonomicznym, jak i aplikacji webowej (Java 7, Tomcat 7)?

Po przeczytaniu wielu dokumentacji na temat źródeł danych, muszę powiedzieć, że jestem trochę zagubiony. Doszedłem do wniosku, że może powinienem użyć Tomcat JDBC Connection Pool. Moje pytania to:

1) w autonomicznym kontekście, w jaki sposób powinienem podać konfigurację do korzystania z DataSource, wiedząc, że ta konfiguracja będzie dostarczona przez Tomcat w kontekście webapp (autonomiczna konfiguracja nie powinna zatem nadpisywać konfiguracji Tomcat)?

  • powinienem zrobić coś takiego in this other question w metodzie zwanej tylko w jednostkowym kontekście? Ale jak mogę zobaczyć w kontekście webapp, że Tomcat już dostarczył DataSource?

  • Czy powinienem raczej użyć definicji fasoli? Ale w jaki sposób ta fasola nie byłaby wykorzystywana w kontekście webapp?

2) A co z innymi połączonymi implementacjami DataSource?

Wniosek: Tak, jestem zagubiony i nie wiem, jakie są "standardy Gold" dla wykorzystania DataSource. Dziękuję za pomoc.

Odpowiedz

2

Możesz wyszukać źródło danych w module rdzeniowym. Musisz utworzyć JNDI Datasource in Tomcat dla modułu Webapp i Standalone JNDI support dla modułu autonomicznego.

np. Dla uzyskania Connection ze źródłem danych jest taka sama zarówno w kontekście:

Context ctx = new InitialContext(); 
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/MySQLDB"); 
Connection conn = ds.getConnection(); 

Ale konfiguracja źródła danych jest zmierzających. W Tomcacie zobaczysz coś takiego w przykładach w linkach.

<Context> 
<Resource name="jdbc/MySQLDB" ... /> 
</Context> 

Nazwa zasobu w jednostkowym musi być ona taka sama jak rozmowy w autonomicznym ctx.lookup:

Properties prop = new Properties(); 
prop.put("java:comp/env/jdbc/MySQLDB", ds1); 

InitialContextFactory w module jednostkowym musi być utworzony niezależnie od modułu podstawowego.

Informacje o com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource patrz this.Tomcat używa bibliotek DBCP oprogramowaniu Fundacji Apache, które można również wykorzystać w swoim własnym kodem non-Java EE: http://jakarta.apache.org/commons/dbcp/

for JDBC Bilard w Tomcat zobaczyć this i Apache DBCP Pool zobaczyć this.

+0

Dzięki za odpowiedź, kilka pytań: moja warstwa "core" jest biblioteką, która może być używana w innych aplikacjach. Jeśli nie chcę, aby te aplikacje wykonywały zadania opisane w twoim drugim łączu, InitialContext powinien być ustawiony ** wewnątrz ** warstwy rdzenia, prawda? Więc może powinienem po prostu wykonać wyszukiwanie w warstwie rdzenia, wychwycić wyjątek wyrzucony, jeśli nie w kontekście przeglądarki internetowej, a następnie ustawić własne połączenie w takim przypadku? Czy to byłoby ważne? – FBB

+0

Jeśli "rdzeń" zawiera taką funkcję, która może być wykonywana przez inne aplikacje. Można wygenerować trzeci komponent (z niestandardowym 'InitialContextFactory'), który może być wywołany z autonomicznej aplikacji. Myślę, że ta funkcja wymagań może być unikalna dla samodzielnej aplikacji, więc możesz ją osadzić w takiej aplikacji. W innej ręce możesz zaimplementować fabrykę połączeń. –

+0

Tak, wystarczy prosta fabryka połączeń korzystająca z DriverManager, gdy DataSource nie może być załadowany za pomocą JNDI. Sterownik można skonfigurować za pomocą pliku właściwości. Czy to byłoby ważne? Os to straszny wzór projektu? : p – FBB

Powiązane problemy