标题
服务器之王! [坛主CLQ的服务器程序开发日记,综合了众多C/C++程序崩溃的原因,强烈推荐!]
clq
另外如果失败 tm * 的结果是有可能为 NULL 的,所以一定要校验! 要不就只好崩溃了.
clq
mysql 的连接数即使已经设置为 1500 这样很高的数,但在操作非常高速的场合,比如我在更新股票报价时,用短连接仍然会出现连接失败的问题.虽然这时去查看数据库的状态显示只有 7 个连接. 一个现象是其实仍然是存在很多实际的 tcp 连接的因为 netsata -a 的结果显示有很多 TIME_WAITE 状态的 3306 端口的连接.
不过奇怪的是这只是在安装成运行状态的 mysql 5.0 下才会出现,而安装成开发状态的另一台机器上就不会这样,出现连接不上的情况非常少.不过安装成开发状态的 mysql 明显要慢得多.
clq
mysql的一些特性
2008-05-07 18:08
1。开启事务之前需要rollback 连接句柄。(清理垃圾)
2。mysql_ping 失败,程序需要处理重连逻辑;
3。mysql_query()执行的SQL语句是一个以‘\0’结尾的字符串,而mysql_real_query()执行的字符串长度是参数指定的,
因此,前者不能不能包含二进制数据(二进制数据中可能会包含‘\0’,导致被认为到达字符串末尾)
实际使用中,推荐使用mysql_real_query
4。mysql C API 中SQL不需要 ';' 结尾;
5。mysql 转义;(老问题了)
6。所有update 语句,建议后边调用函数判断受影响的行数,是否是自己预期值;
7。mysql_real_connect 需要设置连接超时时间,特别是处理重连逻辑的时候,以免程序堵死;
8。程序rollback时候, 需要习惯性的校验应用的错误码,避免错误码没有赋值,调用者以为调用成功,造成漏洞;
9。多线程环境下使用libmysqlclient_r 库,非libmysqlclient 库
10。mysql_real_connect/mysql_init 多线程环境下调用需要加锁;
11。使用mysql_real_escape_string, 需要注意目标缓冲区是 2*n+1 大小;
12。mysql_store_result 这个函数是分配的内存的。 使用完需要释放,避免内存泄露;
1 mysql的事务尽量小,使用完,立即commit或rollback.不要起一个过大的事务。
2 mysql的隔离级别注意使用 Read Commited。不然会产生锁间隙的问题。
3 避免尝试去锁一个不存在的记录,for update语句where条件请使用主键。避免过多的for update.
4 select语句必须使用索引,where条件避免使用 or 或者在条件中运用运算表达式,会造成索引失效。
5 联合索引可以替代单独的索引。如果已有联合索引,不需要重复建立单独的索引。索引过多会导致插入变慢。注意是联合索引的第一个可以省略。 避过(f1,f2),可以省略f1的单独索引,但是不能省略f2的单独索引。
6 where条件,结果集不要太大,如果超过30%,索引会时效,会导致mysql扫描全表。不确定时,请用explain做检测。
7 mysql单表记录保持在1000W以下,以获得较好的性能。
8 mysql数据库链接数不能过多,请保持在200以下。
9 修改mysql 锁等待时间,默认为50s,避免for update等待时间超长,造成系统阻塞 innodb_lock_wait_timeout
--------------------------------------------------
来自 http://hi.baidu.com/22000254/blog/item/16576fea336c7fd6d439c9ee.html
感觉不可信?
clq
Window下Socket程序常见问题:
对于有连接的TCP操作,常见的多线程问题有。
1、进程的10连接限制。
2、多线程同步Socket阻塞操作时导致大量线程挂起,巨量的上下文切换导致效率低下。
3、对于短连接操作,频繁的Connect、Close会导致大量的本地端口被占用而无法立刻释放(window有默认2分钟的Close Time_Waite状态,此时端口不能再次使用)。而作为客户端,window的出站端口默认只有(1025~5xxx),如果2分钟内的TCP连接数超过这个范围,Socket操作将失败。
解决方法:
1、破解系统的限制
2、使用同步非阻塞(对于Connect操作将引发一个连接不可立刻完成的异常,不予处理,但必须通过查询是否可以发送数据的状态来判断连接是否完成)、同步阻塞操作前使用Select或者POLL确定Socket是否有数据可以操作、异步Socket。
3、修改window的默认出站端口的上限、修改Time Waite的参数(不应该太短)
--------------------------------------------------
来自 http://bbs.im520.net/redirect.php?tid=6333&goto=lastpost
不过感觉也不是这个原因引起的.
clq
今天又产生了一次 std::string 引用记数的问题. vc6 对同样的字符串是有可能保存一份内存我是知道的,没想到只读性的在多线程中访问还是会出错.
具体是一个全局类实例,其有 std::string 的成员,当在多线程中直接用它给一个变量赋值是没问题,但要操作具体的成员函数或者成员变量时就会出错.
例如这个的函数,如果参数 1 是它就会出错:
bool str_eq(std::string s1, std::string s2)
{
if(s1.compare(s2) == 0)
{
return true;
}
else
{
return false;
}
}
实际上是调用了它的 compare() 函数而已,即使是使用引用记数时也不应该出错啊.真是奇怪了.但是"手工"生成一个新字符串就可以,如下:
std::string sm = m_MarkList[i].m_SendMark.c_str();
//std::string sm = m_MarkList[i].m_SendMark;//这样同样不行,要用 c_str() 这样强制构造一个新的 string 而不是可能生成引用//赋值构造函数应该会根据传入的不同参数类型进行构造,传入一个 char * 它是不可能用引用计数的
if (str_eq(sm, sendmark) == true)
//test// if (str_eq(m_MarkList[i].m_SendMark, sendmark) == true)//这样是不行的,可能是 vc6 的 std::string 用的引用记数
{
总之在多线程中不加锁定访问 stl 还是很危险,即使是只读的情况下.
clq
mysql.ini 的配置项
# max_connections=10000 //好象最大是 1910
max_connections=1500
set-variable = max_connections=1500
有区别吗?
clq
mysql 中有索引的字段用固定长度的 char 代替 varchar 后速度快了很多呀!
clq
今天发现复合索引一个很牛的问题,在字段上用 = 性能是非常好的,但如果是 >,>=.. 等其他运算符号性能会直线的下降!!
参见"[pgsql]复合索引的作用".
clq
http://www.newbt.net:8022/read.csp?fid=30&tid=3373
http://www.newbt.net:8022/read.csp?fid=9&tid=3374
--------------------------------------------------
Microsoft VC++ 2005 runtime libraries -- vs8[vc2005] 的运行库
[点击下载]
Microsoft VC++ 2005 runtime libraries
vs8[vc2005] 的运行库,如果你用了 vs2005 编译的程序最好安装一下这个库.否则会报莫名其妙的 (0x0150002) 错误,而你又用工具找不到所需要的dll.
我用
http://www.dependencywalker.com/
的工具,它会查找到最后说一个"..Side by Side.."错误.
我传的这个是 pgsql 8.3 自带的,官方下载点好象是
http://www.microsoft.com/downloads/details.aspx?FamilyID=32bc1bee-a3f9-4c13-9c99-220b62a191ee&displaylang=zh-cn
--------------------------------------------------
程序用了 pgsql 在某些版本 2003 上运行出错时的问题,没想到是微软改变了运行库搜索的原因.具体原因可参考
http://blog.vckbase.com/localvar/archive/2007/01/31/24367.html
clq
我实在是想不明白为什么 mysql 中字段从 varchar 变成固定长度的 char 后速度并没有什么提高呢? 变化只是数据文件变大,索引文件变小.
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.