数据库连接池SQL Relay简介

作者:zhanhailiang 日期:2014-12-27

简介

SQLRelay 是一个持久化的数据库连接池,用来为 Unix 或者 Linux 提供数据库连接池、代理以及负载均衡的功能。

曾在2004淘宝架构迁移充当管理Oracle数据库链接的中间件,请见:

  1. 《淘宝业务发展及技术架构》分享
    文字版
  2. 《淘宝业务发展及技术架构》分享 PPT版

连接池示意图:

负载均衡示意图:

功能特性

  1. 加速数据库驱动的基于 Web 的应用程序
  2. 增加 Web 应用程序的可扩展性
  3. 分布式的访问复制的数据库系统
  4. 对数据库访问进行节流
  5. 从不被支持的平台上访问某个数据库
  6. 可以轻松的对数据库系统进行移植

支持的数据库

  1. Getting Started With Oracle
  2. Getting Started With MySQL
  3. Getting Started With PostgreSQL
  4. Getting Started With Sybase
  5. Getting Started With Microsoft SQL Server 2000 Desktop Engine
  6. Getting Started With IBM DB2
  7. Getting Started With Firebird
  8. Getting Started With SQLite
  9. Getting Started With Microsoft Access
  10. Getting Started With Blackray
  11. Getting Started With ODBC

支持的语言

  1. C++
  2. C
  3. C#
  4. Perl
  5. PHP
  6. Python
  7. Ruby
  8. Java
  9. TCL
  10. Erlang

请见:http://sqlrelay.sourceforge.net/sqlrelay/

本文将讲解如何基于SQL Relay,使用PHP进行Mysql操作。

安装

安装rudiments-0.48:

./configure
make && make install

安装sqlrelay-0.57:

./configure --with-mysql-prefix=/usr/local/mysql --with-php-prefix=/usr/local/php
make && make install

配置php.ini:

extension=sql_relay.so

配置SQL Relay:

[[email protected]~]# cd /usr/local/firstworks/etc/
[[email protected]/usr/local/firstworks/etc]# cp sqlrelay.conf.example sqlrelay.conf

其连接Mysql配置如下:

<?xml version="1.0"?>
<!DOCTYPE instances SYSTEM "sqlrelay.dtd">

<instances>

    <!-- Regular SQL Relay Instance -->
    <instance id="mysqlpool" port="12000" socket="/tmp/mysqlpool.socket" dbase="mysql" connections="3" maxconnections="5" maxqueuelength="0" growby="1" ttl="60" endofsession="commit" sessiontimeout="600" runasuser="nobody" runasgroup="nobody" cursors="5">
        <users>
            <user user="root" password="*****"/>
        </users>
        <connections>
            <connection connectionid="mysqlpool" string="user=root;password=*****;db=test" metric="1" behindloadbalancer="no"/>
        </connections>
    </instance>

</instances>

启动和停止SQL Relay

sqlr-start -id mysqlpool
sqlr-start  --trace -id mysqlpool // 跟踪调用详情
sqlr-stop

注:

1. 关于启动命令的使用,请见:http://sqlrelay.sourceforge.net/sqlrelay/admin/running.html
2. 安装SQL Relay后需要将firstworks/bin/目录添加到环境变量PATH中:

    PATH="/usr/local/firstworks/bin/:$PATH"

测试:

启动SQL Relay后可以看到如下进程:

[[email protected]/usr/local/firstworks/etc]# ps -ef|grep sqlrelay
nobody   26512     1  0 22:26 ?        00:00:00 sqlr-listener -id mysqlpool -config /usr/local/firstworks/etc/sqlrelay.conf
nobody   26519     1  0 22:26 ?        00:00:00 sqlr-scaler -id mysqlpool -config /usr/local/firstworks/etc/sqlrelay.conf
nobody   26520     1  0 22:26 ?        00:00:00 sqlr-connection -id mysqlpool -connectionid mysqlpool -config /usr/local/firstworks/etc/sqlrelay.conf
nobody   26521     1  0 22:26 ?        00:00:00 sqlr-connection -id mysqlpool -connectionid mysqlpool -config /usr/local/firstworks/etc/sqlrelay.conf
nobody   26522     1  0 22:26 ?        00:00:00 sqlr-connection -id mysqlpool -connectionid mysqlpool -config /usr/local/firstworks/etc/sqlrelay.conf
root     26579 18985  0 23:07 pts/3    00:00:00 grep sqlrelay

PHP测试脚本:

<?php
$con = sqlrcon_alloc(‘mysqlpool‘, 12000, ‘/tmp/mysqlpool.socket‘, ‘root‘, ‘******‘, 0, 1);

var_dump(sqlrcon_errorNumber ($con));
var_dump(sqlrcon_dbHostName ($con));
var_dump(sqlrcon_dbIpAddress ($con));

$cur = sqlrcur_alloc($con);

sqlrcur_sendQuery($cur, ‘select * from test‘);

var_dump(sqlrcur_totalRows ($cur));

for ($row=0; $row<sqlrcur_rowCount($cur); $row++) {
    for ($col=0; $col<sqlrcur_colCount($cur); $col++) {
        echo sqlrcur_getField($cur,$row,$col);
    }
    echo PHP_EOL;
}

