« Return to Thread: help with jdbc transaction
Mario/Andrew,
I’ve have also had problems recently
with JDBC and XA and I think that Mario will have other problems even he uses a
XADataSource.
There appears to be a bug in JdbcConnector
that means that the XADataSource never gets enlisted in the transaction. I’ve
tracked this down to the following method in JdbcConnector:
public
void setDataSource(DataSource dataSource)
{
this.dataSource
= dataSource;
}
In order to get XA working I’ve
changed this method to:
public
void setDataSource(DataSource dataSource)
{
if
(dataSource != null && dataSource instanceof XADataSource)
{
if
(MuleManager.getInstance().getTransactionManager() != null)
{
this.dataSource
= new DataSourceWrapper((XADataSource)dataSource,
MuleManager.getInstance().getTransactionManager());
}
}
else
{
this.dataSource
= dataSource;
}
}
I also had to change the doReceive method
in JdbcMessageDispatcher as it ignores the transaction at the minute:
protected UMOMessage
doReceive(UMOImmutableEndpoint endpoint, long timeout) throws Exception
{
if (logger.isDebugEnabled())
{
logger.debug("Trying to receive a message with a timeout of " +
timeout);
}
String[] stmts = this.connector.getReadAndAckStatements(endpoint);
String readStmt = stmts[0];
String ackStmt = stmts[1];
List readParams = new ArrayList();
List ackParams = new ArrayList();
readStmt = connector.parseStatement(readStmt, readParams);
ackStmt = connector.parseStatement(ackStmt, ackParams);
Connection con = null;
long t0 = System.currentTimeMillis();
// SM Get the transaction
UMOTransaction tx = TransactionCoordination.getInstance().getTransaction();
try
{
con = this.connector.getConnection();
if (timeout < 0)
{
timeout = Long.MAX_VALUE;
}
Object result;
do
{
result = connector.createQueryRunner().query(con, readStmt,
connector.getParams(endpoint, readParams, null),
connector.createResultSetHandler());
if (result != null)
{
if (logger.isDebugEnabled())
{
logger.debug("Received: " + result);
}
break;
}
long sleep = Math.min(this.connector.getPollingFrequency(),
timeout - (System.currentTimeMillis() - t0));
if (sleep > 0)
{
if (logger.isDebugEnabled())
{
logger.debug("No results, sleeping for " + sleep);
}
Thread.sleep(sleep);
}
else
{
logger.debug("Timeout");
return null;
}
}
while (true);
if (ackStmt != null)
{
int nbRows = connector.createQueryRunner().update(con, ackStmt,
connector.getParams(endpoint, ackParams, result));
if (nbRows != 1)
{
logger.warn("Row count for ack should be 1 and not " + nbRows);
}
}
UMOMessageAdapter msgAdapter = this.connector.getMessageAdapter(result);
UMOMessage message = new MuleMessage(msgAdapter);
//
SM Check if we’re in a transaction
if (tx == null)
{
JdbcUtils.commitAndClose(con);
}
return message;
}
catch (Exception e)
{
//
SM Check if we’re in a transaction
if (tx == null)
{
JdbcUtils.rollbackAndClose(con);
}
throw e;
}
}
Stephen
From: Andrew
Perepelytsya [mailto:aperepel@...]
Sent: 06 March 2007 17:58
To: user@...
Subject: Re: [mule-user] help with
jdbc transaction
****** This Message Originated From The Internet Please Be
Aware Of Suspicious Attachments And Content ******
You have to use
XADataSource for XA transactions.
Andrew
On 3/6/07, mario.sala
<mario.mule@... > wrote:
how to use jdbc with transaction but without a aplication server ??
i use jotm like transaction manager
transaction-manager
factory="org.mule.extras.jotm.JotmTransactionManagerFactory"></transaction-manager>
my application context is correct?
<beans>
<bean id="muleJdbcDatasource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="shutdown">
<property
name="driverClassName"
value=" net.sourceforge.jtds.jdbc.Driver" />
<property
name="url"
value="jdbc:jtds:sqlserver://localhost/EsbusMule" />
<property
name="username" value="sa" />
<property
name="password" value="123" />
</bean>
</beans>
my mule descriptor is correct? im use
org.mule.transaction.XaTransactionFactory is that ok
<mule-descriptor name="TestJdbcUMO"
implementation="org.mule.components.simple.BridgeComponent">
<inbound-router>
<endpoint address="stream://System.in">
<properties>
<property name="promptMessage"
value="Please enter text...: " />
</properties>
</endpoint>
</inbound-router>
<outbound-router>
<router
className="org.mule.routing.outbound.MulticastingRouter">
<endpoint address="jdbc://insertRecord"
connector="jdbcConnector">
<transaction action="ALWAYS_JOIN"
factory="org.mule.transaction.XaTransactionFactory"/>
</endpoint>
<endpoint address="jdbc://insertRecord2"
connector="jdbcConnector">
<transaction action="ALWAYS_JOIN"
factory="org.mule.transaction.XaTransactionFactory"/>
</endpoint>
<transaction action="ALWAYS_BEGIN"
factory="org.mule.transaction.XaTransactionFactory"/>
</router>
</outbound-router>
</mule-descriptor>
</mule-configuration>
my connector is:
<connector name="jdbcConnector"
className="org.mule.providers.jdbc.JdbcConnector ">
<properties>
<container-property name="dataSource"
reference="muleJdbcDatasource"
required="true" />
<map name="queries">
<property name="insertRecord"
value="INSERT into Testing (description)
VALUES (${pname},${payload})" />
<property name="insertRecord2"
value="INSERT into Testing2 (datasmall)
VALUES (${payload})" />
</map>
</properties>
</connector>
my problem is that with this configuration my messages do not transaction
and always execute commint, even though in insertRecord2 it happens an error
Thanks for its aid
--
View this message in context: http://www.nabble.com/help-with-jdbc-transaction-tf3356647.html#a9335676
Sent from the Mule - User mailing list archive at Nabble.com.
---------------------------------------------------------------------
To unsubscribe from this list please visit:
http://xircles.codehaus.org/manage_email
« Return to Thread: help with jdbc transaction
| Free embeddable forum powered by Nabble | Forum Help |