ThinkPHP3.1在多数据库连接下存储过程调用bug修正
最近使用ThinkPHP3.1进行一个项目的开发,由于该项目需要连接多台不同的数据库,所以使用如下配置方法:
<?php
return array(
//'配置项'=>'配置值'
//数据库配置
'DB_PREFIX' => '',
'DB_BLACK_FP' => array(
'db_type' => 'mysql',
'db_user' => 'xxx',
'db_pwd' => 'xxx',
'db_host' => 'xxx',
'db_port' => 3306,
'db_charset' => 'utf8',
),
'DB_BLACK_SAMPLE' => array(
'db_type' => 'mysql',
'db_user' => 'xxx',
'db_pwd' => 'xxx',
'db_host' => 'xxx',
'db_port' => 3306,
'db_charset' => 'utf8',
),
//其他配置......
);
实际开发时发现,只要调用存储过程(call xxxxx(yy);),将会导致数据库连接被关闭,后续数据库请求失败。
经查阅发现,使用PHP的mysql扩展函数调用存储过程,的确会导致后续数据库请求失败,解决方法是先调用存储过程后,手动调用一次mysql_close再重新发起连接。
再调试ThinkPHP3.1代码,发现默认单数据库配置时,执行call语句后(即调用存储过程),代码逻辑会自动重新发起数据库连接,但多数据库连接时则不会。
修正方法如下:
1.改为使用mysqli而不是mysql
//其他配置......
'db_type' => 'mysqli',
//其他配置......
2.修改框架代码:
打开框架代码ThinkPHP3.1/Lib/Driver/Db/DbMysqli.class.php第90行左右
//其他代码...... //从
$res->free_result();
//修改为
if (is_object($res)) {
$res->free_result();
} //其他代码......
3.请求框架缓存:
清除Runtime文件夹内容
按以上修改后运行,调用存储过程后不再导致后续sql执行失败,一切正常。
总结:
其实PHP的mysql扩展是支持存储过程调用的,但只支持无返回结果输出的存储过程,如果调用有返回结果输出的存储过程,在下一次查询语句执行时,会因为上一次的存储过程输出结果没有被读取也没有释放,而导致报错,所以引起后续查询语句执行失败。
解决方法是要么改用PDO或mysqli扩展,或者每次调用存储过程后重新发起数据库连接。
ThinkPHP3.1在多数据库连接下存储过程调用bug修正的更多相关文章
- 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效
数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...
- Oracle数据库连接、存储过程及调用
Oracle数据库连接.存储过程及调用 1. 定义一个存储过程 create or replace procedure getuser(eid in number, na out varchar, e ...
- J2EE之oracle、mysql存储过程调用
最近几天在研究hibernate.JPA对存储过程的调用,主要是针对有返回结果集的存储过程的调用方法,个人感觉存储过程是个好东西,虽然说heibernate对数据访问封装的比较不错,再加上他的缓存机制 ...
- c#中两种不同的存储过程调用与比较
存储过程简介 简单的说,存储过程是由一些SQL语句和控制语句组成的被封装起来的过程,它驻留在数据库中,可以被客户应用程序调用,也可以从另一个过程或触发器调用.它的参数可以被传递和返回.与应用程序中的函 ...
- SQL 存储过程调用存储过程
研究一个别人做的项目代码看到数据库里有一段存储过程调用存储过程的代码,原来的代码比较复杂. 于是自己打算写一个简单的例子学习一下. 一.首先创建了被需要被调用的存储过程. USE [MSPetShop ...
- [转]SQLSERVER存储过程调用不同数据库的数据_存储过程中通过链接服务器访问远程服务器
本文转自:http://blog.csdn.net/nnaabbcc/article/details/7967761 存储过程调用不同数据库的数据 在存储过程调用不同数据库的数据该如何做,比如在存储过 ...
- Oracle 存储过程调用返回游标的另一个存储过程。
一个扩展存储过程调用另一个存储过程,示例: 被调用存储过程:最后会返回一个游标,游标返回一个值.调用这个存储过程的存储过程同样需要获取它. procedure SearchBill --根据到货单号查 ...
- ORACLE存储过程调用Web Service
1. 概述 最近在ESB项目中,客户在各个系统之间的服务调用大多都是在oracle存储过程中进行的,本文就oracle存储过程调用web service来进行说明.其他主流数据库,比如mysql和sq ...
- .NET易忘备留 ORACLE存储过程调用
1.Oracle存储过程调用[返回信息,单体或者列表] public IResult FundBuild(string partnerId,string userId, DateTime beginD ...
随机推荐
- event.srcElement就是指向触发事件的元素,他是什么就有什么的属性
原文发布时间为:2009-06-29 -- 来源于本人的百度文章 [由搬家工具导入] 得到或设置触发事件的对象。 event.srcElement就是指向触发事件的元素,他是什么就有什么的属性 s ...
- c#中使用事务
原文发布时间为:2009-04-14 -- 来源于本人的百度文章 [由搬家工具导入] 问:为什么要用事务? 答:事务保证要么一组操作执行成功,要么全不执行。。。。 /// <summary> ...
- ASP.NET MVC 1.0 哈哈。。转过来,还没学。。
原文发布时间为:2009-06-13 -- 来源于本人的百度文章 [由搬家工具导入] ASP.NET MVC 1.0 发布了投递人 itnews 发布于 2009-03-19 00:46 评论(8) ...
- 添加一种emit的应用,反射发出,较直接调用稍慢,但好过反射与表达式树。
System.Reflection.MethodInfo mInfo = typeof(TypeParse).GetMethod("Add", System.Reflection. ...
- 用cflow工具生成代码函数调用关系【转】
转自:http://www.cnblogs.com/feng-zi/p/5469652.html . 安装 sudo apt-get install cflow .使用 cflow [options. ...
- hdu 3986(最短路变形好题)
Harry Potter and the Final Battle Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65536/6553 ...
- App Store 审核指南(最新)
简介 App 正在改变世界,丰富人们的生活,并为像您一样的开发者提供前所未有的创新机会.因此,App Store 已成长为一个激动人心且充满活力的生态系统,正为数百万的开发者和超过十亿的用户提供服务. ...
- 牛客练习赛10 E题 数列查找 (分块思想 + 莫队算法)
题目链接 数列查找 考虑分块然后跑莫队, 设$c[i]$为$i$在当前维护的区间内出现的次数, $g[i]$为在当前维护的区间内有多少个数出现次数为$i$, $bg[i]$把出现次数分块,$bg[i ...
- Codeforces 371A K-Periodic Array(模拟)
题目链接 K-Periodic Array 简单题,直接模拟即可. #include <bits/stdc++.h> using namespace std; #define REP(i, ...
- redis入门与集群部署
redis入门 redis入门级教程非常多,如http://www.runoob.com/redis/redis-backup.html,作为入门其实已经十分详细了,主要学习内容有如下几个方面吧 1. ...