Cool. Nice solution!

Paul

2008/10/7 Harm Verhagen <[EMAIL PROTECTED]>

> 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
>
>
_______________________________________________
Esb-java-user mailing list
[email protected]
http://mailman.wso2.org/cgi-bin/mailman/listinfo/esb-java-user

Reply via email to