There are two ways of fetching an MboSet in java code, either using a relationship or through MXserver. There are different benefits for using either of these and different scenarios may need one of these ways to be used. For now we are going to talk about MboSet fetched from MXServer.
When fetching an MboSet from MXServer, there are a few things that one needs to be careful about. Poor knowledge of these may result in performance issues, poor memory management and undesirable outcomes.
There are six simple rules to keep in mind when fetching MboSet from MXserver. These rules are as follows –
- Always use setWhere() and reset() on the set fetched from MXServer. The where clause that you give in the setWhere will reduce the no. of MBOs fetched in the set. The reset will get the data from the database using the where clause. If the setWhere is not used, the entire set is fetched from the database which means the entire table is fetched into the memory.
MboSetRemote assetSet = MXServer.getMXServer().getMboSet("ASSET", getUserInfo()); assetSet.setWhere("LOCATION = 'BEDFORD'"); assetSet.reset();
- If the set is being fetched just to add new MBOs and not for traversing then use 1=0 as where clause in the setWhere. This will fetch an empty set.
- If the set is being fetched just for traversing and not for any addition or updates set DISCARDABLE flag as true on the MboSet. Discardable MboSet are not cached in memory, they can only be traversed in forward direction and cannot be saved.
- If MboSet is fetched for readonly purpose, set NOSAVE flag as true. This way the MboSet won’t be added to the MXTransaction which would shortens the looping time of the transaction.
- If an add or update transaction is being performed on an MboSet, do not forget to call save(). Contrary to popular belief that save shouldn’t be called explicitly in java code, MboSet fetched from MXServer must be saved before the set is closed otherwise the changes would be lost. MboSets fetched from relationship do not require save to be called explicitly because their save is called when their parent is saved. Hence the belief.
- Always call clear() and close() on the MboSet fetched from MXServer once it is certain that it is not required anymore. This releases the memory and the database resources. If the set is not closed, it will remain in memory till it is collected by the garbage collector which could be a long time.
clear and close shouldn’t be called on an MBOSet fetched from a relationship. This will give undesirable results.
So keep in mind these simple rules next time when you are fetching a set from MXServer.
In my next post I will try to explain you the difference between clear(), cleanup() & close(). Stay tuned.. 🙂