I found a solution.
fix:
use a mysql store procedure that creates a new entry and returns the
LAST_INSERT_ID().
Then from a dblookup() mediator call this procudure and store the result.
*mysql example code:*
DELIMITER $$
DROP PROCEDURE IF EXISTS create_transaction $$
CREATE PROCEDURE create_transaction (
IN token VARCHAR(36),
IN ip VARCHAR(15),
IN transaction_type INT)
BEGIN
insert into transaction(token,ip,transaction_type) values (token,
ip,transaction_type );
select LAST_INSERT_ID();
END $$
DELIMITER ;
*dblookup example code*
<syn:dblookup>
<syn:connection>
<syn:pool>
<syn:property name="validationquery" value="select 1"/>
<syn:driver>com.mysql.jdbc.Driver</syn:driver>
<syn:property name="testonborrow" value="true"/>
<syn:property name="testwhileidle" value="true"/>
<syn:password>esb</syn:password>
<syn:user>esb</syn:user>
<syn:url>jdbc:mysql://localhost:3306/esb</syn:url>
</syn:pool>
</syn:connection>
<syn:statement>
<syn:sql><![CDATA[call
create_transaction(?,?,?)]]></syn:sql>
<syn:parameter expression="get-property('token')"
type="VARCHAR"/>
<syn:parameter
expression="get-property('axis2','REMOTE_ADDR')" type="VARCHAR"/>
<syn:parameter expression="get-property('transaction_type')"
type="INTEGER"/>
<syn:result name="transaction_id" column="1"/>
</syn:statement>
</syn:dblookup>
*access the id with*
get-property('transaction_id')
On Tue, Oct 7, 2008 at 3:15 PM, Harm Verhagen <[EMAIL PROTECTED]>wrote:
> 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