none
(Sumber: milist DOTNET) Web Application aspnet RRS feed

  • Pertanyaan

  • Mungkin master master disini udah ada yang pernah ngalamin atau mengerti.

    Saya buat aplikasi web base dengan asp.net 2005.
    Baru kali ini saya mengalami kejadian.. Misal ada 5 client login sebagai group user kemudian ketika saya sebagai user ke 6 masuk sebagai group supervisi.. Tiba2 beberapa client yang login sebagai group user berubah fasilitasnya menjadi fasilitas yang ada pada supervisi.. Begitu sebaliknya.

    Saya awalnya menggunakan session cuma saya menggunakan cache untuk mempercepat pemanggilan data. Apa hal itu mempengaruhi kejadian tersebut?
    Atau ada hal lain?

    Terimakasih atas bantuannya.


    Agnes Sannie [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Senin, 21 November 2011 09.29
    Moderator

Jawaban

  • Global karena saya asumsikan anda membuat cache nya menggunakan class Cache dari .NET.

    Cache bisa juga digunakan utk cache page/halaman aspx nya spy "gak perlu render2" lagi (as fas as I know).

     

    Sedangkan cache data, ya menggunakan class dari .NET itu. Ini setau saya juga disimpan di server dan di hold oleh worker. Cache data cocok utk kasus dimana data yg ditampilkan besar dan ingin tetap ada walaupun user telah sign-out. Ada property nya kapan mau dibikin expired / invalid sehingga harus narik data lagi dari database.

     

    Nah kasus anda seperti apa? Ingin cache di level page atau data? Kalau cache level page disarankan utk page2 yg sama utk semua user. Bisa dikatakan hampir statis. Atau di update 1x dalam 1 minggu.

     

    Klo kebutuhan kantor saya sih mustahil level cache nya di page. Coz bisa sign-in dan re-sign-in lagi dengan tabel database yg berbeda. Makanya saya pake cache di level data dgn rumus AppID + UserID + CacheName. Dan performance yg saya dapatkan bener2 wuzzzzzzz...... ajibb dah :D. Cache nya saya bikin bertahan 2 hari *untuk kebutuhan bos2 meeting di cabang lain. Dijamin dia akan narik data yg lama dari cache klo blm expired. Klo pgn ambil data baru, ada tombol refresh. Tombol refresh juga otomatis me-replace cache yg lama.

     

    Note: Cache itu mahal harganya. Klo worker udah kehabisan memory utk bekerja, cache dgn prioritas rendah akan dihapus. Kemudian cache yg jarang diakses akan dihapus.

    Sedangkan RAM itu murah harganya

     

    Klo yg tersimpan di browser client, itu namanya cookies dan hanya bisa menampung data sebesar 4KB kurang lebih.

     

    Ini sample code saya. Saya taruh di BasePage.cs:

    Parameter CacheName yg diterima sudah memiliki UserID di dalamnya. Karena ada kebutuhan cross application, maka tinggal saya overwrite via basepage menggunakan ApplicationID / Session["PROGRAM_CODE"].

     

    protected void AddCache(string CacheName, object CacheValue)

    {

    AddCache(CacheName, CacheValue, CacheItemPriority.High);

    }

    protected void AddCache(string CacheName, object CacheValue, CacheItemPriority Priority)

    {

    CacheName = Session["PROGRAM_CODE"] + CacheName;

    if (null == Cache[CacheName])

    {

    var callBack = new CacheItemRemovedCallback(OnRemoveCache); //ini utk callback event ketika cache dihapus oleh server. Bisa digunakan utk logging alasan cache di hapus. Removed/ Expired/Underused.

    int cacheDays = int.Parse(BaseRepository.AppSettings["CacheDays"]); //settingan web.config

    Cache.Add(CacheName, CacheValue, null, Cache.NoAbsoluteExpiration, new TimeSpan(cacheDays, 0, 0, 0, 0), Priority, callBack);

     

    //TODO:need event log ID here

    FEIS.Repository.SystemRepository.AddLog("Cache [" + CacheName + "] was added to collection.", System.Diagnostics.EventLogEntryType.Information, 10, 10);

    }

    }

    protected object RetrieveCache(string CacheName)

    {

    CacheName = Session["PROGRAM_CODE"] + CacheName;

    //TODO:need event log ID here

    FEIS.Repository.SystemRepository.AddLog("Cache [" + CacheName + "] was reloaded from collection.", System.Diagnostics.EventLogEntryType.Information, 10, 11);

    //return Session[CacheName];

    return Cache[CacheName];

    }

    protected void RemoveCache(string CacheName)

    {

    CacheName = Session["PROGRAM_CODE"] + CacheName;

    if (null == Cache[CacheName]) return;

    Cache.Remove(CacheName);

    }

    private static void OnRemoveCache(string CacheName, object CacheValue, CacheItemRemovedReason Reason)

    {

    FEIS.Repository.SystemRepository.AddLog("Cache " + CacheName + " has been removed with reason : " + Reason.ToString(), System.Diagnostics.EventLogEntryType.Warning, 1, 1);

    }

     

    Semoga membantu.

     

    Dijawab oleh: skyter3


    Agnes Sannie [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Senin, 21 November 2011 09.35
    Moderator

Semua Balasan

  • Cache itu sifatnya global bos, harus hati2. Klo data yg ingin disimpan sifatnya per user / unique, ya cache bukan jawaban. Tapi klo mau pke cache tetep bisa diakalin. Kasi aja nama cache nya dgn rumus : Application_ID + UserID + Your_CacheName.

     

    ApplicationID misalnya kalau login nya bisa pindah2 aplikasi. Kalau di kantor saya misalnya user bisa pilih login ke aplikasi Distributor atau Subdistributor. UI nya sama, hanya tabel database nya beda. Kalau flag ini mungkin bisa ente skip.

     

    UserID udah jelas untuk membedakan cache nya tiap request yg terjadi.

    YourCacheName, sudah pasti untuk memudahkan anda mengenal cache yg anda buat

     

    Bikin aja file BasePage.cs dan inherit semua file aspx nya ke BasePage.cs ini. Isi dari BasePage di antaranya ya mekanisme cache ini (Read/Write/Destroy). Supaya kalau mau nambah/edit flag cache_name nya hanya di 1 file aja, gak perlu refactoring semua file.

     

    Oia, pastiin juga jumlah worker thread di iis nya hanya 1 utk menghindari cache yg telah ada namun dicreate lagi oleh worker yg lain karena ia gak memiliki dictionary akan cache yg dimaksud. kalau tetep mau pke lebih dari 1 worker (well known as web farm), pke distributed cache (asli gua kgk tau yg ini... wkwkwkwkkwk, tapi pernah denger NDistributed Cache which is musti bayar klo gak salah). Masalah jumlah worker ini sempet bikin gw pusing kenapa nilai cache selalu berubah2. Ternyata ketika request terjadi, gak semua worker memiliki cache yg kita minta. Jgn lupa set worker nya jadi 1 di pooling iis utk menghindari redundant cache.

     

     

    semoga membantu.

     

    Dijawab oleh: skyter3

     

     


    Agnes Sannie [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Senin, 21 November 2011 09.32
    Moderator
  • Oh.. Cache itu sifat nya global ya? Bukannya dia nanti tersimpan di browser client ya?
    Asumsi saya klo dia tersimpat di komputer client selama usernya tidak berubah dia hanya meng get data dari client tanpa harus retreive terlebih dahulu ke server.

    Kalau misalkan cache itu variable global berarti cache itu teraimpan dimana?

    Apakah dengan rumus penggunaan cache tersebut sudah dapat menghilangkan terjadinya tarik menarik data lagi?


    Agnes Sannie [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Senin, 21 November 2011 09.33
    Moderator
  • Global karena saya asumsikan anda membuat cache nya menggunakan class Cache dari .NET.

    Cache bisa juga digunakan utk cache page/halaman aspx nya spy "gak perlu render2" lagi (as fas as I know).

     

    Sedangkan cache data, ya menggunakan class dari .NET itu. Ini setau saya juga disimpan di server dan di hold oleh worker. Cache data cocok utk kasus dimana data yg ditampilkan besar dan ingin tetap ada walaupun user telah sign-out. Ada property nya kapan mau dibikin expired / invalid sehingga harus narik data lagi dari database.

     

    Nah kasus anda seperti apa? Ingin cache di level page atau data? Kalau cache level page disarankan utk page2 yg sama utk semua user. Bisa dikatakan hampir statis. Atau di update 1x dalam 1 minggu.

     

    Klo kebutuhan kantor saya sih mustahil level cache nya di page. Coz bisa sign-in dan re-sign-in lagi dengan tabel database yg berbeda. Makanya saya pake cache di level data dgn rumus AppID + UserID + CacheName. Dan performance yg saya dapatkan bener2 wuzzzzzzz...... ajibb dah :D. Cache nya saya bikin bertahan 2 hari *untuk kebutuhan bos2 meeting di cabang lain. Dijamin dia akan narik data yg lama dari cache klo blm expired. Klo pgn ambil data baru, ada tombol refresh. Tombol refresh juga otomatis me-replace cache yg lama.

     

    Note: Cache itu mahal harganya. Klo worker udah kehabisan memory utk bekerja, cache dgn prioritas rendah akan dihapus. Kemudian cache yg jarang diakses akan dihapus.

    Sedangkan RAM itu murah harganya

     

    Klo yg tersimpan di browser client, itu namanya cookies dan hanya bisa menampung data sebesar 4KB kurang lebih.

     

    Ini sample code saya. Saya taruh di BasePage.cs:

    Parameter CacheName yg diterima sudah memiliki UserID di dalamnya. Karena ada kebutuhan cross application, maka tinggal saya overwrite via basepage menggunakan ApplicationID / Session["PROGRAM_CODE"].

     

    protected void AddCache(string CacheName, object CacheValue)

    {

    AddCache(CacheName, CacheValue, CacheItemPriority.High);

    }

    protected void AddCache(string CacheName, object CacheValue, CacheItemPriority Priority)

    {

    CacheName = Session["PROGRAM_CODE"] + CacheName;

    if (null == Cache[CacheName])

    {

    var callBack = new CacheItemRemovedCallback(OnRemoveCache); //ini utk callback event ketika cache dihapus oleh server. Bisa digunakan utk logging alasan cache di hapus. Removed/ Expired/Underused.

    int cacheDays = int.Parse(BaseRepository.AppSettings["CacheDays"]); //settingan web.config

    Cache.Add(CacheName, CacheValue, null, Cache.NoAbsoluteExpiration, new TimeSpan(cacheDays, 0, 0, 0, 0), Priority, callBack);

     

    //TODO:need event log ID here

    FEIS.Repository.SystemRepository.AddLog("Cache [" + CacheName + "] was added to collection.", System.Diagnostics.EventLogEntryType.Information, 10, 10);

    }

    }

    protected object RetrieveCache(string CacheName)

    {

    CacheName = Session["PROGRAM_CODE"] + CacheName;

    //TODO:need event log ID here

    FEIS.Repository.SystemRepository.AddLog("Cache [" + CacheName + "] was reloaded from collection.", System.Diagnostics.EventLogEntryType.Information, 10, 11);

    //return Session[CacheName];

    return Cache[CacheName];

    }

    protected void RemoveCache(string CacheName)

    {

    CacheName = Session["PROGRAM_CODE"] + CacheName;

    if (null == Cache[CacheName]) return;

    Cache.Remove(CacheName);

    }

    private static void OnRemoveCache(string CacheName, object CacheValue, CacheItemRemovedReason Reason)

    {

    FEIS.Repository.SystemRepository.AddLog("Cache " + CacheName + " has been removed with reason : " + Reason.ToString(), System.Diagnostics.EventLogEntryType.Warning, 1, 1);

    }

     

    Semoga membantu.

     

    Dijawab oleh: skyter3


    Agnes Sannie [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Senin, 21 November 2011 09.35
    Moderator