Spring JBoss 7 - wie JNDI Datasource einbinden

Diskutiere JBoss 7 - wie JNDI Datasource einbinden im Application Tier Bereich.
Y

y0dA

Hi,
aktuell wird bei uns im Projekt die dataSource wie folgt in der 'applicationContext.xml' definiert:
Java:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
      destroy-method="close"> 
    <property name="driverClass" value="${database.driverClassName}" />
    <property name="jdbcUrl" value="${database.url}" />
    <property name="user" value="${database.username}" />
    <property name="password" value="${database.password}" />
    <property name="minPoolSize" value="5" />
    <property name="maxPoolSize" value="50" />
    <property name="initialPoolSize" value="10" />
    <property name="checkoutTimeout" value="0" />
    <property name="maxStatements" value="50" />
    <property name="maxIdleTime" value="300" />
</bean>
Die Platzhalter bekommen die Werte von folgendem .properties File:
Code:
database.driverClassName=net.sourceforge.jtds.jdbc.Driver
database.url=jdbc:jtds:sqlserver://xxx:xxx/
database.username=username
database.password=pwd
Weitere, eventuell relevante, Stellen in der 'applicationContext.xml':
[XML]<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="xxxx" />
<property name="dataSource" ref="dataSource" />
<property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml"/>
<property name="jpaVendorAdapter">
<bean
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform"
value="org.hibernate.dialect.SQLServerDialect" />
<property name="showSql" value="false" />
<property name="generateDdl" value="false" />
</bean>
</property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
<property name="dataSource" ref="dataSource" />
</bean>[/XML]

So nun hätte ich versucht die obige dataSource Definition durch folgende zu ersetzen (2 Varianten welche mir den gleichen Fehler liefern):
[XML]<jee:jndi-lookup id="dataSource" jndi-name="java:jboss/datasources/myDataSource"
expected-type="javax.sql.DataSource" resource-ref="false">
</jee:jndi-lookup>[/XML]

[XML] <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:jboss/datasources/wtb" />
</bean> [/XML]

Und so sieht die Exception im server.log aus:

