问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

MySql数据库连接池如何配置

发布网友 发布时间:2022-04-07 08:23

我来回答

2个回答

懂视网 时间:2022-04-07 12:44

首先要了解为什么用连接池,连接池能为你解决什么问题

连接池主要的作用:

1、减少与数据服务器建立TCP连接三次握手及连接关闭四次挥手的开销,从而降低客户端和mysql服务端的负载,缩短请求响应时间

2、减少数据库的并发连接数,即解决应用服务器过多导致的数据库 too many connections 问题

如果是为了解决问题1

则在workerman中数据库连接池不是最高效的方法,反而是自找麻烦的做法。由于PHP是单进程单线程的,使用PHP实现数据库连接池,肯定需要用单独的进程去做,那么就会涉及到进程间的通讯,使得原本和mysql直接通讯的过程变成 与连接池再到mysql的通讯,增加了应用端的负载。

解决问题1最高效的方法是为每个业务进程建立一个数据库单例(例如workerman提供的DB类),实现数据库长连接,这样每个进程的所有请求都使用自己的这一个数据库长连接,整个进程的生命周期只有一次TCP握手和断开连接挥手的开销,并且应用与mysql直接通讯,没有连接池那样中间一层进程间IPC通讯,性能是最高的,没有之一。

如果是为了问题2

首先看下自己到底有多少台应用服务器,每台服务器与mysql有多收并发连接。假如你只有10台应用服务器,每个服务器50个进程,每个进程1个数据库连接,那么到mysql服务端总共只有10*50=500个并发连接(并非活跃连接),500个并发连接对于mysql来说就是小菜一碟,为了解决问题2完全没有使用连接池的必要。

假如你有1000台应用服务器,那么连接池是有必要的,但是这个连接池不能是运行在本地应用服务器上的连接池,因为1000台应用服务器就有1000个连接池,即使每个连接池只开10个连接,那么数据库的连接数也会轻松打满。所以不要指望在当前服务器上开几个task进程实现的连接池就能解决这个问题。

1000台应用服务器的集群,每台服务器上搞几个进程实现连接池同样是不靠谱的方法。真正能够解决问题2的方法是建立一个独立的数据库连接池服务器或者说集群,全局管理所有的数据库链接。

综上所述,

如果单独是为了问题1实现php的mysql连接池,那么数据库单例是比所谓的连接池更简单更高效的做法。

如果是为了实现问题2,那么想必业务也有一定的规模了,如果真心是想用workerman做个单独的连接池集群,下面是大概简单的做法,建立一些task进程,每个进程创建一个数据库连接,task进程收到sql请求后发送给mysql服务器,mysql服务器返回后task进程再把结果发给sql发起者。

连接池代码类似如下 如果是多台服务器组成的连接池集群,前面最好加一个lvs:

// task worker,使用Text协议
$task_worker = new Worker('Text://0.0.0.0:1234');
$task_worker->count = 64;
$task_worker->name = 'MysqlTask';
$task_worker->onMessage = function($connection, $sql)
{
 // 执行sql.... 得到结果,这里省略....
 $sql_result = your_mysql_query($sql);
 // 发送结果
 $connection->send(json_encode($sql_result));
};

在workerman中调用:

use WorkermanConnectionAsyncTcpConnection;

// 与远程连接池服务建立异步链接,ip为远程连接池服务的ip,如果是集群就是lvs的ip
$sql_connection = new AsyncTcpConnection('Text://ip:1234');
// 发送sql
$sql_connection->send("SELECT ... FROM .....");
// 异步获得sql结果
$sql_connection->onMessage = function($sql_connection, $sql_result)
{
 // 这里只是打印结果
 var_dump(json_decode($task_result));
};
// 执行异步链接
$sql_connection->connect();

更多workerman知识请关注PHP中文网workerman教程栏目。

热心网友 时间:2022-04-07 09:52

