29.7. ºñµ¿±â Å뺸

PostgreSQL´Â LISTEN¿Í NOTIFYÄ¿¸Çµå¸¦ »ç¿ëÇÑ, ºñµ¿±â Å뺸¸¦ Áö¿øÇÕ´Ï´Ù. Ŭ¶óÀÌ¾ðÆ® ¼¼¼ÇÀº LISTENÄ¿¸Çµå¸¦ »ç¿ëÇØ ƯÁ¤ÇÑ Å뺸 Á¶°ÇÀ» µî·ÏÇÕ´Ï´Ù. (Å뺸 °¨½Ã¸¦ ±×¸¸µÎ·Á¸éUNLISTENÄ¿¸Çµå¸¦ »ç¿ëÇÕ´Ï´Ù. ) ÀÓÀÇÀÇ ¼¼¼ÇÀ¸·Î Á¶°Ç¸í¿¡ ÀÇÇÑNOTIFYÄ¿¸Çµå°¡ ½ÇÇàµÇ¸é, ƯÁ¤ Á¶°ÇÀ» °¨½ÃÇÏ´Â ¸ðµç ¼¼¼ÇÀº ºñµ¿±â¿¡°Ô Å뺸¸¦ ¹Þ½À´Ï´Ù. Å뺸¿øÀ¸·ÎºÎÅÍ Å뺸¸¦ ¹Þ´Â ÂÊÀº ´õ ÀÌ»óÀÇ Á¤º¸¸¦ °Ç³×¹ÞÁö ¾Ê½À´Ï´Ù. µû¶ó¼­, º¸Åë Åë½ÅÇØ¾ß ÇÏ´Â ½ÇÁ¦ µ¥ÀÌÅÍ´Â µ¥ÀÌÅͺ£À̽º Å×À̺íÀ» °³ÀÔ½ÃÄÑ Àü¼ÛµË´Ï´Ù. ÀϹÝÀûÀ¸·Î, Á¶°Ç¸íÀº °ü·ÃÇÏ´Â ¸±·¹À̼Ǹí°ú °°Àº °ÍÀÌÁö¸¸, ¹Ýµå½Ã °ü·ÃÇÏ´Â ¸±·¹À̼ÇÀÌ ÇÊ¿äÇÏÁö´Â ¾Ê½À´Ï´Ù.

libpq¾îÇø®ÄÉÀ̼ÇÀº º¸ÅëÀÇ SQL¿¡ ÀÇÇÑ Äõ¸®¿Í °°ÀÌLISTEN¿Í UNLISTENÄ¿¸Çµå¸¦ ¹ßÇàÇÒ ¼ö ÀÖ½À´Ï´Ù. NOTIFY¸Þ¼¼ÁöÀÇ µµÂøÀº °è¼ÓµÇ¾îPQnotifies¸¦ È£ÃâÇÏ¸é °ËÃâÇÒ ¼ö ÀÖ½À´Ï´Ù.

PQnotifies´Â ¼­¹ö·ÎºÎÅÍ ¼ö½ÅÇÑ Å뺸 ¸Þ¼¼ÁöÀÇ Ã³¸®µÇÁö ¾ÊÀº ¸®½ºÆ®·ÎºÎÅÍ ´ÙÀ½ÀÇ Å뺸¸¦ ¸®ÅϹ޽À´Ï´Ù. º¸·ù ÁßÀÎ Å뺸°¡ ¾øÀ¸¸é null Æ÷ÀÎÅ͸¦ ¹ÝȯÇÕ´Ï´Ù. PQnotifies °¡ Å뺸¸¦ µ¹·ÁÁÖ¸é, ±× Å뺸´Â ó¸®µÈ °ÍÀ¸·Î Àνĵǰí Å뺸 ¸®½ºÆ®¿¡¼­ Á¦°ÅµË´Ï´Ù.

PGnotify *PQnotifies(PGconn *conn);

typedef struct pgNotify {
    char *relname;              /* notification condition name */
    int  be_pid;                /* process ID of notifying server process */
    char *extra;                /* notification parameter */
} PGnotify;
-->
    char *relname;              /* Å뺸 Á¶°Ç¸í */
    int  be_pid;                /* Å뺸ÇÏ´Â ¼­¹ö ÇÁ·Î¼¼½ºÀÇ ÇÁ·Î¼¼½º ID */
    char *extra;                /* Å뺸 ÆÄ¶ó¹ÌÅÍ */
   } PGnotify;

