"with large datasets, we see a lag in the transport time over our web service. For example, we have a data set that returns 5000 rows of 125 columns of data...our T-SQL stored proc generates the data set in 6 seconds or less but then it still takes anywhere from 45s to 1.5m to transport that dataset to the client side...and that's over a fast connection..."
This is exactly one of the reasons to use AMF on the wire. Serialization of 5000 records with WebORB would take only a sub-second of time. Mark --- In flexcoders@yahoogroups.com, Adrian Williams <adri...@...> wrote: > > Hi there... > > We have a rather large RIA using C#.Net as the backend...and we have > a large number of arrayCollections and dataGrids/advancedDataGrids.... > > We don't massage any of the data that we are passing with our web > services...we literally pass as as it's created...i.e. as an Array or as > a Object... > > For example, we may have an AdvancedDataGridthat is asking for data > from our web service...in our .net code we'd simply have something like: > > public List<MainClass> BuildTheArray(string Group, string Admin) > { > List<MainClass> configs = new List<MainClass>(); > > SqlParameters[] sqlParams = new SqlParameters[2]; > > sqlParams[0] = new SqlParameter("@Group", Group); > sqlParams[1] = new SqlParameter("@Admin", Admin); > > try > { > using (SqlDataReader dr = > (SqlDataReader)DB.Instance().ExecuteReader("main_stored_procedure", > sqlParams)) > { > while (dr != null && dr.Read()) > { > configs.Add(new MainClass( > Convert.ToString(dr["Name"]), > Convert.ToString(dr["Email"]), > etc... > } > } > } > return configs; > } > > Then in our Flex webservice def, we are defining the result as > "Object" (which I've seen a number of folks sugges E4X, but I've not > delved into the pros/cons of this). > > <mx:operation name="GetConfigs" resultFormat="object" > result="getConfigsResult(event)" /> > > Now, since it's an object, in our web service result handler, you > can cast it a number of ways, but for the list as created above on the > .net side and since we are putting this data in an AdvancedDataGrid, we > simply say: > > private function getConfigsResult(event:ResultEvent):void > { > configs = event.result as ArrayCollection; > ourDataGrid.dataProvider = configs; > } > > Generally speaking, out of the 100+ web service calls we have, any > that return any kind of dataset we cast directly as an Array, > ArrayCollection or Object. > > Now that said, we have seen something that is aggravating...with > large datasets, we see a lag in the transport time over our web > service. For example, we have a data set that returns 5000 rows of 125 > columns of data...our T-SQL stored proc generates the data set in 6 > seconds or less but then it still takes anywhere from 45s to 1.5m to > transport that dataset to the client side...and that's over a fast > connection...then, once it's in the client side, depending on how much > custom rendering we are doing, it takes up to 10-15 sec's to render the > data. So we have a bottleneck in our web service that causes a lengthy > delay on large data sets....we are still researching on why this is > happening and the fix but just wanted to let you know as a heads up. > > -HTH > -adrian > > > > Sam Lai wrote: > > > > > > Considering the time required for serialization/deserialization, using > > something like webORB would improve parsing time, as it uses a binary > > format which can be parsed more easily than a text format. But unless > > you're using large datasets/doing lots of web service calls, the > > advantages are probably negligible. > > > > Are you transmitting everything in the array collection back to the > > web service, or just the IDs of the selected rows? Transferring > > everything including the row data would remove the need for another > > database hit, but for large datasets, that could be quite a bit of > > traffic. I'd say it would be better just to transmit the IDs back to > > the webservice, and let the webservice hit the database for the row > > data (some caching on the server-side would help too). > > > > 2009/6/8 Angelo Anolin <angelo_ano...@... > > <mailto:angelo_anolin%40yahoo.com>>: > > > > > > > > > > > > Hi Sam, > > > > > > Thanks for your reply. > > > > > > As of now, I actually prefer to utilize what I know on .NET and what > > I am > > > learning on Flex. Adding another utility (Web Orb) in my learning > > process > > > may complicate things a bit. I might consult this later if I feel > > that the > > > needs for is getting tremendous. > > > > > > Anyway, I am actually able to generate the report from what I am > > currently > > > doing (no error encountered), where the ArrayCollection I am parsing > > into a > > > delimited string, passing the string to the webservice call, and > > letting the > > > webservice de-serialize the string to populate a Crystal report document > > > which I subsequentlt display in another browser window which I call > > from the > > > Flex application. > > > > > > I mentioned that I did not feel it is the "BEST" way because I am > > literally > > > storing all datagrid (report) information in a string variable. > > Assuming > > > for example that the data displayed in the datagrid is quite huge, then > > > creating the delimited string would take some time and additional > > processing > > > time could also be consumbed by the back end web service to parse > > the string > > > and populate the report. > > > > > > As of now, this is what the application does. > > > 1. Flex App calls a webservice to retrieve data. > > > 2. WebService responds by sending back a dataset which is returned as a > > > string (via Dataset.GetXML method of .NET). > > > 3. Flex App gets the service response, converts the string into an XML. > > > 4. Flex App converts the XML data into an ArrayCollection which is > > bound to > > > the datagrid. > > > * Please note that I used array collection here for the search/filter > > > functionality of the datagrid. > > > 5. When generating print out of the data displayed in the datagrid, Flex > > > would then serialize the ArrayCollection into a delimited string and > > send it > > > to the web service. > > > 6. Web Service would then de-serialize (or parse) the string, populate a > > > .NET dataset which is the datasource for the Crystal report. > > > 7. Crystal report is bound and PDF report is generated. > > > 8. Flex displays via external javascript call the PDF report generated. > > > > > > Is there a better way for the ArrayCollection to be sent to the > > webservice, > > > the webservice in turn would just convert it to dataset and the > > dataset is > > > immediately bound to the Crystal report? > > > > > > Thanks. > > > > > > Regards, > > > > > > Angelo > > > ________________________________ > > > From: Sam Lai <samuel....@... <mailto:samuel.lai%40gmail.com>> > > > To: flexcoders@yahoogroups.com <mailto:flexcoders%40yahoogroups.com> > > > Sent: Monday, 8 June, 2009 8:49:36 > > > Subject: Re: [flexcoders] Flex and .NET > > > > > > 2009/6/8 Angelo Anolin <angelo_anolin@ yahoo.com>: > > > > > >> I feel that this is probably not the "BEST" way of doing this. I tried > > >> initially to pass an XML delimmited string, but .NET seems to read XML > > >> differently( ?) from Flex. > > > > > > I'd say XML would be a good way of doing it. What kind of errors are > > > you getting, and how are you making the web service call? > > > > > > The other option is to use AMF, a native messaging format for > > > Flash/Flex. This I believe would save you the effort of serializing > > > and deserializing - it does it for you, among other things. > > > > > > http://www.themidni ghtcoders. com/products/ weborb-for- > > net/overview. html > > > > > > > > > > > > > > > > >