Mutex pada level database

Database dan Structured Query Language

Mutex pada level database

Postby leledumbo » 31 Dec 2010, 17:55

Saya membuat web service dengan komponen fpWeb dari Lazarus dan menggunakan ZEOS sebagai database abstraction layernya. Nah, setelah dicoba-coba, request yang terjadi secara concurrent menyebabkan internal server error pada request-request yang tidak terlayani. Setelah diutak-atik, kemungkinan terjadi pada koneksi database. Saya terpikirkan untuk membuat mutex, tapi pada level database bagaimana caranya? Minta tolong donk mbah2 sekalian. Makasih...
leledumbo
Senior Member
 
Posts: 262
Joined: 24 May 2010, 15:58

RE: Mutex pada level database

Postby D.E » 03 Jan 2011, 17:54

Harus diselidiki dulu,
1. Apakah Zeos thread safe? Jika sudah berarti masalah bukan di level database.
2. Kalau belum; tentukan lagi apakah hendak menggunakan connection pool?

1. Connection Pool:
- Buat atau cari lib utk management pool, biasanya menggunakan resource protection juga (Mutex atau sejenisnya)

2. Jika tidak, maupun dengan Connection Pool:
- Protect resource ditiap single DB connection, ditiap access/execute statement query (menggunakan mutex)
- Cara paling mudah menyisipkan mutex adalah membuat wrapper DB connection.

Code: Select all
  1. type

  2.   TMyProtectedDBConn = class

  3.   private

  4.     FDBConn: TZeosDBConnection; // --> sesuaikan classnya

  5.     FMutex: THandle; // --> atau sesuaikan jika menggunakan wrapper

  6.   protected

  7.     procedure Lock;

  8.     procedure Unlock;

  9.   public

  10.     constructor Create(const ADBConn: TZeosDBConnection);

  11.    

  12.     // contoh wrapper func

  13.     function ExecQuery(const SQL: string; const Params: array of Variant): Integer;

  14.   end;

  15.  

  16. implementation

  17.  

  18. constructor TMyProtectedDBConn.Create(const ADBConn: TZeosDBConnection);

  19. begin

  20.   FDBConn := ADBConn;

  21.   InitMutex; // init / create mutex, jangan lupa delete / release on Destroy;

  22. end;

  23.  

  24. procedure TMyProtectedDBConn.Lock;

  25. begin

  26.   Mutex.Lock; // atau gunakan API

  27. end;

  28.  

  29. procedure TMyProtectedDBConn.Unlock;

  30. begin

  31.   Mutex.Unlock; // atau gunakan API

  32. end;

  33.  

  34. function TMyProtectedDBConn.ExecQuery(const SQL: string; const Params: array of Variant): Integer;

  35. begin

  36.   Lock;

  37.   try

  38.     FDBConn.SQL.Text := SQL;

  39.     AssignParams(FDBConn, Params); // bikin sendiri utk assign params

  40.  

  41.     if not FDBConn.InTransaction then

  42.       FDBConn.StartTransaction;

  43.     try

  44.       FDBConn.Exec; // atau sejenisnya

  45.       FDBConn.Commit;

  46.     except

  47.       FDBConn.Rollback;

  48.     end;

  49.   finally

  50.     Unlock;

  51.   end;

  52. end;

:idea: Dude, if you don't understand the basics and just want to get someone else write the code for you, it means you really shouldn't study computer science. Find different field!
User avatar
D.E
Senior Member
 
Posts: 638
Joined: 04 May 2010, 18:12

RE: Mutex pada level database

Postby leledumbo » 03 Jan 2011, 22:42

Nah itu dia... mutexnya gak ada yang cross platform. Kebetulan develop di windows, tapi deploymentnya di linux.
leledumbo
Senior Member
 
Posts: 262
Joined: 24 May 2010, 15:58

RE: Mutex pada level database

Postby mambamaestro » 04 Jan 2011, 08:36

Kang DE, mutex itu apa gunanya untuk sebagai penanda bhw suatu perintah query sedang diproses (dalam satu thread), sehingga thread2 lain yang hendak mengeksekusi musti melihat, apakah ada thread yang sedang diproses querynya itu sudah selesai atau belum?

artinya, apakah ini berarti, proses eksekusi query pada database, hanya diijinkan satu dalam satu waktu?
mambamaestro
Member
 
Posts: 156
Joined: 06 May 2010, 14:14
Location: Surabaya

RE: Mutex pada level database

Postby D.E » 04 Jan 2011, 09:52

@leledumbo:
Ya developnya biar sip kudu di linux juga dong hehe; atau ganti pake Python saja tinggal jebret :D
Masa' abstract class-nya ngga' tersedia? Bukankah itu kebutuhan mendasar yg harusnya sudah built-in FPC?

