아래 쓴 문제가 계속 생깁니다. 정보
아래 쓴 문제가 계속 생깁니다.본문
댓글 전체
그누보드 내부적으로 어떻게 동작하는지는 모르겠지만 제 예상으로는..
그누보드에선 게시물 번호를 실제 wr_id 가 아닌 가상번호를 쓰는데, 이 가상번호는 바로 전 게시물의 가상번호를 DB에서읽어서 그 번호에 +1 을 하여 매기는듯한데, 사용자가 몰릴경우 DB 에서 이전 번호를 읽어오는 속도보다 글이 올라오는 속도가 빠를경우(여럿이 동시에 글을 쓸경우) 이런 문제가 발생하는게 아닌가 싶습니다..
그누보드에선 게시물 번호를 실제 wr_id 가 아닌 가상번호를 쓰는데, 이 가상번호는 바로 전 게시물의 가상번호를 DB에서읽어서 그 번호에 +1 을 하여 매기는듯한데, 사용자가 몰릴경우 DB 에서 이전 번호를 읽어오는 속도보다 글이 올라오는 속도가 빠를경우(여럿이 동시에 글을 쓸경우) 이런 문제가 발생하는게 아닌가 싶습니다..
gnuboard.lib.php
--
// 게시판의 다음글 번호를 얻는다.
function get_next_num($table, $notice=0)
{
// 공지사항일 경우 공지사항에서 가장 작은 번호를 얻고
if ($notice == -1) {
$sql1 = " select min(wr_num) from $table where wr_notice = '-1' ";
$row1 = sql_fetch($sql1);
}
// 공지사항이 아닌글에서 가장 작은 번호를 얻어
$sql2 = " select min(wr_num) from $table where wr_notice = '0' ";
$row2 = sql_fetch($sql2);
// 비교하여 작은 수에서 1 뺀 값을 반환
if ((int)$row1[0] < (int)$row2[0]) {
return ((int)$row1[0] - 1);
} else {
return ((int)$row2[0] - 1);
}
}
--
위부분에서 다음 글 번호를 받아오더군요..
병목현상이 정확히 어디서 발생하는지 알순 없지만 제 예상이 대충 맞는듯합니다..
버그라기보단 구조적인 문제라고 봐야할까요..? 간단하게 해결하기는 힘들것같군요 ㅜㅜ..
--
// 게시판의 다음글 번호를 얻는다.
function get_next_num($table, $notice=0)
{
// 공지사항일 경우 공지사항에서 가장 작은 번호를 얻고
if ($notice == -1) {
$sql1 = " select min(wr_num) from $table where wr_notice = '-1' ";
$row1 = sql_fetch($sql1);
}
// 공지사항이 아닌글에서 가장 작은 번호를 얻어
$sql2 = " select min(wr_num) from $table where wr_notice = '0' ";
$row2 = sql_fetch($sql2);
// 비교하여 작은 수에서 1 뺀 값을 반환
if ((int)$row1[0] < (int)$row2[0]) {
return ((int)$row1[0] - 1);
} else {
return ((int)$row2[0] - 1);
}
}
--
위부분에서 다음 글 번호를 받아오더군요..
병목현상이 정확히 어디서 발생하는지 알순 없지만 제 예상이 대충 맞는듯합니다..
버그라기보단 구조적인 문제라고 봐야할까요..? 간단하게 해결하기는 힘들것같군요 ㅜㅜ..
auto increment를 쓰면 이런 문제는 안 생기는데...
lock을 걸어야 할까요?
static 변수를 쓰면 좀 나을까요?
lock을 걸어야 할까요?
static 변수를 쓰면 좀 나을까요?
lock 을 거는건 게시판 속도가 느려지는 원인이 될겁니다..
static 변수는 어떻게 쓰신다는건지 ..
어쨌든 현재 상태로는 그누보드로는 유지할수가 없는 상황입니다.. 사람 붐비는 시간대만되면 회원들한테 신나게 혼납니다ㅜㅜ
어쩔 수 없이 다른 보드로의 이전을 생각중입니다..
static 변수는 어떻게 쓰신다는건지 ..
어쨌든 현재 상태로는 그누보드로는 유지할수가 없는 상황입니다.. 사람 붐비는 시간대만되면 회원들한테 신나게 혼납니다ㅜㅜ
어쩔 수 없이 다른 보드로의 이전을 생각중입니다..
lib/common.lib.php 의
function get_next_num($table) 를 아래와 같이 수정해 보십시오.
// 게시판의 다음글 번호를 얻는다.
function get_next_num($table)
{
sql_query(" LOCK TABLE $table READ ");
// 가장 작은 번호를 얻어
$sql = " select min(wr_num) as min_wr_num from $table ";
$row = sql_fetch($sql);
// 가장 작은 번호에 1을 빼서 넘겨줌
sql_query(" UNLOCK TABLES ");
return (int)($row[min_wr_num] - 1);
}
적용해 보신 후 이상이 없는지 알려주시면 감사하겠습니다.
function get_next_num($table) 를 아래와 같이 수정해 보십시오.
// 게시판의 다음글 번호를 얻는다.
function get_next_num($table)
{
sql_query(" LOCK TABLE $table READ ");
// 가장 작은 번호를 얻어
$sql = " select min(wr_num) as min_wr_num from $table ";
$row = sql_fetch($sql);
// 가장 작은 번호에 1을 빼서 넘겨줌
sql_query(" UNLOCK TABLES ");
return (int)($row[min_wr_num] - 1);
}
적용해 보신 후 이상이 없는지 알려주시면 감사하겠습니다.
lib/common.lib.php 에는 해당 함수가 없습니다..;
-. 파일경로 및 소스코드 위치 : /lib/gnuboard.lib.php 462라인 근처
-. 원본
// 게시판의 다음글 번호를 얻는다.
function get_next_num($table, $notice=0)
{
// 공지사항일 경우 공지사항에서 가장 작은 번호를 얻고
if ($notice == -1) {
$sql1 = " select min(wr_num) from $table where wr_notice = '-1' ";
$row1 = sql_fetch($sql1);
}
// 공지사항이 아닌글에서 가장 작은 번호를 얻어
$sql2 = " select min(wr_num) from $table where wr_notice = '0' ";
$row2 = sql_fetch($sql2);
// 비교하여 작은 수에서 1 뺀 값을 반환
if ((int)$row1[0] < (int)$row2[0]) {
return ((int)$row1[0] - 1);
} else {
return ((int)$row2[0] - 1);
}
}
-. 수정
// 게시판의 다음글 번호를 얻는다.
function get_next_num($table, $notice=0)
{
sql_query(" LOCK TABLE $table READ ");
// 공지사항일 경우 공지사항에서 가장 작은 번호를 얻고
if ($notice == -1) {
$sql1 = " select min(wr_num) from $table where wr_notice = '-1' ";
$row1 = sql_fetch($sql1);
}
// 공지사항이 아닌글에서 가장 작은 번호를 얻어
$sql2 = " select min(wr_num) from $table where wr_notice = '0' ";
$row2 = sql_fetch($sql2);
// 비교하여 작은 수에서 1 뺀 값을 반환
if ((int)$row1[0] < (int)$row2[0]) {
sql_query(" UNLOCK TABLES ");
return ((int)$row1[0] - 1);
} else {
sql_query(" UNLOCK TABLES ");
return ((int)$row2[0] - 1);
}
}
~ 라는 의미인것 같습니다.
관리자님께서 잠시 g4와 혼용하신듯 합니다.
-. 원본
// 게시판의 다음글 번호를 얻는다.
function get_next_num($table, $notice=0)
{
// 공지사항일 경우 공지사항에서 가장 작은 번호를 얻고
if ($notice == -1) {
$sql1 = " select min(wr_num) from $table where wr_notice = '-1' ";
$row1 = sql_fetch($sql1);
}
// 공지사항이 아닌글에서 가장 작은 번호를 얻어
$sql2 = " select min(wr_num) from $table where wr_notice = '0' ";
$row2 = sql_fetch($sql2);
// 비교하여 작은 수에서 1 뺀 값을 반환
if ((int)$row1[0] < (int)$row2[0]) {
return ((int)$row1[0] - 1);
} else {
return ((int)$row2[0] - 1);
}
}
-. 수정
// 게시판의 다음글 번호를 얻는다.
function get_next_num($table, $notice=0)
{
sql_query(" LOCK TABLE $table READ ");
// 공지사항일 경우 공지사항에서 가장 작은 번호를 얻고
if ($notice == -1) {
$sql1 = " select min(wr_num) from $table where wr_notice = '-1' ";
$row1 = sql_fetch($sql1);
}
// 공지사항이 아닌글에서 가장 작은 번호를 얻어
$sql2 = " select min(wr_num) from $table where wr_notice = '0' ";
$row2 = sql_fetch($sql2);
// 비교하여 작은 수에서 1 뺀 값을 반환
if ((int)$row1[0] < (int)$row2[0]) {
sql_query(" UNLOCK TABLES ");
return ((int)$row1[0] - 1);
} else {
sql_query(" UNLOCK TABLES ");
return ((int)$row2[0] - 1);
}
}
~ 라는 의미인것 같습니다.
관리자님께서 잠시 g4와 혼용하신듯 합니다.
-. 관련내용 : http://search.empas.com/search/all.html?a=w&s=&f=&z=A&q=mysql+lock+table
-. 관련내용 : http://k.daum.net/qna/kin/home/qdetail_view.html?boardid=CA&qid=06ZMQ
-. 문제점으로 대두될 수 있는 부분
lock table이 수행되는 과정동안,
대규모 사이트에서 여러 유저의 포스팅이 겹치게 된다면,
'정상적인 등록이 아닌것 같습니다.'라는 경고 메시지를
상당히 자주 볼 수도 있을거라는 우려가 들기는 합니다.
(대규모 사이트를 운영해 본 경험이 없어서 추측만 되는군요.)
-. 관련내용 : http://k.daum.net/qna/kin/home/qdetail_view.html?boardid=CA&qid=06ZMQ
-. 문제점으로 대두될 수 있는 부분
lock table이 수행되는 과정동안,
대규모 사이트에서 여러 유저의 포스팅이 겹치게 된다면,
'정상적인 등록이 아닌것 같습니다.'라는 경고 메시지를
상당히 자주 볼 수도 있을거라는 우려가 들기는 합니다.
(대규모 사이트를 운영해 본 경험이 없어서 추측만 되는군요.)
lock table 은 함부로 적용하기가 겁나는군요. 나스카님 말씀대로 그럴 수도 있고 속도가 떨어질지도 모르겠기도 해서..
정상등록이 아니라면서 글 등록이 안돼버리면 번호 없이 등록됐을때보다 더 심하게 혼날겁니다 ㅡㅡ;;
정상등록이 아니라면서 글 등록이 안돼버리면 번호 없이 등록됐을때보다 더 심하게 혼날겁니다 ㅡㅡ;;
일단 실행은 해 보시는 것과
이론상 추측하는 것과는 상당한 차이가 있습니다.
과연 lock table이 얼마만큼 사용자들을 제어하고,
적절하게 게시물 작성 '완료 시점을 제어해 줄 수 있느냐' 겠지요.
이론상 추측하는 것과는 상당한 차이가 있습니다.
과연 lock table이 얼마만큼 사용자들을 제어하고,
적절하게 게시물 작성 '완료 시점을 제어해 줄 수 있느냐' 겠지요.
Lock table 이란것이 근본적인 문제 해결이 아니라 DB 에 동시 접근할때 가장 먼저 접근한 요청에 대해서만 정상적인 처리를 하고 나머지 요청에 대해선 정상처리가 안될것이기에 적용하기가 꺼려집니다.
제 예상에.. lock 되어 있는 테이블이 접근시, 무시를 할 경우 글이 제대로 작성이 되지 않을것이고, 그렇지 않고 lock 이 풀릴때까지 대기했다가 처리를 한다면 속도가 느려지는 원인이 될것같거든요..
제 예상에.. lock 되어 있는 테이블이 접근시, 무시를 할 경우 글이 제대로 작성이 되지 않을것이고, 그렇지 않고 lock 이 풀릴때까지 대기했다가 처리를 한다면 속도가 느려지는 원인이 될것같거든요..
번호가 없는 글이 생기더라도 리플이 제대로 된곳에 달리게만 해주면 됩니다.
이건 좀 쉽게 가능하지 않을까요..?
이건 좀 쉽게 가능하지 않을까요..?