10 listopada 2008

Nazwa puli połączeń w Geronimo 2.1.x

Trochę czasu minęło od mojego ostatniego spotkania z Apache Geronimo i jakimś cudem zawsze udawało mi się uniknąć spędzania czasu nad konfiguracją puli połączeń do bazy danych. Tym razem było inaczej.

Połączenia do bazy danych w aplikacjach Java EE 5 zaleca się, aby oprzeć o wykorzystanie puli połaczeń zarządzanej przez serwer aplikacyjny. Wprowadzenie dodatkowej warstwy abstrakcji między wirtualną nazwą puli połączeń, z której pobierane są połączenia bazodanowe, a jej fizyczną reprezentacją w serwerze aplikacyjnym pozwala na oddelegowanie zadań jej zarządzania do serwera oraz jej właściwą konfigurację przez administratora serwera. W niewielkich zespołach podział na programistę aplikacji i administratora serwera zazwyczaj nie istnieje (i stąd najczęściej wynikają pytania o sensowność takiego podejścia), ale w większych (albo mniejszych, ale bardziej rozsądnie podzielonych) oddelegowanie zadań do właściwych członków zespołu ma znaczenie, chociażby na ich wykonanie z należytą starannością i w planowanym czasie.

Tym razem, w moim niewielkim projekcie, przyszło mi tworzyć aplikację opartą o JPA oraz zestawić pulę połączeń w Geronimo. Zazwyczaj nazwę puli umieszcza się w przestrzeni jdbc w JNDI, więc moja pula połączeń dostępna była jako jdbc/UsosDev.

Wystarczy, więc użyć tej nazwy w pliku /META-INF/persistence.xml, w sekcji <jta-data-source>UsosDev</jta-data-source> i załatwione.

Kluczem jest zapamiętanie, że wszędzie tam, gdzie potrzebna jest nazwa JNDI puli połączeń korzystamy z nazwy puli podanej w polu Name of Database Pool w asystencie Geronimo database pool wizard.

Podczas uruchomienia Geronimo z opcją -vv, np. ./bin/geronimo.sh run -vv pojawi się komunikat o uruchomieniu puli:
 15:48:36,015 INFO  [KernelContextGBean] bound gbean console.dbpool/UsosDev/1.0/rar?J2EEApplication=null,JCAConnectionFactory=UsosDev,
JCAResource=console.dbpool/UsosDev/1.0/rar,ResourceAdapter=console.dbpool/UsosDev/1.0/rar,ResourceAdapterModule=console.dbpool/UsosDev/1.0/rar,
j2eeType=JCAManagedConnectionFactory,name=UsosDev at name console.dbpool/UsosDev/JCAManagedConnectionFactory/UsosDev
Atrybut name wskazuje, pod jaką nazwą została zarejestrowana pula. W powyższym przykładzie będzie to UsosDev, a ja przez kilka dłuższych chwil oczekiwałem jdbc/UsosDev (!) i stąd poniższy komunikat błędu:
 Deployer operation failed: Unable to resolve reference "JtaDataSourceWrapper"
in gbean pl.jaceklaskowski.statystyki/przyklad/1.0/war?J2EEApplication=null,PersistenceUnitModule=WEB-INF/classes/,
WebModule=pl.jaceklaskowski.statystyki/przyklad/1.0/war,j2eeType=PersistenceUnit,name=usosPU
to a gbean matching the pattern [?name=jdbc/UsosDev#org.apache.geronimo.naming.ResourceSource]
due to: No matches for referencePatterns: [?name=jdbc/UsosDev#org.apache.geronimo.naming.ResourceSource]
Unable to resolve reference "NonJtaDataSourceWrapper"
in gbean pl.jaceklaskowski.statystyki/przyklad/1.0/war?J2EEApplication=null,PersistenceUnitModule=WEB-INF/classes/,
WebModule=pl.jaceklaskowski.statystyki/przyklad/1.0/war,j2eeType=PersistenceUnit,name=usosPU
to a gbean matching the pattern [?name=jdbc/UsosDev#org.apache.geronimo.naming.ResourceSource]
due to: No matches for referencePatterns: [?name=jdbc/UsosDev#org.apache.geronimo.naming.ResourceSource]
org.apache.geronimo.common.DeploymentException: Unable to resolve reference "JtaDataSourceWrapper"
in gbean pl.jaceklaskowski.statystyki/przyklad/1.0/war?J2EEApplication=null,PersistenceUnitModule=WEB-INF/classes/,
WebModule=pl.jaceklaskowski.statystyki/przyklad/1.0/war,j2eeType=PersistenceUnit,name=usosPU
to a gbean matching the pattern [?name=jdbc/UsosDev#org.apache.geronimo.naming.ResourceSource]
due to: No matches for referencePatterns: [?name=jdbc/UsosDev#org.apache.geronimo.naming.ResourceSource]
Unable to resolve reference "NonJtaDataSourceWrapper"
in gbean pl.jaceklaskowski.statystyki/przyklad/1.0/war?J2EEApplication=null,PersistenceUnitModule=WEB-INF/classes/,
WebModule=pl.jaceklaskowski.statystyki/przyklad/1.0/war,j2eeType=PersistenceUnit,name=usosPU
to a gbean matching the pattern [?name=jdbc/UsosDev#org.apache.geronimo.naming.ResourceSource]
due to: No matches for referencePatterns: [?name=jdbc/UsosDev#org.apache.geronimo.naming.ResourceSource]
at org.apache.geronimo.deployment.DeploymentContext.getConfigurationData(DeploymentContext.java:516)
at org.apache.geronimo.deployment.Deployer.install(Deployer.java:320)
at org.apache.geronimo.deployment.Deployer.deploy(Deployer.java:257)
at org.apache.geronimo.deployment.Deployer.deploy(Deployer.java:134)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.geronimo.gbean.runtime.ReflectionMethodInvoker.invoke(ReflectionMethodInvoker.java:34)
at org.apache.geronimo.gbean.runtime.GBeanOperation.invoke(GBeanOperation.java:130)
at org.apache.geronimo.gbean.runtime.GBeanInstance.invoke(GBeanInstance.java:850)
at org.apache.geronimo.kernel.basic.BasicKernel.invoke(BasicKernel.java:237)
at org.apache.geronimo.deployment.plugin.local.AbstractDeployCommand.doDeploy(AbstractDeployCommand.java:116)
at org.apache.geronimo.deployment.plugin.local.DistributeCommand.run(DistributeCommand.java:61)
Teraz będę pamiętał! A może by tak zgłosić usprawnienie w komunikatach Geronimo i ostatecznie zapomnieć, aby zapamiętać, i nic nie pamiętać? ;-)