sqlrcur_free($cur);
sqlrcon_free($con);

执行输出如下:

int(0)
string(9) "Localhost"
string(9) "127.0.0.1"
int(2)
1
2

参考文章

  1. php+sqlrelay+mysql实现连接池及读写负载均衡
  2. 开源数据库连接池 SQL Relay 的安装配置和应用
  3. SQL Relay官网
  4. Running SQL Relay
  5. Getting Started With MySQL
  6. Programming with SQL Relay using the PHP API
  7. SQL Relay PHP References
时间: 2024-11-25 12:20:28

数据库连接池SQL Relay简介的相关文章

数据库连接池简介,使用

一. 数据库连接池1. 数据库连接池就是存放数据库连接(Connection)的集合       我们获取一个数据库连接是一个相对很麻烦的过程,如果我们获取一个数据库连接, 使用一次以后就给它关闭了下一次再去使用的时候就要重新创建一个新的数据库连接. 所以我们提出了一个数据库连接池的概念,数据库连接池放的都是数据库连接(Connection) 我们在去使用数据库连接时候,不用再去重新创建数据库连接,而是直接从池中获取,       使用完的数据库连接,也不是直接销毁,而是要放回到连接池 2. 数

SQL数据库优化:切割、数据库连接池--【考试系统】

上篇讲到了考试过程中,开发人员需要关注cpu和内存.sql日志也不容忽视,sql日志中显示了数据库操作系统的报错日志,给排错提供了很大的便利. 考试的数据库中写入了一些监听死锁和当前最耗资源语句的SQL语句.可以及时的监控死锁和了解当前考试进行到哪一步,是抽题,还是答题,还是交卷. 其中,听到了两个词:切割.数据库连接池. 后来查了一下,发现这两种方法都可以从不同的程度上对数据库的性能进行优化. 一.切割 横向切割: 就是把行分类,常用的两种是按照时间.索引划分.时间划分:比如5年的历史数据,根

SQL面试整理(1)——数据库连接池

在web开发中,如果JSP.Servlet或EJB使用JDBC直接访问数据库,每一次数据访问请求都必须经历建立数据库连接,打开数据库,存取数据库和关闭数据库连接等操作步骤,如果频繁发生这种数据库操作,系统的性能必然会急剧下降,甚至会导致系统崩溃.数据库连接池技术是解决这个问题最常用的方法,在许多应用程序服务器(例如:Weblogic,WebSphere,JBoss)中,基本都提供了这项技术. 数据库连接池负责分配.管理和释放数据库的连接. 1. 数据库连接复用.重复使用现有的数据库连接,可以避免

Go组件学习——database/sql数据库连接池你用对了吗

1.案例 case1: maxOpenConns > 1 func fewConns() { db, _ := db.Open("mysql", "root:[email protected]/dqm?charset=utf8&parseTime=True&loc=Local") db.SetMaxOpenConns(10) rows, err := db.Query("select * from test where name =

DBCP数据库连接池的简单使用

0.DBCP简介      DBCP(DataBase connection pool)数据库连接池是 apache 上的一个Java连接池项目.DBCP通过连接池预先同数据库建立一些连接放在内存中(即连接池中),应用程序需要建立数据库连接时直接到从接池中申请一个连接使用,用完后由连接池回收该连接,从而达到连接复用,减少资源消耗的目的. 1.DBCP所依赖的jar包(以下例子基于如下jar包版本)    commons-dbcp2-2.1.1.jar       commons-logging-

javaweb学习总结(三十九)——数据库连接池

一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出.拓机.如下图所示: 二.使用数据库连接池优化程序性能 2.1.数据库连接池的基本概念 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性

c++ 实现数据库连接池

c++ 实现数据库连接池 自己尝试用c++ 新标准实现了数据库连接池,代码简化了很多. 思路: 将数据库的连接当作一个对象添加进list队列中,在连接池创建的时候就建立好队列,并添加自定义大小的连接对象,连接对象用智能指针来管理(现代c++中不应该出现delete语句),避免类似内存泄漏等内存问题,智能指针上用lambda表达式注册了delete删除函数来释放连接资源,及时归还,(其中用了std::move来转移list中的对象所有权到函数里的临时智能指针对象,当离开作用域时,自动释放.) 关于

Mybatis深入之数据库连接池原理

Mybatis深入之数据库连接池原理 简介 主要记录Mybatis数据库连接池实现原理.如何使用连接池来管理数据库连接的.连接池如何向外提供数据库连接.当外部调用使用完成之后是如何将数据库连接放回数据库连接池的. 准备 有前面的相关文章的铺垫.这里就不再从Mybatis数据库相关信息的初始化以及何时创建一个真正的数据库连接并且向外提供使用的.这两方面的过程可以参见Mybatis深入之DataSource实例化过程和Mybatis深入之获取数据库连接两篇文章. 了解Mybatis数据库连接池如何配

数据库连接池--C3P0实现

1.C3P0 简介 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Spring等. C3P0的数据库连接池的核心类是ComboPooledDataSource 使用C3P0需要在工程中导入的jar包 c3p0-0.9.2-pre5\lib下有三个jar包,如果使用MySQL数据库,只需导入c3p0-0.9.2-pre5.jar,mchange-commons-java-0.2.3两个包即可,另