2017-12-03 27 views
-1

새로운 데이터를 수신 할 때마다 MySQL 테이블을 몇 초마다 업데이트하는 프로그램을 작성 중입니다. 이 함수는 테이블 행을 반복하고 이에 따라 데이터를 선택하는 내부 루프와 함께 끊임없이 업데이트 할 무한 루프를 가지고 있습니다. 나는 단순히 문 seen in the example code here 각 반복 후 (사기 및 드라이버 제외) 모든 MySQL의 관련 값을 삭제하려고했습니다MySQL 준비 문이 C++ 커넥터를 사용하여 무한 루프에서 정리되지 않음

Can't create more than max_prepared_stmt_count statements

:

불행하게도, 아무리 내가 뭘, 내가 가장 한심한 오류가 발생하지 않습니다.

나는 그냥 모든 값에 이전하는 경우에

stmt = NULL; 
stmt->close(); 

를 추가하는 시도했습니다.

으로 프로그램을 다시 작성하려고 시도했습니다.이 도구는 this 답변에 따라 자동으로 정리됩니다.

각 반복 후에도 MySQL 서버에 대한 연결을 닫고 다시 설정하려고 시도했지만조차도 도움이되지 않았습니다.

도와주세요.

+0

나는 그것을 애처로운 오류라고 부르지 않을 것입니다. 한계가 있기 때문에 메모리가 부족하거나 서비스 거부 공격을 완화 할 수 없습니다. 언제든지 제한을 늘릴 수는 있지만 영구 응용 프로그램의 경우에도 16,382 개의 연결이 많은 것처럼 보입니다. – Bradmage

+0

나는 그것을 얻는 것이 애처 롭다는 것을 의미했다 – Roxerg

+1

아 맞다, 예 오류 코드는 경악 할 수있다! – Bradmage

답변

1

루프에 대한 자세한 정보가 필요할 수 있습니다.

하지만 내 생각에는 stmt = con->createStatement();이 루프 내부에있는 것 같습니다. 루프가 시작되기 전에 하나의 연결 만 필요합니다.

그럼 당신은 "기본값은 16382입니다."mysql.com에서 delete stmt;

,

res = stmt->executeQuery("SELECT 'Hello World!' AS _message"); 응용 프로그램은 당신이 당신의 STMT을 닫고 종료되면, 루프의 한 Statment 여러 번 실행할 수 있습니다 mysql.com-sysvar_max_prepared_stmt_count 당신은 단지 하나만 필요로하는 것 같은데.

+0

나는 이것을 지금 시험하고있다! 내가 충돌하거나 충돌하지 않을 때까지 기다리는 동안, 하나 더 질문합니다. 그것은 준비된 진술과 함께 작동합니까? 루프 앞에서 명령문을 선언 한 다음 setInt/setString/etc를 사용하십시오. 각 executeQuery() 전에 새 값을 받아서 함께 실행합니까? – Roxerg

+0

필자는 결국 테스트 해 볼 것입니다. 실제로는 이것이 실제로 효과가 있으며 성능이 열 배나 향상되었습니다. 고마워요, 방금 벽에 머리를 때려 눕혔습니다. – Roxerg

+1

다행 이었기 때문에 때로는 문제를보기 위해 외부 사람이 필요합니다. 저는 C++을 몇 년 동안 사용하지 않았기 때문에 구체적인 것은 말할 수 없지만, mysql은 대부분 다른 언어로 작동합니다. 말하자면, 루프 외부에서 준비 할 수 있어야하고, 루프에서 실행해야합니다. 즉 루프가 작동하는 방식입니다. – Bradmage