开发笔记1 2012-5-3 周四
python开发一个数据同步程序,把各地市系统里的部分数据表变化,同步到省局中心数据库去,便于全省统计分析。
可以c++, java, python, perl来实现,最后选择python,数据库访问库自然采用MySQLdb, 我要快速实现。
功能够简单,synccli.py---->syncsrv.py.
出现两个问题需要记录下:
1) MySQLdb内存泄漏问题:
MySQLdb.connect(host=db_host, port=db_port, user=db_user, passwd=db_pwd, db=db_name)
----没问题
MySQLdb.connect(host=db_host, port=db_port, user=db_user, passwd=db_pwd, db=db_name, charset=db_charset)
----指定一个编码charset, 内存泄漏非常严重,一个压力测试下去,1G内存很快玩完。
MySQLdb.connect(host=db_host, port=db_port, user=db_user, passwd=db_pwd, db=db_name, charset=db_charset, use_unicode=False)
----指定一个编码charset, 同时use_unicode=False,又没有问题了。
搞不清楚怎么这个bug没有解决,也没时间去看MySQLdb源代码,它也不过调用mysql的c库,c库是没这个问题的,可能在编码转换时没处理好。
所以如果要指定编码时,如我们常常要gbk或utf,那就一起用use_unicode=False。
2) MySQLdb查询更新缓存问题:
这个问题今天困扰了我小半天,我在navicat上对某字段进行update, python代码里竟然没有变化,以前没有出现这个现象的,总查自己代码那里搞错了。
后来网上查查,也有人碰到,说是要调用commit()。
原来是这次mysql建立数据库时,用的是InnoDB,以前都是用MyISAM,我都不喜欢用InnoDB,合作方用到InnoDB,没办法,代码里也没有真用到事务。
MySQLdb行为还真是的,查询也要调用commit(), 非常思维啊。
代码是加上conn.commit()之后就问题解决了,不知道有什么后遗症没有,不管了,等测试组去长久观察。