PQnotifies·Î ¹ÝȯµÈPGnotify¿ÀºêÁ§Æ®ÀÇ Ã³¸®°¡ ³¡³ª¸é, PQfreemem¸¦ »ç¿ëÇØ È®½ÇÈ÷ ÇØÁ¦ÇØ Áֽʽÿä. PGnotify Æ÷ÀÎÅ͸¦ ÇØÁ¦ÇÏ´Â °ÍÀº Áß¿äÇÕ´Ï´Ù. relname¿Í extraÇʵå´Â ´Ù¸¥ ÇÒ´çÀ» ³ªÅ¸³»°í ÀÖÁö ¾Ê½À´Ï´Ù. (ÇöÀç, extraÇʵå´Â »ç¿ëµÇÁö ¾Ê°í, Ç×»ó ºñ¿©ÀÖ´Â ¹®ÀÚ¿­ÀÇ Æ÷ÀÎÅͰ¡ µË´Ï´Ù. )

Example 29-2´Â ºñµ¿±â Å뺸¸¦ »ç¿ëÇÑ »ùÇà ÇÁ·Î±×·¥À» ³ªÅ¸³»°í ÀÖ½À´Ï´Ù.

PQnotifies()´Â ½ÇÁ¦·Î ¼­¹öÀÇ µ¥ÀÌÅ͸¦ Àо´Â °ÍÀº ¾Æ´Õ´Ï´Ù. À̰ÍÀº ´ÜÁö, ´Ù¸¥libpqÇÔ¼ö°¡ Èí¼öÇß´ø Å뺸 ¸Þ¼¼Áö¸¦ ¹ÝȯÇÒ »ÓÀÔ´Ï´Ù. libpq ÀÌÀü ¸±¸®½º¿¡¼­´Â Å뺸 ¸Þ¼¼Áö¸¦ ÀûÀýÇÑ ½ÃÁ¡¿¡ È®½ÇÈ÷ ¹ÞÀ¸·Á¸é , ºó Äõ¸®¶óµµ ÀÏÁ¤½Ã°£¸¶´Ù º¸³»°í, PQexec()¸¦ ½ÇÇàÇÒ ¶§¸¶´ÙPQnotifies()¸¦ üũÇÒ ¼ö ¹Û¿¡ ¾ø¾ú½À´Ï´Ù. Áö±Ýµµ ÀÌ ¹æ¹ýÀº µ¿ÀÛÇÏÁö¸¸, ó¸® ´É·ÂÀÌ ³¶ºñ µÇ¹Ç·Î ±×¸¸µÎ¾î¾ß ÇÕ´Ï´Ù.

½ÇÇàÇØ¾ß ÇÒ Äõ¸®°¡ ¾øÀ» ¶§ Å뺸 ¸Þ¼¼Áö¸¦ üũÇÏ´Â ÁÁÀº ¹æ¹ýÀº ¿ì¼±PQconsumeInput()¸¦ È£ÃâÇϰí PQnotifies()¸¦ üũÇÏ´Â °ÍÀÔ´Ï´Ù. ¼­¹ö·ÎºÎÅÍÀÇ µ¥ÀÌÅÍÀÇ µµÂøÀ»select()·Î ±â´Ù¸± ¼ö ÀÖ¾î, ºÒÇÊ¿äÇÑ µ¿ÀÛÀ¸·ÎCPUÆÄ¿ö¸¦ ¼ÒºñÇØ ¹ö¸®´Â ÀÏÀÌ ¾ø½À´Ï´Ù (select()¸¦ »ç¿ëÇÏ´Â ÆÄÀÏ ±â¼úÀÚÀÇ ¹øÈ£ Ãëµæ¿¡ ´ëÇØ¼­´Â PQsocket()¸¦ ÂüÁ¶ÇØ Áֽʽÿä). µ¡ºÙ¿© À̰ÍÀº Äõ¸®¿¡PQsendQuery¿Í PQgetResult¸¦ »ç¿ëÇßÀ» ¶§µµ, Ä£¼÷ÇÑPQexec¸¦ »ç¿ëÇßÀ» ¶§µµ µ¿ÀÛÇÕ´Ï´Ù. ±×·¯³ª Å뺸°¡ Ä¿¸ÇµåÀÇ Ã³¸® Áß¿¡ µµÂøÇÏ´ÂÁö ¾Æ´ÑÁö, PQgetResult³ª PQexecÀÇ ½ÇÇà ¸¶´ÙPQnotifies()¸¦ Á¶»çÇÏ´Â °ÍÀ» ÀØÁö ¾Êµµ·Ï ÇØ¾ßÇÕ´Ï´Ù.