The problem is a bit worse than I thought. I cant find _any_ reliable way to find the id of a newly created row. (I want to know it so I can update the row in the 'out' sequence).
The (but-ugly) workaround I thought I had... only works when issuing single request. Whenever I stress the bus (10 threads simultaniously) the workaround fails. The workaround is described in [1] problem: sql statement 1 and 2 in the workaround are _not_ always done by the same connections. sometimes the 2nd one uses a new mysql connection from the pool resulting in a pretty subtle problem. (LAST_INSERT_ID() gives the _wrong_ number, causing me to update the incorrect row !! Anyone can think of a solution, workaround ? Regards, Harm - [1] http://wso2.org/mailarchive/esb-java-user/2008-October/000935.html Regards, Harm 2008/10/2 Indika Kumara <[EMAIL PROTECTED]> > Hi Paul > > No... current DB report is only do add/update operation. It seems it is > helpful to provide lasted inserted record identity. > So we need new abstraction as an extension to the existing one- DB report > with return value. > Return value will be another statement so that it can be configured for > database specific ways. > Thanks > Indika > > Paul Fremantle wrote: > > Indika > > Shouldn't we always grab the return from the report into a fixed property? > > Paul > > Harm Verhagen wrote: > > > filed as:https://issues.apache.org/jira/browse/SYNAPSE-457 > > 2008/10/2 Indika Kumara <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]> <[EMAIL > PROTECTED]>> > > Hi Harm > > Yes, Harm, you are correct. With using current DB report , DB lookup > combination , there is no thread safe manner (clear) to retrieve > latest insert record's identity other than workarounds such as you did. > It may need a new abstraction, a DB report with return value > (Currently, DB report has void behavior), where return value can be > explicitly specify by a separate statement. > > It is great, if you could create a JIRA for this as an improvement. :-) > > Thanks > Indika > > Harm Verhagen wrote: > > > Hi, > > I am seeing a similar problem when using mysql as db backend. > /How to get the ID of a NEWLY INSERTED ROW ?/ > > *problem:* > - I insert a new fow in a table with the dbreport module. It > gets a new id. (it is an AUTO_INCREMENT variable). > - further in my sequence, and in the 'out' sequence I need to > update that row in the table, using the id. > I couldn't find a clean (and threadsafe!!!) way to get the newly > created id with wso2. > > The wso2 samples don't address this problem. > > mysql provides a function LAST_INSERT_ID() to get the newly > inserted ID. However that can only be used in the *_same_* > transaction. > So I can use LAST_INSERT_ID() in the _same_ dbreport module (as > 2nd or 3rd sql statement). However dbreport mediator CANNOT save > this to a variable. (only dblookup can). > A following dblookup mediator can however NOT use > LAST_INSERT_ID() (it always returns zero, as this is a new db > transaction). > dblookup could do some MAX like magic... but thatis not threadsafe. > > *workaround* > I found a (but-ugly) workaround: > dbreport: > sql1: insert into ..... (store my new row... > creates a new ID). > sql2: insert into transaction_uuid(id, uuid) > values(LAST_INSERT_ID(),?) > param: > get-property('MessageID') (store the newly > created ID in a new temp table, using the uuid of the message) > dblookup: select id from transaction_uuid where uuid = ? > param: get-property('MessageID') > result: > transaction_id ( read the newly > created id from the temp table, store it in a variable). > dbreport: delete from transaction_uuid where id = ? > param: get-property('transaction_id') > (delete the temp table). > > >From here on I can use get-property('transaction_id') to update > the row in the same sequence, (and in the answer sequence). > > I would expect however that I can do the above with _one_ single > dbreport mediator. Insert the new field, and store the id in > set-property('transaction_id'). > I didn't measure my workaround but it must be slow. (the hole > temp table should be unneeded, the above contains 3 unneeded db > accesses and 2 unneeded mediators). > > Do you see any way how wso2 could cleanly support this ? (Maybe > an extension to the dbreport module ?) > > Regards, > Harm > > > 2008/10/2 Indika Kumara <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]> > <[EMAIL PROTECTED]>> > > Here, you had done two wrongs > > 1) The IDENTITY_VAL_LOCAL function has no input > parameters. But, you have tried to set parameters – That is > why you get exception. > > 2) You have called it in db report mediator. DB report > mediator use to add /update record …simply uses > executeUpdate(). But values IDENTITY_VAL_LOCAL() is for > retrieving latest inserted record identity and will throws > errors. > > Please use values IDENTITY_VAL_LOCAL() with DB LookUp > mediator > > Thanks > Indika > > Schmilinsky, Remsy wrote: > > > Thanks. I am trying to get the generated id after insert, I'm > using derby, with 'values IDENTITY_VAL_LOCAL()' in a > second sql but doesn't work, are these incompatible functions ? > > 2008-10-01 13:47:14,790 [169.254.7.221-WH24CU6052] > [jms-Worker-1] ERROR DBReportMediator Error execuring insert > statement : values IDENTITY_VAL_LOCAL() against DataSource : > jdbc:derby://localhost:1527/esbdb;create=false > java.sql.SQLException: The column position '1' is out of > range. The number of columns for this ResultSet is '0'. > at > org.apache.derby.client.am.SQLExceptionFactory.getSQLException(Unknown > Source) > at > org.apache.derby.client.am.SqlException.getSQLException(Unknown > Source) > at > org.apache.derby.client.am.ColumnMetaData.getColumnType(Unknown > Source) > > the insert statement alone works though. > > here dbreport config, for the moment I assign value 1 to test > it out: > > <syn:dbreport> > <syn:connection> > <syn:pool> > > <syn:driver>org.apache.derby.jdbc.ClientDriver</syn:driver> > <syn:password>esb</syn:password> > <syn:user>esb</syn:user> > > <syn:url>jdbc:derby://localhost:1527/esbdb;create=false</syn:url> > </syn:pool> > </syn:connection> > <syn:statement> > <syn:sql><![CDATA[insert into sample values > (DEFAULT, ?)]]></syn:sql> > <syn:parameter > xmlns:ns1="http://org.apache.synapse/xsd" > <http://org.apache.synapse/xsd> > xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" > <http://schemas.xmlsoap.org/soap/envelope/> > expression="//*/*" type="VARCHAR"/> > </syn:statement> > <syn:statement> > <syn:sql><![CDATA[values > IDENTITY_VAL_LOCAL()]]></syn:sql> > <syn:parameter value="1" type="INTEGER"/> > </syn:statement> > </syn:dbreport> > > remsy > > -----Original Message----- > *From:* [EMAIL PROTECTED] > <mailto:[EMAIL PROTECTED]> <[EMAIL PROTECTED]> > [mailto:[EMAIL PROTECTED] <[EMAIL PROTECTED]>]*On Behalf Of > *Indika Kumara > *Sent:* October 1, 2008 1:21 PM > *To:* [email protected] <mailto:[email protected]> > <[email protected]> > *Subject:* Re: [esb-java-user] dbreport question > > Hi Remsy > > All the samples in [1] show a scenario somewhat similar > to your scenario (I believe). In those samples, get an ID > from DB and set it as message context property > and then perform conditional switching based on the value > of that property. On the out path, some result form > response is stored in the DB too. > By going through [2], it will be easy to understand the > current behavior of the DB -mediators > > > [1] > > http://wso2.org/project/esb/java/1.7.1/docs/ESB_Samples.html#DBMediators > > [2] > > http://wso2.org/project/esb/java/1.7.1/docs/ESB_Configuration_Language.html#dblookup > > > Thanks > Indika > > Schmilinsky, Remsy wrote: > > > I need ro propagate the result of a query (id number) from > dbreport to the mediators along with the message. > > The idea is that the mediators will perform some actions on the > message and then log results in the db, so we need the id to reference the > original data. > > is this possible ? how ? > > thanks > > Remsy > > _______________________________________________ > Esb-java-user mailing list > [email protected] <mailto:[email protected]> > <[email protected]> > http://mailman.wso2.org/cgi-bin/mailman/listinfo/esb-java-user > > ------------------------------------------------------------------------ > > > No virus found in this incoming message. > Checked by AVG - http://www.avg.com > Version: 8.0.173 / Virus Database: 270.7.5/1698 - Release Date: > 9/29/2008 7:25 PM > > > > > > ------------------------------------------------------------------------ > _______________________________________________ Esb-java-user > mailing list [email protected] > <mailto:[email protected]> <[email protected]> > http://mailman.wso2.org/cgi-bin/mailman/listinfo/esb-java-user > > ------------------------------------------------------------------------ > > > No virus found in this incoming message. > Checked by AVG - http://www.avg.com > Version: 8.0.173 / Virus Database: 270.7.5/1698 - Release Date: > 9/29/2008 7:25 PM > > > > > _______________________________________________ > Esb-java-user mailing list > [email protected] <mailto:[email protected]> > <[email protected]> > http://mailman.wso2.org/cgi-bin/mailman/listinfo/esb-java-user > > > ------------------------------------------------------------------------ > _______________________________________________ Esb-java-user > mailing list [email protected] > <mailto:[email protected]> <[email protected]> > http://mailman.wso2.org/cgi-bin/mailman/listinfo/esb-java-user > ------------------------------------------------------------------------ > > > No virus found in this incoming message. > Checked by AVG - http://www.avg.com > Version: 8.0.173 / Virus Database: 270.7.5/1698 - Release Date: 9/29/2008 > 7:25 PM > > > > > _______________________________________________ > Esb-java-user mailing list > [email protected] <mailto:[email protected]> > <[email protected]> > http://mailman.wso2.org/cgi-bin/mailman/listinfo/esb-java-user > > > > ------------------------------------------------------------------------ > > _______________________________________________ > Esb-java-user mailing [EMAIL > PROTECTED]://mailman.wso2.org/cgi-bin/mailman/listinfo/esb-java-user > > ------------------------------ > > > No virus found in this incoming message. > Checked by AVG - http://www.avg.com > Version: 8.0.173 / Virus Database: 270.7.5/1698 - Release Date: 9/29/2008 > 7:25 PM > > > > > > _______________________________________________ > Esb-java-user mailing list > [email protected] > http://mailman.wso2.org/cgi-bin/mailman/listinfo/esb-java-user > >
_______________________________________________ Esb-java-user mailing list [email protected] http://mailman.wso2.org/cgi-bin/mailman/listinfo/esb-java-user
