From: Jeff J. <jj...@ap...> - 2010-05-18 05:24:02
|
Hi Zdeněk, thanks for the reply. I'll add some more info for clarity and see what you think - Right on the commit - I only added that JTA commit to the test to prove the point that if it was committed, then dbUnit would see the inserted rows for the dataset verify. Thanks for the tip to Bitronix - I was not aware of it. I wonder if a different one than Atomikos would have same/similar issues, or different! Regarding DataSource, I've configured DataSourceDatabaseTester, which takes the DataSource and calls getConnection() on it when called for. I've configured the creation of the JTA related beans like this: <tx:annotation-driven /> <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManager" ref="atomikosTransactionManager" /> <property name="userTransaction" ref="atomikosUserTransaction" /> </bean> <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close"> <property name="forceShutdown" value="false" /> </bean> <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"> <property name="transactionTimeout" value="300" /> </bean> <bean id="dbDataSourceEmbedded" class="org.apache.derby.jdbc.EmbeddedXADataSource"> <property name="databaseName" value="${cmr.databaseName.cmr3}" /> <property name="createDatabase" value="${cmr.createDatabase.cmr3}"/> <property name="connectionAttributes" value="${cmr.connectionAttributes.cmr3}" /> </bean> (2 more EmbeddedXADataSource configured the same) <bean id="dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close"> <property name="uniqueResourceName" value="cmr3DataSource" /> <property name="xaDataSource" ref="${cmr.dbDataSourceBeanId.cmr3}" /> <property name="minPoolSize" value="${cmr.minPoolSize.cmr3}" /> <property name="maxPoolSize" value="${cmr.maxPoolSize.cmr3}" /> <property name="defaultIsolationLevel" value="${cmr.defaultIsolationLevel.cmr3}" /> </bean> (2 more AtomikosDataSourceBean configured the same) Then 3 LocalContainerEntityManagerFactoryBean configurations each using one of the 3 dataSource beans. As part of dbUnit configuration, I configure a DataSourceDatabaseTester with the dataSource: <bean id="databaseTester" class="org.dbunit.DataSourceDatabaseTester"> <constructor-arg ref="dataSource" /> <property name="tearDownOperation"> <util:constant static-field="org.dbunit.operation.DatabaseOperation.DELETE_ALL" /> </property> </bean> So Atomikos is serving up the connection, but is not in same transaction (?). I set transaction isolation to 1 (read uncommitted) in case that would help, but it does not. Can you think of anything else needed so that dbUnit will join the JTA transaction in progress? -----Original Message----- From: Zdeněk Vráblík [mailto:zd...@vr...] Sent: Monday, May 17, 2010 11:31 AM To: dbu...@li... Subject: Re: [dbunit-developer] dbUnit & JTA Hi, I was using JTA but not with DbUnit. The code between begin and commit /rollback of distributed transaction shouldn't contain any local transaction code ( commit, rollback, savepoints of connection). Some db drivers could throw exceptions if commit is called during transaction. I am using Bitronix in Tomcat as Distributed transaction manager. http://docs.codehaus.org/display/BTM/ The only difference when you are using distributed transaction is how the datasource is creating the connection. Getting connection is same as getting connection without using JTA. I think you could instantiate transactional manager. Configure datasource to be transactional and get connection. It is different class than without distributed transacton, but implements Connection interface. Than you could start global transaction. Instantiate the DbUnit connection public static DatabaseConnection getDbUnitConnection ( Connection jdbcConnection ) throws DatabaseUnitException { DatabaseConnection connection = new DatabaseConnection( jdbcConnection ); DatabaseConfig config = connection.getConfig(); config.setProperty( DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new Oracle10DataTypeFactory( jdbcConnection ) ); return connection; } perform any tests and than you could just rollback or commit the global transaction during or after your test. If the transaction manager is not instantiated and/or the connection is not configured to be part of distributed transaction than the connection is in autocommit mode. Regards, Zdenek On Mon, May 17, 2010 at 1:48 PM, Jeff Jensen <jj...@ap...> wrote: > Thanks for the reply and ideas, John. > > > > If I add a UserTransaction.commit() in the test, just before calling the > dbUnit verification, dbUnit sees the data (as one would expect!). I think > the issue is each connection has its own transaction vs a shared/global > one. I’m wondering if dbUnit needs some tweaks to support this… I will > also revisit the read_uncommited setting today. > > > > dbUnit needs to join the JTA transaction in progress and I thought this was > automatic per the spec when getting a connection from the same > datasource/any datasource managed by JTA. I configured dbUnit with the same > datasource, but something is not correct yet! > > > > > > > > From: John Hurst [mailto:joh...@gm...] > Sent: Monday, May 17, 2010 4:34 AM > To: dbu...@li... > Subject: Re: [dbunit-developer] dbUnit & JTA > > > > Jeff, > > No experience here using DbUnit with JTA, sorry. > > I believe it's possible for JPA findById() to return a result from the > identify map without hitting the database -- I am sure you have considered > this. > > Have you considered adding a JDBC logger to see what's going through your > JDBC driver? > > I've used p6spy several times in the past. > > I noticed a new one recently that I've been meaning to try: > > http://code.google.com/p/jdbcdslog/ > > JH > > On Mon, May 17, 2010 at 4:19 AM, Jeff Jensen <jj...@ap...> wrote: > > You guys have examples to have dbUnit use a datasource with JTA? > > We have a bunch of tests that have worked great with non-datasource (JDBC > connection/transaction), but recently needed to add 2 more connections to > the app/configuration, so I reconfigured for them and added JTA. > > The problem is, after converting to JTA, the dbUnit connection doesn't see > the changes in progress. I am using the same datasource Spring bean for the > app and dbUnit config. For example, if a test does a JPA persist then uses > dbUnit to compare with expected XML dataset, it fails because no row is > found in the database. If in the test I instead just do a JPA findById, it > of course finds it. > > I also experimented with isolation level to 1 and created a Spring pointcut > to apply Spring transactions to all dbUnit methods (!), but same result in > both cases. > > I've spent the weekend working on this conversion and have a lot working > now, and hoping one of you has an example/advice! > > > > ------------------------------------------------------------------------------ > > _______________________________________________ > dbunit-developer mailing list > dbu...@li... > https://lists.sourceforge.net/lists/listinfo/dbunit-developer > > > -- > Life is interfering with my game > > ------------------------------------------------------------------------------ > > > _______________________________________________ > dbunit-developer mailing list > dbu...@li... > https://lists.sourceforge.net/lists/listinfo/dbunit-developer > > ------------------------------------------------------------------------------ _______________________________________________ dbunit-developer mailing list dbu...@li... https://lists.sourceforge.net/lists/listinfo/dbunit-developer |