huge bandwidth usage of smart client

We are almost finished a large application using Servoy Smart Client (currently 3.5.7). In the last tests, I noticed some performance issues so I monitored several things, among them I monitored bandwidth used by the smart client and I came up with a great surprise: Smart Client uploads far more data than it downloads!!! And I mean “far more”…

The test is simple, I enter the main window of our application and I start navigating records up and down without exiting the same form and the results are kind of amazing:

Navigating from record 1 to record 20 using custom navigation arrows (up-right on the window)
Uploaded data: 1.26 MB
Downloaded data: 263.2 KB

[attachment=1]mainForm.jpg[/attachment]
[attachment=2]consumo.jpg[/attachment]
[attachment=0]bandwidth2.jpg[/attachment]

Going back from record 20 to record 1 using custom navigation arrows (up-right on the window)
Uploaded data: 1.11 MB
Downloaded data: 238.6 KB

This is a big issue because more than 10 clients navigating records would cause a bandwidth consumption of more than 2MB/s

The form has some logic on the nextRecord/previousRecord/recordSelection, but this shouldn’t be a problem, should it?. I thought that with Smart Client application logic was executed on client (though calls to server had to be made somewhere), but it seems that the client sends a lot of information so the server execute data…

I’ve used Microsoft Network Monitor to inspect TCP packets sent between client and server and It seems that with every time a click on the navigation arrow several packets send this info:

