用户
 找回密码
 入住 CI 中国社区
搜索
查看: 3760|回复: 1
收起左侧

[讨论/交流] CodeIgniter的多数据库mysql长久连接问题

[复制链接]
发表于 2011-5-29 17:07:30 | 显示全部楼层 |阅读模式
使用以下代码进行多数据库连接操作:
                               
                                $DB1 = $this->load->database('read',TRUE);
                                $DB2 = $this->load->database('write',TRUE);
                                $DB1->query('SELECT * FROM article');
                                ...
                               
                                初始化两个数据库连接,并使用第一个执行数据库查询,这时CI报错了,信息居然是含有DB2里的数据库名+DB1的表名。(read配置数据库为myblog,write的数据库为oophp) ,额,比较诡异。。。
                               

                               
A Database Error Occurred

Error Number: 1146

Table 'oophp.article' doesn't exist

SELECT * FROM article

Filename: D:\ci\system\database\DB_driver.php

Line Number: 330

                               
                        于是,翻看ci的数据库驱动源码并debug,终于找到了原因,是mysql长久连接的问题,使用同一个主机的MYSQL, 并使用php内置的mysql数据库驱动且使用长久连接时(CI 默认的配置方式),如果连接有多个,将会使用最后的数据库连接执行查询。即使是传入mysql_query() 里的conn_id是$DB1,执行查询的仍然是最后的连接,也就是$DB2的连接,         在mysql_driver.php里对_execute和_error_message方法debug可以看出
                               
                        resource(46) of type (mysql link persistent)
                        --------------------------
                        resource(49) of type (mysql link persistent)
                        --------------------------
                        resource(46) of type (mysql link persistent) string(41) "wrong:Table 'oophp.article' doesn't exist"

                        注:        resource(46)是DB1的conn_id, resource(49) 是DB2的conn_id, oophp 是DB2的数据库,article是DB1的表
                               
                                实际上查询的应该是:
                                $DB2->query('SELECT * FROM article');
                                也就是说,SQL语句是$DB1的,使用的配置也是$DB1的,连接却是$DB2的数据库连接。
                                如果两个数据库有相同的表,或者使用读写分离的方式对同一个库操作,这种错误几乎是很难被察觉的 !
                               
                                解决方法
                                1. 在配置里禁用长久连接
                                2 .如果要使用同一主机的多个数据库的长久连接,可以使用不同的数据库驱动,一个使用mysql,一个使用mysqli
                                3. 最后发现,两者都使用mysqli 长久连接的话(推荐), 也没有这样的问题。这算不算是php的mysql扩展的一个bug?
                                总的来说是PHP的mysql扩展的问题,与CI关系不大,不知新版本有没这种问题?
                                测试主机:PHP/5.2.13  mysql服务器版本: 5.1.43-community OS: win XP
发表于 2011-5-29 22:18:25 | 显示全部楼层
多翻手册,的确好处多多,呵呵

本版积分规则