mambamaestro wrote:Kang DE, mutex itu apa gunanya untuk sebagai penanda bhw suatu perintah query sedang diproses (dalam satu thread), sehingga thread2 lain yang hendak mengeksekusi musti melihat, apakah ada thread yang sedang diproses querynya itu sudah selesai atau belum?

artinya, apakah ini berarti, proses eksekusi query pada database, hanya diijinkan satu dalam satu waktu?


Ya, kurang lebih seperti itu. Sesuai definisinya; Mutual exclusion lebih tepat disebut sebagai pemrotek bagian code block program; gunanya untuk menjamin code block tersebut hanya boleh di eksekusi sekali dalam satu waktu.

Mutex (di Linux base) atau CS - Critical Section (biasa dipake di Windows - sekalipun di Windows jg mendukung Mutex), adalah suatu metode yg bertujuan kurang lebih sama namun beda dalemannya. Ada yg bilang Mutex rakus resource processor sedang CS tidak. Di Windows saya biasa memprotect shared resource yg hanya boleh di eksekusi secara bergantian dilingkungan concurent/parallel programming menggunakan Critical Section. Penggunaanya kurang lebih sama: Lock; CodeBlock; Unlock;

Disini, manfaat concurrent programming jadi berbaur, namun itulah sunnah-nya; tidak ada yg benar2 concurent, semua serial walau sepertinya tidak :) - Sekalipun menggunakan multi-core CPU, pipelining-nya tetap harus ngantri (sekalipun dibuat seminim/secepat mungkin).
:idea: Dude, if you don't understand the basics and just want to get someone else write the code for you, it means you really shouldn't study computer science. Find different field!
User avatar
D.E
Senior Member
 
Posts: 638
Joined: 04 May 2010, 18:12

RE: Mutex pada level database

Postby herux » 04 Jan 2011, 11:12

leledumbo wrote:Saya membuat web service dengan komponen fpWeb dari Lazarus dan menggunakan ZEOS sebagai database abstraction layernya. Nah, setelah dicoba-coba, request yang terjadi secara concurrent menyebabkan internal server error pada request-request yang tidak terlayani. Setelah diutak-atik, kemungkinan terjadi pada koneksi database. Saya terpikirkan untuk membuat mutex, tapi pada level database bagaimana caranya? Minta tolong donk mbah2 sekalian. Makasih...


Saya kok ga pernah kejadian kayak gitu? bukannya tiap satu request ter create thread/ instance tersendiri?
webserver nya apa ?
herux
Member
 
Posts: 132
Joined: 06 May 2010, 10:59

RE: Mutex pada level database

Postby leledumbo » 04 Jan 2011, 21:59

Saya kok ga pernah kejadian kayak gitu? bukannya tiap satu request ter create thread/ instance tersendiri?
webserver nya apa?

Bukan masalah web server, tapi db servernya yang cuma 1. Jadi pas request 2 dateng sementara request 1 lagi make db, gagal lah connectnya dan menghasilkan exception (harusnya, lucunya nih exception ditangkep nggak mao). Internal server error kemungkinan terjadi gegara pas programnya error, nulis ke standard error, nah sama web server kalo standard error berisi langsung diterjemahin jadi internal server error (udah nyoba pake writeln biasa). Web servernya apache2.

Omong2, ane jadi dapet ilham buat bikin file kosong. Nah, kalo tuh file ada, request yang mau ngakses db nunggu dulu sampe timeout tertentu ato sampe file itu ilang. Gimana? Gimana?
leledumbo
Senior Member
 
Posts: 262
Joined: 24 May 2010, 15:58

RE: Mutex pada level database

Postby herux » 05 Jan 2011, 07:14

Zeosdb banyak dipake, selama ini saya ga ada masalah utk koneksi ke db berbarengan. agak aneh kalo terjadi begitu.
atau ada yang pernah kejadian begitu menggunakan zeosdbo ?
herux
Member
 
Posts: 132
Joined: 06 May 2010, 10:59

RE: Mutex pada level database

Postby mas_kofa » 05 Jan 2011, 08:13

bentoel bang @herux, saya kira juga begito.....
User avatar
mas_kofa
Senior Member
 
Posts: 344
Joined: 05 May 2010, 12:03
Location: Jakarta

RE: Mutex pada level database

Postby mambamaestro » 05 Jan 2011, 09:47

herux wrote:Zeosdb banyak dipake, selama ini saya ga ada masalah utk koneksi ke db berbarengan. agak aneh kalo terjadi begitu.
atau ada yang pernah kejadian begitu menggunakan zeosdbo ?

mungkin request 1 sedang menginsert/mengupdate suatu record (yang mungkin ada proses locking dan unlocking record) sementara request yang lain juga berusaha membaca/mengupdate record yang sama (yang sedang di lock)?

zeos db mah.. hobinya error :D
mambamaestro
Member
 
Posts: 156
Joined: 06 May 2010, 14:14
Location: Surabaya

Next

Who is online

Users browsing this forum: No registered users and 1 guest

cron