# JTA ja/nein & wie (JBoss & Hibernate & Transakti



## Gumble (20. Mrz 2006)

Nachdem Sandboxbetrieb und Testcases alle gingen und es im JBoss Fehler hagelt, hab ich durch Foruggeln herausgefunden, dass es Probleme mit den Transaktionen gibt. ("You cannot commit during a managed transaction jboss hibernate").
1. Frage:
Muss ich unbedingt JTA verwenden? Wie umgeh ich das? 
2. Frage:
Wie verwende ich JTA? Ich habe keine EJB-Beans! Angeblich sollte HibernateContext.getSession() gehen, doch gibts die Klasse nicht in dem hibernate3.jar. Per Hand komm ich auch nicht ran:
	
	
	
	





```
InitialContext ic = new InitialContext();
Object o = ic.lookup("java:/hibernate/SessionFactory");
SessionFactory sf = (SessionFactory)o;
Session session = sf.openSession();
```
Da "java:/hibernate/SessionFactory" bei mir nicht existiert. In der JNDI-View find ich auch nix aehnliches.
- wie setzt man explizit die HibernateFactory die unter JTA-Trx Kontrolle ist?

TIA!

(JBoss AS 4.0.3SP1 & MySql5 (InnoDB) & Hibernate 3.1.2)


----------



## Gumble (20. Mrz 2006)

Okay, mal bisschen rumgespielt:
	
	
	
	





```
<?xml version="1.0" encoding="UTF-8"?>
<service>
	<mbean code="org.hibernate.jmx.HibernateService" name="jboss.jca:service=HibernateFactory,name=HibernateFactory">
		<depends>jboss.jca:service=RARDeployer</depends>
		<depends>jboss.jca:service=LocalTxCM,name=MySqlDS</depends>
		<depends>jboss.jca:name=MySqlDS,service=DataSourceBinding</depends>
		<attribute name="JndiName">java:/hibernate/HibernateFactory</attribute>
		<attribute name="Datasource">java:/MySqlDS</attribute>
		<attribute name="Dialect">org.hibernate.dialect.MySQLInnoDBDialect</attribute>
		<attribute name="TransactionStrategy">org.hibernate.transaction.JTATransactionFactory</attribute>
		<attribute name="TransactionManagerLookupStrategy">org.hibernate.transaction.JBossTransactionManagerLookup</attribute>
		<attribute name="ShowSqlEnabled">false</attribute>
		<attribute name="UserTransactionName">UserTransaction</attribute>
	</mbean>
</service>
```
Die Docs (clickMe) sind leider nicht mehr ganz aktuell, so dass die Package-Angaben und das ShowSql-Attribute geaendert werden mussten. Reichen die beiden Attributseinstellungen "TransactionStrategy" und "TransactionManagerLookupStrategy" aus, damit JTA aktiv ist?
Irgendwie gibts immer noch Probleme, aber darum kuemmer ich mich erst morgen  :autsch:


----------



## busch-d (23. Mrz 2006)

ja, das sollte eigentlich reichen. jetzt das ganze in ein sar archiv verpacken, mit den libs im root verzeichniss und der jboss-service.xml im META-INF verzeichnis. und deployen


----------



## Gumble (27. Mrz 2006)

so, zurueck zum Thema. Es sind noch so viele Fragen offen (in meinen Beitraegen zuvor), will aber noch mehr hinzufuegen :autsch: 

Annahme:
Sobald ich eine Datenbank als Datasource "xxx-ds.xml" konfiguriere, schaltet sich das Connection-Pooling von JBoss ein, falls ich in meiner Hibernate-Anwendung auf diese in der cfg.xml verweise [<property name="hibernate.connection.datasource">java:/MySqlDS</property>]?

Kann das jemand bestaetigen?
Ich vermute dies, weil c3p0 nur dann anspringt, wenn im cfg.xml direkt auf die DB [<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/bla</property>] verwiesen wird.

c3p0 kuemmert sich ja ums Connection und Statement-Pooling - in wie weit hat dass nun jetzt auch was mit dem JBoss-Transaktion Management zu tun? Gar nix, oder?

Wozu brauch ich eigentlich den HibernateService, also die HibernateFactory im JNDI? Ich hol mir doch immer die SessionFactory ueber _configuration.buildSessionFactory()_.

Edit:
ach man, alles doof:

11:27:09,324 WARN  [JDBCExceptionReporter] SQL Error: 0, SQLState: null
11:27:09,324 ERROR [JDBCExceptionReporter] com.mchange.v2.c3p0.PoolBackedDataSource@158fd70 [ connectionPoolDataSource -> com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@1070723 [ acquireIncrement -> 1, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1070723, idleConnectionTestPeriod -> 0, initialPoolSize -> 1, maxIdleTime -> 0, maxPoolSize -> 8, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 1, nestedDataSource -> com.mchange.v2.c3p0.DriverManagerDataSource@19ac2e3 [ description -> null, driverClass -> null, factoryClassLocation -> null, identityToken -> 19ac2e3, jdbcUrl -> jdbc:mysql://localhost:3306/jbpm, properties -> {autoReconnect=true, user=******, password=******, dialect=org.hibernate.dialect.MySQLInnoDBDialect, autoReconnectForPools=true} ], preferredTestQuery -> null, propertyCycle -> 300, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, usesTraditionalReflectiveProxies -> false ], factoryClassLocation -> null, identityToken -> 158fd70, numHelperThreads -> 3 ] has been closed() -- you can no longer use it.
...
Caused by: java.sql.SQLException: com.mchange.v2.c3p0.PoolBackedDataSource@158fd70 [ _das von oben_ ]
	at com.mchange.v2.c3p0.PoolBackedDataSource.assertCpds(PoolBackedDataSource.java:234)
	at com.mchange.v2.c3p0.PoolBackedDataSource.getPoolManager(PoolBackedDataSource.java:246)
	at com.mchange.v2.c3p0.PoolBackedDataSource.getConnection(PoolBackedDataSource.java:94)
	at org.hibernate.connection.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:35)
	at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:360)

Hab 1 MySql Datenbank, 2 unterschiedliche (=cfg.xml) HibernateSession mit der selben Konfiguration (c3p0, no TransactionManager): der eine Datensatz geht, der andere nicht 

Nur Schererei  Hab das Gefuehl ich stocher im dunklen Sumpf umher. Hab keine Ahnung was ich da eigentlich rumkonfigurier - die Docu ist ja mies bzw finde ich nicht.
Hab nun c3p0 rausgeschmissen, keine Pooling also; beide Datensession greifen nun direkt auf die DB zu, JTA aktiviert:
Mach ich nun ein commit (geht bei beiden Sessions nicht) dann kommt dies

11:56:19,386 INFO  [ConnectionManager] forcing batcher resource cleanup on transaction completion; forgot to close ScrollableResults/Iterator?
was dazu fuehrt dass keine Aenderungen in der DB-Uebernommen werden...


----------

