[mapguide-internals] RE: The pinned connection
UV
uvwild at googlemail.com
Sun Oct 25 09:17:58 EDT 2009
good. so if no previous RFC78 API needs continuation thats absolutely fine.
Is it appropriate to create a new RFC with references to the previous
RFC78 & RFC86?
I can do that if needed.
Haris Kurtagic wrote:
> +1
> Haris
>
> -----Original Message-----
> From: mapguide-internals-bounces at lists.osgeo.org
> [mailto:mapguide-internals-bounces at lists.osgeo.org] On Behalf Of Trevor
> Wekel
> Sent: Sunday, October 25, 2009 10:59 AM
> To: MapGuide Internals Mail List
> Subject: RE: [mapguide-internals] RE: The pinned connection
>
> I personally like
>
> conn = MgFeatureService.GetFeatureConnection(resourceId);
> conn.BeginTransaction();
> conn.CommitTransaction();
> conn.RollbackTransaction(); // I think rollback is a single word in database
> lingo
>
>
> I did a quick check and many databases do not support nested transactions so
> having a separate transaction object could lead to illegal use cases. From
> what I can tell, having a single transaction per connection is more "SQL"
> like and should be easier to support for all database providers.
>
> I'm sure an Fdo expert will jump in here and correct me if I'm wrong...
>
>
> Thanks,
> Trevor
>
>
> -----Original Message-----
> From: mapguide-internals-bounces at lists.osgeo.org
> [mailto:mapguide-internals-bounces at lists.osgeo.org] On Behalf Of UV
> Sent: October 24, 2009 5:59 AM
> To: MapGuide Internals Mail List
> Subject: Re: [mapguide-internals] RE: The pinned connection
>
> I have a proposal for further integration of RFC78 and RFC86.
> This just takes the one from Haris and adds a few more methods to stay
> compatible.
>
>
> I like an additional transaction object. With overloading this would
> support the original RFC78 as well (unless there is a SWIG limitation?)
> If MgTransaction is already implemented we can us it in the way below.
>
> This is better for the same reason as exposing the dedicated connection
> via the API as it makes the DB access code more explicit.
> This can be integrated like this and makes very clear and legible code:
>
> Full support also for renaming the connection to FeatureConnection or
> DedicatedFeatureConnection which seems more descriptive english.
>
> MgFeatureConnection conn = nullptr;
> MgTransaction tran = nullptr;
>
> try
> {
> conn = MgFeatureService.GetFeatureConnection(resourceId);
> conn.BeginTransaction(); // <--- added
> // or
> tran = conn.BeginTransaction(); // <--- minimal compatible change
> /// or
> tran = MgFeatureService.StartTransaction(resourceId);
> /// alternative from RFC78
>
> MgFeatureService.ExecuteSql(resourceId, sql statement1, conn);
> MgFeatureService.ExecuteSql(resourceId, sql statement2, conn);
> MgFeatureService.UpdateFeatures(resourceId,
> MgFeatureCommandCollection,conn);
>
> /// maybe the connection can be simply overloaded
> \/\/
> MgFeatureService.ExecuteSql(resourceId, sql
> statement1, tran);
> MgFeatureService.ExecuteSql(resourceId, sql
> statement2, tran);
> MgFeatureService.UpdateFeatures(resourceId,
> MgFeatureCommandCollection, tran);
>
> /// or if not overloaded (but then its not pretty
> anymore
> MgFeatureService.ExecuteSql(resourceId, sql
> statement1, null, tran);
> MgFeatureService.ExecuteSql(resourceId, sql
> statement2, null, tran);
> MgFeatureService.UpdateFeatures(resourceId,
> MgFeatureCommandCollection, null, tran);
>
> conn.CommitTransaction(); // <--- added
> tran.Commit(); /// alternative
>
> conn.Release();
> }
> catch(...)
> {
> conn.RollBackTransaction(); // <---- added
> if(nullptr != tran) tran.Rollback(); /// alternative
>
> }
>
>
> Trevor Wekel wrote:
>
>> I like this solution. It associates the transaction with the connection
>>
> and allows both the execute and the update to occur on the same connection
> with or without transaction support. It effectively rolls 2 RFCs into one.
>
>> I would personally prefer MgFeatureConnection over MgPinnedConnection
>>
> because the "Feature" connection is created from "Feature" service.
> MgConnection is ambiguous because MapGuide also opens TCP/IP connections
> from web tier to server.
>
>> MgFeatureConnectionNotAvailable would be an appropriate throw from
>>
> MgFeatureService.GetFeatureConnection()
>
>> -----Original Message-----
>> From: mapguide-internals-bounces at lists.osgeo.org
>>
> [mailto:mapguide-internals-bounces at lists.osgeo.org] On Behalf Of Haris
> Kurtagic
>
>> Sent: October 24, 2009 4:03 AM
>> To: 'MapGuide Internals Mail List'
>> Subject: RE: [mapguide-internals] RE: The pinned connection
>>
>> I was writing about just one solution ( I hope that my English doesn't add
>> some misunderstanding :) ).
>>
>> As you wrote first example is what I was suggesting for first RFC68.
>> If functionality for RFC78 is done (or is in plan) I would extend
>>
> connection
>
>> so you would start transaction on connection.
>> Then we would not have two parameters to ExecuteSql but just one.
>> I will try to explain in code, will just add to your first example :
>>
>> MgPinnedConnection conn = nullptr;
>> try
>> {
>> conn = MgFeatureService.GetPinnedConnection(resourceId);
>> conn.BeginTransaction(); // <--- added
>>
>> MgFeatureService.Update...
>> MgFeatureService.Update...
>> MgFeatureService.ExecuteSql(resourceId, sql statement1, conn);
>> conn.CommitTransaction(); // <--- added
>> MgFeatureService.ExecuteSql(resourceId, sql statement2, conn);
>> MgFeatureService.UpdateFeatures(resourceId,
>>
> MgFeatureCommandCollection,
>
>> conn);
>> conn.Release();
>> }
>> catch (NoPinnedConnectionAvailableException ex)
>> {
>> .
>> }
>>
>>
>> And I would have suggestion to change the name from MgPinnedConnection to
>> MgConnection or MgFdoConnection or... To me this pinn.. sounds unnecessary
>> it is just MG/FDO connection to underlying data source.
>>
>>
>> Haris
>>
>>
>> -----Original Message-----
>> From: mapguide-internals-bounces at lists.osgeo.org
>> [mailto:mapguide-internals-bounces at lists.osgeo.org] On Behalf Of Leaf Li
>> Sent: Saturday, October 24, 2009 2:40
>> To: mapguide-internals at lists.osgeo.org
>> Subject: [mapguide-internals] RE: The pinned connection
>>
>> Hi Haris,
>>
>> If my understanding is correct, you propose two solutions in our
>>
> discussion.
>
>> One is simpler. This solution will not affect MgTransaction.
>>
>> MgPinnedConnection conn = nullptr;
>> try
>> {
>> conn = MgFeatureService.GetPinnedConnection(resourceId);
>>
>> MgFeatureService.ExecuteSql(resourceId, sql statement1, conn);
>> MgFeatureService.ExecuteSql(resourceId, sql statement2, conn);
>> MgFeatureService.UpdateFeatures(resourceId,
>>
> MgFeatureCommandCollection,
>
>> conn);
>> conn.Release();
>> }
>> catch (NoPinnedConnectionAvailableException ex)
>> {
>> .
>> }
>>
>>
>> Another is in this way. It affects MgTransaction. So we have to change
>> current design of MapGuide RFC 78 - Enhance transaction capability to
>> Feature Service. For example, transaction isn't started, committed and
>> rollbacked by MgFeautreService. It is done by MgPinnedConnection.
>>
>>
>>
>>
>>> Conn1 = Open(FeatureSourceId)
>>> Execute SQL(Conn1,..)
>>> Open(Conn2)
>>> Execute SQL(Conn2,..)
>>> Open(Conn3)
>>> Conn3.StartTransaction()
>>> Conn3.Committ()
>>> Execute SQL(Conn3,..)
>>> Close(conn3)
>>> Close(Conn2)
>>> Close(Conn1)
>>>
>>>
>>
>>
>> For the second, it think it is the perfect way. I think you are talking
>> about the first solution in the email below. There are some issues for the
>> first solution. One of issues is how to execute a transaction against a
>> existing pinned connection? Maybe we need to add the following method.
>> Right?
>>
>> ExecuteSqlNonQuery(MgResourceIdentifier, string, MgTransaction,
>> MgPinnedConnection)
>>
>> However, MgTransaction already occupies a connection when calling
>> FeatureService::BeginTransaction(.). How do we handle them in this time?
>>
>> So if we want to return a MgPinnedConnection object to users, we should
>>
> use
>
>> the second solution to start a transaction instead of
>> FeatureService::BeginTransaction(.).
>>
>> Thanks,
>> Leaf Li
>>
>>
>>
>>> Hi Li,
>>>
>>> I think that more work is needed for API as proposed in RFC because there
>>>
>>>
>> is
>>
>>
>>> functionality around pinning and unpinning connections and keeping track
>>>
> of
>
>>> those. All functionality for the solution I would prefer is already
>>>
> there,
>
>>> it is just about the way how is it exposed.
>>>
>>> It does changes API but in same way as it changes with transaction RFC78.
>>> My suggestion would be just to change that one and instead of adding
>>> transaction as new parameter add connection. And then on connection just
>>>
>>>
>> use
>>
>>
>>> transaction functionality which was developed for RFC78.
>>>
>>>
>> Haris_______________________________________________
>> mapguide-internals mailing list
>> mapguide-internals at lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/mapguide-internals
>>
>> _______________________________________________
>> mapguide-internals mailing list
>> mapguide-internals at lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/mapguide-internals
>>
>>
>> _______________________________________________
>> mapguide-internals mailing list
>> mapguide-internals at lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/mapguide-internals
>>
>>
>>
>
> _______________________________________________
> mapguide-internals mailing list
> mapguide-internals at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/mapguide-internals
>
>
> _______________________________________________
> mapguide-internals mailing list
> mapguide-internals at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/mapguide-internals
>
> _______________________________________________
> mapguide-internals mailing list
> mapguide-internals at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/mapguide-internals
>
>
More information about the mapguide-internals
mailing list