星期二, 七月 24, 2007

MySQL忘记超级用户口令怎么办

  如果MySQL正在运行,首先杀之: killall -TERM mysqld。
  启动MySQL:bin/safe_mysqld --skip-grant-tables &
  就可以不需要密码就进入MySQL了。
  然后就是
  >use mysql
  >update user set password=password("new_pass") where user="root";
  >flush privileges;
  重新杀MySQL,用正常方法启动MySQL 。

星期三, 七月 11, 2007

C++ 类构造
好久没用C++了,今天正好碰到一个函数返回对象的的问题,解决并顺便复习一下!
函数返回值是一个类,而这个类没有拷贝构造函数,而导致程序运行失败!缺省的赋值是没有办法解决那些在构造函数中的内存或文件等资源的!

class String {
private: char *data;

public:
String()
{
data = new char [10];
};
String(const String &);
String &operator = (const String &); };
String::String(const String &rs)
{
if(this != &rs) {
data = new char[10];
strcpy(this->data, rs.data);
}
}

String &String::operator=(const String & rs)
{
if(this != &rs)
{
delete[]data;
data = new char[10];
strcpy(this->data, rs.data);
}
return *this;
}

int main(int argc, char* argv[])
{
String s1; String s2(s1); //调用拷贝构造
String s3 = s1; //还是调用拷贝构造,为什么不调用赋值=
return 0;
}

String s2(s1);
String s3 = s1;
只是语法形式的不同,意义是一样的,都是定义加初始化,都调用拷贝构造函数。C++语言支持两种语法形式的初始化,就是上面的两种。
注意, String s3 = s1;
跟 String s3;
s3 = s1;
不同。这里则是首先调用默认构造函数初始化s3,然后使用拷贝赋值从s1那里进行拷贝。
而例子中s2和s3的构造过程都没有执行国默认构造函数。
至于为什么不同,不为什么,这就是语法,就好比循环要使用while和for,分支要使用if和switch一样,不能混用。

String c = b; //也是调用拷贝构造函数 而
String c; c = b;//这才是调用operator =
String s3 = s1; //还是调用拷贝构造,为什么不调用赋值= 这是因为这里的“=”不是运算符。它只是一种形式上规定的分隔符。

星期五, 七月 06, 2007

MySQL数据库插入性能的改进

最近,重新开始了对3年前一个项目的改进,该项目采用JDBC+MySQL的方式完成一些数据库操作,记得当时是每秒中可以插入70条左右的数据,由于可以满足当时的需要就没有太在意!

抱着软件质量就是持续不断的改进的态度,想把当初的JDBC+MySQL改为C API实现的方式,所以今天写了一个C程序客户端,测试中发现美妙中可以插入50条记录,感到可能时在什么地方用错了,到Google一些资料后,基本可以判断是采用了AOTOCOMMIT一引起的问题,所以对操作方式做了一些修改
SET AOTOCOMMIT=0
然后每插入1000条,就COMMIT一次,发现这个时候每秒可以插入2000条数据,比较满足。

可以看出,COMMIT是一个比较费时的过程
50*(COMMIT_COST + INSERT_COST) 基本等于 2000*INSERT_COST + 2*COMMIT_COST,此时客户端花的CPU比服务器要多。

继续改进,采用Prepare Statemode来降低INSERT语句的分析花费,每秒可以插入5000条
2000*INSERT_COST(SQL_PARSE+REAL_INSERT) + 2*COMMIT_COST基本等于5000*REAL_INSER + 5*COMMIT_COST
这个时候,客户端已经比服务器端花的时间少了,且服务器端出现了花费了更多的系统CPU,应该时磁盘IO操做便多的缘故!