为了做压测,将MYISAM引擎的表drop,建为innoDB的引擎。
再启动压测,插入的时候,mysql_stmt_prepare()全部报CR_OUT_OF_MEMORY错误。
奇怪,难道和引擎切换有关系。
执行
show variables;查看每个参数,
最终确定问题的所在:max_prepared_stmt_count=16382
于是将这个参数改大:
set global max_prepared_stmt_count=65536;
再启动压测程序,插入正常。
由此可见,myisam使用的statement池和innodb的池是不共享数据的。否则同样的语句不该出现空间满的问题。
========我是单纯的分割线,添加日期01202013=========
以上的方法是转载的,看到别人这么解决的,后来发现软件在客户那里还是频繁会出现该问题,后来经过查找,是有些地方忘了试用
mysql_stmt_close
可以说,使用了mysql_stmt_prepare,就一定要使用一个mysql_stmt_close。
mysql_stmt_close返回值为null则是成功执行,否则是执行出错了
if (mysql_stmt_close(stmt))
{
fprintf(stderr, " %s\\n", mysql_stmt_error(stmt));
}
下面是官网代码 ,自己看用法,举一反三
#define STRING_SIZE 50
#define DROP_SAMPLE_TABLE "DROP TABLE IF EXISTS test_table"
#define CREATE_SAMPLE_TABLE "CREATE TABLE test_table(col1 INT,\
col2 VARCHAR(40),\
col3 SMALLINT,\
col4 TIMESTAMP)"
#define INSERT_SAMPLE "INSERT INTO test_table(col1,col2,col3) VALUES(?,?,?)"
MYSQL_STMT *stmt;
MYSQL_BIND bind[3];
my_ulonglong affected_rows;
int param_count;
short small_data;
int int_data;
char str_data[STRING_SIZE];
unsigned long str_length;
my_bool is_null;
if (mysql_query(mysql, DROP_SAMPLE_TABLE))
{
fprintf(stderr, " DROP TABLE failed\n");
fprintf(stderr, " %s\n", mysql_error(mysql));
exit(0);
}
if (mysql_query(mysql, CREATE_SAMPLE_TABLE))