..K°OZ..ÂÜ.x..E...þë@.?..{À¨º*À¨º..l.Kèd.e?ÑÓP.ÿêA1..P¬í..w"£ôò-.®?.ÍT¢^....yF.ð?.ÿÿÿÿsíl.=?..t.$dd260149-d1cf-4d43-9c5e-5d052e4208d4t..ivi_gcq.~..psr.-com.servoy.j2db.util.serialize.ReplacedObjectm\2ò¦æí?...S..aL..dot..Ljava/lang/String;L..fort..Ljava/lang/Object;t.´http://serverequipo2:8080/lib/j2db.jar http://serverequipo2:8080/lib/js.jar http://serverequipo2:8080/lib/BrowserLauncher2.jar http://serverequipo2:8080/lib/commons-logging.jar http://serverequipo2:8080/lib/MRJAdapter.jar http://serverequipo2:8080/beans/molecule.jar http://serverequipo2:8080/beans/datasetgrid.jar http://serverequipo2:8080/beans/DndDBTreeView.jar http://serverequipo2:8080/beans/foundsetgrid.jar http://serverequipo2:8080/beans/htmlbean.jar http://serverequipo2:8080/beans/it2be-calendarbean.jar http://serverequipo2:8080/beans/swingbeans.jar http://serverequipo2:8080/beans/s11_chart.jar http://serverequipo2:8080/beans/IClock.jar http://serverequipo2:8080/beans/datagrid.jar http://serverequipo2:8080/beans/dbtreeview.jar http://serverequipo2:8080/lafs/skinlf.jar http://serverequipo2:8080/lafs/kunststoff.jar http://serverequipo2:8080/lafs/tinylaf.jar http://serverequipo2:8080/plugins/default_validators.jar http://serverequipo2:8080/plugins/xmlreader.jar http://serverequipo2:8080/plugins/rawSQL.jar http://serverequipo2:8080/plugins/images.jar http://serverequipo2:8080/plugins/images/jai_imageio.jar http://serverequipo2:8080/plugins/images/metadataextractor.jar http://serverequipo2:8080/plugins/dialog.jar http://serverequipo2:8080/plugins/dateUtils.jar http://serverequipo2:8080/plugins/drmaison-lib/support.jar http://serverequipo2:8080/plugins/tabxport.jar http://serverequipo2:8080/plugins/scheduler.jar http://serverequipo2:8080/plugins/scheduler/quartz.jar http://serverequipo2:8080/plugins/excelxport.jar http://serverequipo2:8080/plugins/jakarta-poi/jakarta-poi.jar http://serverequipo2:8080/plugins/udp.jar http://serverequipo2:8080/plugins/mail.jar http://serverequipo2:8080/plugins/serialize.jar http://serverequipo2:8080/lib/slf4j-api.jar http://serverequipo2:8080/lib/client/slf4j-jdk14.jar http://serverequipo2:8080/plugins/serialize/jabsorb-1.2.2.jar http://serverequipo2:8080/plugins/ivi_popupmenu.jar http://serverequipo2:8080/plugins/file.jar http://serverequipo2:8080/plugins/pdf_output.jar http://serverequipo2:8080/plugins/pdf_output/itext.jar http://serverequipo2:8080/plugins/pdf_output/bcmail-jdk14-135.jar http://serverequipo2:8080/plugins/pdf_output/bcprov-jdk14-135.jar http://serverequipo2:8080/plugins/it2be-calendar.jar http://serverequipo2:8080/plugins/it2be-runtime/calendar-runtime.jar http://serverequipo2:8080/plugins/it2be-lib/migcalendarbean.jar http://serverequipo2:8080/plugins/it2be-lib/ical4j.jar http://serverequipo2:8080/plugins/it2be-server.jar http://serverequipo2:8080/plugins/it2be-updatemanager.jar http://serverequipo2:8080/plugins/it2be-lib/it2be-helper.jar http://serverequipo2:8080/plugins/it2be-lib/it2be-keys.jar http://serverequipo2:8080/plugins/it2be-lib/it2be-utilities.jar http://serverequipo2:8080/plugins/it2be-runtime/server-runtime.jar http://serverequipo2:8080/plugins/drmaison.jar http://serverequipo2:8080/plugins/drmaison-lib/servoy3support.jar http://serverequipo2:8080/plugins/drmaison-lib/servoy35support.jar http://serverequipo2:8080/plugins/drmaison-lib/servoy4support.jar http://serverequipo2:8080/plugins/it2be-tools.jar http://serverequipo2:8080/plugins/spellcheck.jar http://serverequipo2:8080/plugins/spellcheck/RapidSpell.jar http://serverequipo2:8080/plugins/spellcheck/RapidSpell_US_UK_Dict.jar http://serverequipo2:8080/plugins/jasperPluginRMI.jar http://serverequipo2:8080/plugins/jasperPluginRMI/commons-beanutils.jar http://serverequipo2:8080/plugins/jasperPluginRMI/commons-collections.jar http://serverequipo2:8080/plugins/jasperPluginRMI/commons-digester.jar http://serverequipo2:8080/plugins/jasperPluginRMI/commons-javaflow.jar http://serverequipo2:8080/plugins/jasperPluginRMI/itext.jar http://serverequipo2:8080/plugins/jasperPluginRMI/jasperreports.jar http://serverequipo2:8080/plugins/jasperPluginRMI/jdt-compiler.jar http://serverequipo2:8080/plugins/popupmenu.jar http://serverequipo2:8080/plugins/ivi_ldaplogin.jar http://serverequipo2:8080/plugins/kioskmode.jar http://serverequipo2:8080/plugins/ivi_valuelist.jar http://serverequipo2:8080/plugins/http.jar http://serverequipo2:8080/lib/commons-httpclient.jar http://serverequipo2:8080/lib/commons-codec.jar http://serverequipo2:8080/plugins/agent.jar http://serverequipo2:8080/plugins/amortization.jarxp..t..Qur..[Ljava.lang.Object;ÎX?.s)l...pxp....sq.~....q.~..t..TB_PERSONAsr..java.util.ArrayListxÒ.?Ça...I..sizepxp....w.....sq.~....q.~..uq.~......sr..java.lang.Integer.â ¤÷?8...I..valuepxr..java.lang.Number?¬?..?à?...pxp....sq.~....q.~..uq.~......sq.~......pt..nxsr..java.lang.Byte?N`?îPõ....B..valuepxq.~...sr..java.util.HashMap..ÚÁÃ.`Ñ...F..loadFactorI..thresholdpxp?@......w.........t..FILTERsq.~....q.~..sq.~......w.....sq.~....q.~..uq.~......ur..[IMº`&vê²¥...pxp........uq.~......sq.~....q.~..uq.~......q.~..sq.~....¶.ur..[[Ljava.lang.Object;.¿ûSäkÛÊ...pxp....uq.~......sr..java.lang.Long;?äÌ#ß...J..valuepxq.~..........sr..java.lang.BooleanÍ r?Õ?úî...Z..valuepxp.xxpppw..........

I’ve also noted that every user_query is sent to the server (so it could process it I guess). Maybe this is also increasing uploaded data… However I’d like to understand better what is causing this huge traffic and if there is anything I could do to reduce it.

Thanks!!

So to make sure that i understand

the thing you display in the area what is send, is send Everytime a query is done?

What do you show on the simple form just 1 record with no related data or is there also related data loaded?

jcompagner:
So to make sure that i understand

the thing you display in the area what is send, is send Everytime a query is done?

What do you show on the simple form just 1 record with no related data or is there also related data loaded?

Johan, the “jars” info is sent several times (I’ve counted 7 or more) each time I change the current record.

The form shows some related data (about 2-3 relations) and there’s also some logic that uses custom querys.

Maybe the problem is on using custom querys, I’ve notice that the query is also sent to the server, however, the TCP packet sending each query is between 300 and 400 bytes so they shouldn’t be a problem. What I don’t get is why that info about every jar is sent several times, (the TCP packet is about 6KB!!!).

Just to be sure, I’ve tested with the sample CRM solution and the upload data is stills higher than the downloaded one (which is kind of nonsense) and it also sends all the jars ULRs to the server several times. I think this info is redundant (the server knows the jars it hosts) and should not be sent up to the server everytime…

I hope there’s some configuration I’m doing bad so I won’t need to change my code, but I’m starting to thing it’s not going to be that easy… :?

Thanks a lot for your quick answer!

Ok we did investigate this problem pretty hard and the end result is that it is fixed only in the latest java 6 version (update 10)
Then webstart client will not serve all the jars it loads from the server back to the server as a classpath string.

we cant really do anything to work around it in older version of java(webstart).