Code:
Caused by: javax.resource.ResourceException: Wrong driver class [class org.h2.Driver] for 
this connection URL [jdbc:jtds:sqlserver://xxx:xxx]
at   
org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.getLocalManagedConnection(
LocalManagedConnectionFactory.java:251)
... 68 more
Also simmt eine meiner beiden dataSource Definitionen? Wo muss ich die Driverclass definieren (bei der zu ersetzenden dataSource gibts ja hierfür extra ein Property 'driverClass')? Muss ich eventuell das Driver .jar irgendwo (am besten in ein /lib) am Server legen?
 
N

nillehammer

Der JDBC-Driver muss natürlich zur eingestzten Datenbank passen. Anhand der JDBC-URL erkennst du, welche es ist. Kenne mich mit JBOSS-Konfiguration nicht aus, aber in den von Dir gezeigten Dateien scheint es ja hier zu sein:
[XML]
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${database.driverClassName}" />
<property name="jdbcUrl" value="${database.url}" />
[/XML]
bzw in den Properties:
Code:
database.driverClassName=net.sourceforge.jtds.jdbc.Driver
database.url=jdbc:jtds:sqlserver://xxx:xxx/
Muss ich eventuell das Driver .jar irgendwo (am besten in ein /lib) am Server legen?
Ja, da die Connection zur DB vom App-Server gemanaged wird, braucht dieser auch das lib im Zugriff. Es reicht in diesem Fall nicht, das jar im ear/war zu deployen.
 
Y

y0dA

Der JDBC-Driver muss natürlich zur eingestzten Datenbank passen. Anhand der JDBC-URL erkennst du, welche es ist. Kenne mich mit JBOSS-Konfiguration nicht aus, aber in den von Dir gezeigten Dateien scheint es ja hier zu sein:
[XML]
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${database.driverClassName}" />
<property name="jdbcUrl" value="${database.url}" />
[/XML]
bzw in den Properties:
Code:
database.driverClassName=net.sourceforge.jtds.jdbc.Driver
database.url=jdbc:jtds:sqlserver://xxx:xxx/
Ja das ist mir schon klar nur wo und wie erstelle ich nun eine dataSource Bean mit driverClass und jndi?..


Sowohl JDBC-Driver und auch Connection müssen in der standalone.xml eingetragen werden. Der Driver muss als module "nachinstalliert" werden:

jboss-as-7-mysql-datasource-konfigurieren/
Natürlich läuft unsere Applikation in einem Cluster - somit gibts wohl nix in der standalone.xml zu tun? Finde leider auch keine Dokumentation oder ein ToDo..
 
Zuletzt bearbeitet:
JimPanse

JimPanse

Ja das ist mir schon klar nur wo und wie erstelle ich nun eine dataSource Bean mit driverClass und jndi?..




Natürlich läuft unsere Applikation in einem Cluster - somit gibts wohl nix in der standalone.xml zu tun? Finde leider auch keine Dokumentation oder ein ToDo..
natürlich erwähnt man sowas nicht bevor man die Frage stellt :pueh:...

Doku's gibt es reichlich. Der JBoss 7 läuft entweder im standalone oder im domain Modus (d.h. jboss/standalone/configration/standalone.xml oder jboss/domainconfigration/domain.xml).

Die Konfiguration bleibt die gleiche.

how_to_create_and_manage_datasources_in_as7

Edit standalone.xml/domain.xml adding a driver element into datasources subsystem
bzw.

Documentation
 
Y

y0dA

Ok, hab nun den Driver sowie die Datasource per web console am JBoss angelegt. Wie muss nun die korrekte Defintion in der applicationContext.xml aussehen?

Mit oben genannten Definitionen bekomme ich lustigerweise noch immer folgenden Fehler:

Code:
Caused by: javax.resource.ResourceException: Wrong driver class [class org.h2.Driver] for this connection URL [jdbc:jtds:sqlserver://xxxx:xxx/]
	at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.getLocalManagedConnection(LocalManagedConnectionFactory.java:251)
	... 56 more
Obwohl ich beim erstellen der Datasource, per web console, den sqljdbc4.jar angegeben habe. Denk ich muss in der applicationContext.xml auch noch was zum Driver schreiben? Wo?
 
Zuletzt bearbeitet:
Y

y0dA

Ok hab nun auch dem 'default' profile des JBoss die Datasource hinzugefügt - nun bekomme ich eine andere Fehlermeldung (bin aber wohl mal über die Driversache hinweg):
Code:
14:03:11,964 ERROR [org.springframework.web.context.ContextLoader] (MSC service thread 1-2) Context initialization failed: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'StatisticsKPImonthly': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'TestFacade': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [spring/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: org/hibernate/cfg/BinderHelper
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:306) [spring-context-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) [spring-context-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464) [spring-context-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:384) [spring-web-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283) [spring-web-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111) [spring-web-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:3392) [jbossweb-7.0.13.Final.jar:]
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:3850) [jbossweb-7.0.13.Final.jar:]
	at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:90) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
	at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)
	at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [rt.jar:1.6.0_32]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [rt.jar:1.6.0_32]
	at java.lang.Thread.run(Thread.java:662) [rt.jar:1.6.0_32]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'MarketFacade': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [spring/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: org/hibernate/cfg/BinderHelper
	at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:342) [spring-orm-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:442) [spring-context-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:416) [spring-context-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:549) [spring-context-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:150) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:303) [spring-context-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	... 21 more

aused by: java.lang.NoClassDefFoundError: org/hibernate/cfg/BinderHelper
	at org.hibernate.cfg.annotations.EntityBinder.bindEjb3Annotation(EntityBinder.java:175) [hibernate-core-3.6.9.Final.jar:3.6.9.Final]
	at org.hibernate.cfg.annotations.EntityBinder.<init>(EntityBinder.java:149) [hibernate-core-3.6.9.Final.jar:3.6.9.Final]
	at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:543) [hibernate-core-3.6.9.Final.jar:3.6.9.Final]
	at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:4035) [hibernate-core-3.6.9.Final.jar:3.6.9.Final]
	at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3989) [hibernate-core-3.6.9.Final.jar:3.6.9.Final]
	at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1398) [hibernate-core-3.6.9.Final.jar:3.6.9.Final]
	at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1375) [hibernate-core-3.6.9.Final.jar:3.6.9.Final]
	at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1519) [hibernate-entitymanager-3.6.9.Final.jar:3.6.9.Final]
	at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:193) [hibernate-entitymanager-3.6.9.Final.jar:3.6.9.Final]
	at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:1100) [hibernate-entitymanager-3.6.9.Final.jar:3.6.9.Final]
	at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:689) [hibernate-entitymanager-3.6.9.Final.jar:3.6.9.Final]
	at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:73) [hibernate-entitymanager-3.6.9.Final.jar:3.6.9.Final]
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:257) [spring-orm-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310) [spring-orm-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452) [spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE]
	... 48 more
Caused by: java.lang.ClassNotFoundException: org.hibernate.cfg.BinderHelper from [Module "deployment.my.war:main" from Service Module Loader]
	at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190)
	at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:468)
	at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:456)
	at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:423)
	at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398)
	at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120)
	... 64 more
 
Y

y0dA

Gut zu wissen, das aktuelle Problem rührt aber eher daher dass ich 'sql4jdbc.jar' am JBoss deployed habe und meiner JNDI genannt habe aber eigentlich 'jdts-1.2.jar' benötige. Deshalb bekomme ich den Fehler dass die Connection URL nicht passt.

Natürlich gehts nun weiter, JBoss 7 unterstützt nur jdbc 4 compliant driver, deshalb funktionierte der 'sql4jdbc.jar', bei 'jdts-1.2.jar' siehts leider anders aus, den erkennt JBoss per Deploy nicht. Sprich nun muss ich mir anschauen wie ich den jdts als module einbinden kann.
 
Thema: 

JBoss 7 - wie JNDI Datasource einbinden

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben