pgpool分析四

pgpool的child进程负责把jdbc,psql 的连接做为frontend,并把对数据库的连接做为backend,pgpool做为中间的桥,所以当通过socket进行通信时,pgpool必须使用postgresql的通信协议

child进程对于数据库的连接是存放到pool_connection_pool中的,是根据frontend传入的用户名与数据库名查找的,如不存在就新建,新建的过程中会与pool_config->backend_desc->backend_info存在的每个数据库都建立一个连接,形成一个1:N的连接,就是frontend只接收一个连接,但backend确同时管理N个对数据库的连接;如果pool_connection_pool已满了,就把已存时间最长的那个找出来重新使用。

对于传入的SQL,pgpool是经过parse的,这个parse是从postgresql的parse的改的,改动量不大,就是把一个postgresql专有的结构体替换掉,对简简单的update或insert等,pgpool不做修改直接从frontend传到backend,走的是postgresql的通信协议,对于复杂的分布式查询,就要rewrite,主要是生成新的SQL到systemdb上去执行,sysytemdb上面装有dblink这个插件,专门用来处理多个数据库的连接,rewrite的过程一方面可以直接看英文的文档中有一部分介绍,另一部分就是看pgpoolrewrite.c这个文件,凡是需要rewrite的里面全有

对于postgresql的通信协议,就是一个字母,后面跟一个整数,之后是内容,这个字母主要表明后面数据的意义,整数表明后面数据的长度,对于结构体,也全部转化成char数据了,并没有直接传递结构体,字母是区分大小写的,大小写往往代表不同的意义,要仔结研究的话,估计要再分析postgresql的源代码,pgpool的,里面有没注释,只能看下面的执行来推断字母代表的意义

pgpool最多能同时管理128个数据库,这在程序中是通过define写死了的,初始化默认是32个chilk进程,就是前端可连入数,

你可能感兴趣的:(sql,数据库,jdbc,socket,PostgreSQL,insert)