mysql api에 관한 질문입니다

aprilblue의 이미지

안녕하세요

이번에 api를 접하게된 학생입니다

음..다름이 아니라 Linux 서버에서 mysql c api를 이용하여

프로그램을 짰는데요

DB 서버는 프로그램 서버와 따로 있는 상태입니다.

myql 변수를 main.c에서 전역변수로 선언하고

다른 파일에서 extern을 이용하여 사용하고 있는데요

쿼리를 날리기 전에는 mysql_ping()으로 검사하고

mysql 재접속을 시도하였는데 돌리다보니

Mysql server has gone away가 나오면서

재접속이 안되더군요

그래서 아래와 같이 소스를 수정하였는데

/////////////////////////////////////////////////////////
int ret;

if(ret)
{
mysql_close(&mysql);
mysql_init(&mysql);
mysql_real_connect(...);
}
/////////////////////////////////////////////////////////

mysql의 status를 보니

Connections, Aborted_connects가 엄청나게 많아졌고

Aborted_clients가 34정도로 되어졌네요

이전 방식이 프로그램에 접근할 때마다 mysql에 연결하고 끊고

다시 접근하게되면 다시 연결하고 그런 방식이어서

variables의 max_connections, max_connect_errors의 값을 올려주었습니다.

이것의 영향인지 홈페이지에 맨 처음 접속할 때도 엄청 느리더군요..

한번 접속 후엔 괜찮은 속도이지만...

잘못된 부분이 있으면 지적해주시면 감사하겠습니다

superkkt의 이미지

mysql 5.x 버전부터는 mysql_ping에서 연결이 끊어졌더라도 자동으로 재접속을 안한다는걸 mysql 사이트에서 읽은적이 있습니다. url은 못찾겠네요. 혹시 5.x 버전을 사용하시나요? 그렇다면 mysql_real_connect 후에 mysql_options를 사용해서 재접속 옵션을 켜줘야 자동 재접속이 된다고 합니다.

======================
BLOG : http://superkkt.com

======================
BLOG : http://superkkt.com

aprilblue의 이미지

제가 깜빡하고 mysql 버전대를 말씀 못드렸군요 ㅠㅠ

제가 쓰는 mysql 버전이 4.x대 버전이라...

음...혹시 몰라서 mysql 홈페이지에 Mysql has gone away 페이지를

봤는데 영어가 딸려서 몇가지빼고는 해석을 못하겠더군요 ㅠㅠ

혹 mysql 변수를 전역으로 하시고 여러 함수에서 같이 써본

분들이 계시다면 간단한 예제라도...ㅠㅠ

물론 연결을 계속 지속되어야하구요ㅠ

superkkt의 이미지

제가 그렇게 사용하고 있습니다. 메인에서 mysql에 연결하고 mysql 변수를 extern으로 두고 다른 파일에서 가져다 씁니다. DB 연결이 필요한 루틴에서는 시작전에 mysql_ping으로 체크를 하구요.

그런데 저하고 상황이 좀 틀린게 전 DB 서버가 로컬에 있는데 질문하신분은 외부에 있네요.

차라리 매번 연결을 끊고 다시 맺고 하는것보다 mysql_ping으로 검사해서 0이 아닌값이 돌아올때만 다시 연결하도록 하면 좀 덜하지 않을까요?

======================
BLOG : http://superkkt.com

======================
BLOG : http://superkkt.com

aprilblue의 이미지

답변해주심에 너무너무 감사드립니다 ㅠㅠ

이전에는 매번 연결을 끊고 다시 맺고 하다가

이번에 접속 수가 많아져서 원문에서처럼 ret을 사용하여 mysql_ping으로

검사해서 0이 아니면 접속을 닫고 다시 연결하는 방식으로 바꾸었는데요

테스트해본 결과 항상 mysql_ping이 0이 아닌 값이 나온다는겁니다.ㅠ

wait_timeout값이 낮은것도 아니고...에러는 Mysql has gone away가

출력되구요. 안날 때가 없이 매번 이 오류가 납니다..ㅠㅠ

혹 실례가 안된다면 초간단 소스로 mysql을 전역변수로 선언한 예를

부탁드리면 안될런지 ㅠㅠ

superkkt의 이미지

MYSQL mysql;
char *db_table;
 
static void
Mysql_init(void)
{
	MYSQL_RES *res = NULL;
	char query[BUF_MAX];
	char *db_host = NULL;
	char *db_user = NULL;
	char *db_passwd = NULL;
	char *db_name = NULL;	
 
	/* 설정파일에서 값을 가져옴 */
	db_host = config_get_value("DBHost");
	db_user = config_get_value("DBUser");
	db_passwd = config_get_value("DBPasswd");
	db_name = config_get_value("DBName");
	db_table = config_get_value("DBTable");
 
	/* MySQL 연결 */
	mysql_init(&mysql);
	if(!mysql_real_connect(&mysql, db_host, db_user, 
					db_passwd, db_name, 3306, NULL, 0)) {
		Log(FATAL, (char *) mysql_error(&mysql));
	}
 
	/* 테이블이 있는지 조사 후에 없으면 새로 생성 */
	snprintf(query, BUF_MAX, "SELECT * FROM %s", db_table);
	res = DB_query(&mysql, query);
	if(!res) {
		snprintf(query, BUF_MAX, "CREATE TABLE %s(no INT(5) "
			"PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) "
			"NOT NULL, display VARCHAR(255) NOT NULL, msg "
			"TEXT NOT NULL, time VARCHAR(20) NOT NULL)", db_table);
		res = DB_query(&mysql, query);
		if(!res) 
			Log(FATAL, (char *) mysql_error(&mysql));
	}
	else {
		mysql_free_result(res);
	}
}

처음 연결하는 부분은 특별한건 없습니다. 저렇게 되어있고 main.h 파일에서 mysql을 extern으로 선언하구요..

http://dev.mysql.com/doc/refman/4.1/en/gone-away.html

여기에 잘 설명이 되어있으니 이중에 하나가 문제가 아닌지 한번 확인해 보세요~

에고~ 코드 쓸때 어떻게 해야하는지 모르겠네요.. 들여쓰기가 하나도 안먹네요..

======================
BLOG : http://superkkt.com

======================
BLOG : http://superkkt.com

aprilblue의 이미지

url과 소스를 보고 얼른 체크해봐야겠네요 ㅠㅠ

peccavi의 이미지

"mysql 5.x 버전부터는 mysql_ping에서 연결이 끊어졌더라도 자동으로 재접속을 안한다는걸 mysql 사이트에서 읽은적이 있습니다."

이 내용이 나와있는 문서 주소 알고계시는분 답변좀 부탁드립니다.
아무리 찾아봐도 없네요.. ㅜ_ㅡ

----
jai guru deva om...

----
jai guru deva om...

superkkt의 이미지

http://mysql.org/doc/refman/5.0/en/mysql-ping.html

밑에 두번째 user comment에 있는 내용을 보고 말씀드렸던 겁니다. 근데 정작 api description에는 이런 내용이 안적혀 있네요. 확실한건지 여부는 잘 모르겠습니다^^

-추가-

http://mysql.org/doc/refman/5.0/en/mysql-options.html

여기 보니까 해당 옵션이 5.0.3부터 default로 off 되었다는군요. 근데 여전히 이 옵션이 mysql_ping()에서 automatic reconnect 여부를 결정하는건지는 확실히 모르겠네요.

======================
BLOG : http://superkkt.com

======================
BLOG : http://superkkt.com

peccavi의 이미지

superkkt님이 바로 답변해 주시다니.. ㅋㅋ

감사합니다. 내용은 좀 더 봐야할것 같네요..

----
jai guru deva om...
http://peccavi.net

----
jai guru deva om...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.