连接先建立一些连接,并且这些连接允许共享,因此这样就节省了每次连接的时间开销。Mysql数据库为例,连接池在Tomcat中的配置与使用。
1、创建数据库Student,表student
2、配置server.xml文件。Tomcat安装目录下conf中server.xml文件。
<GlobalNamingResources>
<Resource
name="jdbc/DBPool"
type="javax.sql.DataSource"
password=""
driverClassName="com.mysql.jdbc.Driver"
maxIdle="2"
maxWait="5000"
username="root"
url="jdbc:mysql://localhost:3306/student"
maxActive="3"
/>
</GlobalNamingResources>
name:指定连接池的名称
type:指定连接池的类,他负责连接池的事务处理
url:指定要连接的数据库
driverClassName:指定连接数据库使用的驱动程序
username:数据库用户名
password:数据库密码
maxWait:指定最大建立连接等待时间,如果超过此时间将接到异常
maxIdle:指定连接池中连接的最大空闲数
maxActive:指定连接池最大连接数
3、配置web.xml文件。
<web-app>
<resource-ref>
<description>mysql数据库连接池配置</description>
<res-ref-name>jdbc/DBPool</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
</web-app>
4、配置context.xml文件
与server.xml文件所在的位置相同。
<Context>
<ResourceLink
name="jdbc/DBPool"
type="javax.sql.DataSource"
global="jdbc/DBPool"
/>
</Context>
5、测试
DataSource pool = null;
Context env = null;
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try{
env = (Context)new InitialContext().lookup("java:comp/env");
//检索指定的对象,返回此上下文的一个新实例
pool = (DataSource)env.lookup("jdbc/DBPool");
//获得数据库连接池
if(pool==null){out.printl("找不到指定的连接池!");}
con = pool.getConnection();
st = con.createStatement();
rs = st.executeQuery("select * from student");
}catch(Exception ex){out.printl(ne.toString());}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 黑龙江债权转让合同纠纷该怎样取证 安徽债权转让合同纠纷应该怎么样取证 房产官司律师费多少 如何用快捷键删除电脑上的垃圾文件 蜗牛是怎样生出来的 怎样让电脑主机一插上电源就开机? 台式电脑电源怎么样直接能启动 电脑开关电源在不接负载的时候如何启动? 辣炒海鲜菇的做法有哪些 2008年的电脑的电源灯怎么启动 怎样在除蘑菇的苦味 vivoy85忘记密码了连答案也忘记了怎么办,求帮忙,好急啊! vivoy&#x2006;85忘记开机密码和保密密码怎么办? vivo y85 忘记密码该怎么办 vivoy85手机密码忘记了怎么办? 常用的被子植物的分类系统? 草本 木本植物,被子裸子植物 草本与木本都属于被子植物吗?它们是单子叶还是双子叶 幼师上岗考试考什么 幼儿园教师招聘笔试考什么? 学前教育教师招聘考试学科专业知识考什么? 以前看苹果软件时无意中看到一篇文章,是说IOS和安卓都能下的十八应用,包含了那好吧,现在找不到了 如何看待印度宣布再禁用118款中国App这件事? 影响煤泥烘干机的运行速度的因素有哪些 中煤煤泥烘干设备的特点是什么? 煤泥烘干机的优点有那些? 大力发展特色矿业循环经济 打造国内一流特大型能源化工集团 谁能给我推荐一篇比较好的煤泥烘干机介绍文章?最好有煤泥烘干机的技术参数 怎么选用合适的烘干机?烘干机设备?主要是工业中的煤泥烘干机 康巴丝wf闹钟怎么调 济南康巴丝9858万年历怎么调星期 康巴斯带月、日和星期和时间的温度计怎么调呢?日期和星期不符,定点、闹钟去不点。请朋友帮助。谢谢 电脑蓝牙不好用了 你好,头条号娱乐领域怎么写介绍,可以帮下我吗? 蓝牙掉码原因 数据结构,麻烦大家帮帮忙。(选择题) 面包机可以和面再接着发面吗? 对于二维数组,有行优先顺序和什么两种不同的存储方式 数据结构 作业谢谢 多维数组是线性结构吗?为什么有按行或列2种存储 c语言中,一位数组的逻辑结构是(),存储结构式();对二维数组或*数组分哪两种存储方式 多维数组在里计算机中内存中存放方式为什么? 在C中,多维数组元素的存储顺序是按照什么原则进行?