当前位置:  数据库>其它
本页文章导读:
    ▪php PDO (转载)          PDO(PHP Data Object) 是PHP 5新出来的东西,在PHP 6都要出来的时候,PHP 6只默认使用PDO来处理数据库,将把所有的数据库扩展移到了PECL,那么默认就是没有了我们喜爱的php_mysql.dll.........
    ▪Postgresql数据库的一些字符串操作函数      最近开始研究PostgreSQL的相关知识,写了一个简单的存储结构,慢慢的发现PostgreSQL还是很值得去研究的---- 建立小时记录与日记录的关联规则DROP FUNCTION IF EXISTS group_tbl_moburlvisit (name, timestamp);C.........
    ▪逻辑读产生Cache Buffer Chain(简称CBC) Latch的解析      测试环境:版本11gR2 SQL> select * from v$version where rownum=1; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production   一.........

[1]php PDO (转载)
    来源:    发布时间: 2013-11-07

 

 

 

 

PDO(PHP Data Object) 是PHP 5新出来的东西,在PHP 6都要出来的时候,PHP 6只默认使用PDO来处理数据库,将把所有的数据库扩展移到了PECL,那么默认就是没有了我们喜爱的php_mysql.dll之类的了,那怎么办捏,我们只有与时俱进了,我就小试了一把PDO。(本文只是入门级的,高手可以略过,呵呵)


【PDO是啥】

PDO是PHP 5新加入的一个重大功能,因为在PHP 5以前的php4/php3都是一堆的数据库扩展来跟各个数据库的连接和处理,什么php_mysql.dll、php_pgsql.dll、php_mssql.dll、php_sqlite.dll等等扩展来连接MySQL、PostgreSQL、MS SQL Server、SQLite,同样的,我们必须借助ADOdb、PEAR::DB、PHPlib::DB之类的数据库抽象类来帮助我们,无比烦琐和低效,毕竟,php代码的效率怎么能够我们直接用C/C++写的扩展斜率高捏?所以嘛,PDO的出现是必然的,大家要平静学习的心态去接受使用,也许你会发现能够减少你不少功夫哦。

 

【安装PDO】

我是在Windows XP SP2 上面,所以嘛,整个过程都是在Windows行进行的啦,至于Linux/FreeBSD 等平台,请自行查找资料设置安装。
我的是PHP 5.1.4,已经自带有了php_pdo.dll的扩展,不过需要稍微设置一下才能使用。

打开 c:\windows\php.ini ,那是我的PHP配置文件,找到下面这行:
extension_dir
这个就是我们扩展存在的目录,我的PHP 5扩展是在:C:\php5\ext,那么我就把这行改成:

extension_dir = "C:/php5/ext"


然后再往php.ini下面找到:

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;


下面有一堆类似 ;extension=php_mbstring.dll 的东西,这里就是PHP扩展加载的配置了,我们再最后面添加上我们PDO的扩展:

extension=php_pdo.dll
extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll
extension=php_pdo_mssql.dll
extension=php_pdo_odbc.dll
extension=php_pdo_firebird.dll
;extension=php_pdo_oci8.dll


各种PDO的驱动,能给加上的全给加上,不过后面的php_pdo_oci8.dll,因为我没有安装Oralce数据库,所以没有这个,就使用分号注释掉它。然后重启我们的Web服务器, IIS/Apache,我的是IIS,嘿嘿,表鄙视我,在Windows上,简单嘛。
重启后,在我们Web服务器的文档目录下写一个phpinfo.php的文件,加上这些:


<?
phpinfo();
?>


然后打开我们可爱的浏览器:IE/FireFox,我的是FireFox 2.0,刚下载的,很爽,不怕流氓软件,哈哈。
在浏览器里面输入:http://localhost/phpinfo.php,如果你的这个页面路径不一致,请自行输入。
输出的内容中,如果你能够顺利的看到:

PDO
PDO support enabled
PDO drivers  mysql, pgsql, sqlite, mssql, odbc, firebird  


后面有各种驱动的说明,
PDO_Firebird,pdo_mssql,pdo_mysql,PDO_ODBC,pdo_pgsql,pdo_sqlite

 

那么,恭喜你安装成功了,否则请仔细检查上面的步骤。

 

【牛刀小小试验】

我用的是MySQL 4.0.26,但是我个人推荐大家使用 MySQL 4.1.x 或者 MySQL 5.0.x,因为那些版本有很多有趣的东西值得去学习。我们这里PDO需要连接的就是我的MySQL 4.0啦,如果你没有安装MySQL,请自行安装。我们建立好了MySQL,并且在test库里添加了表foo,包括 id,name,gender,time等四个字段。

我们开始构造第一个PDO应用,建立一个pdo.php文件在Web文档目录下:

 

<?php
$dsn = "mysql:host=localhost;dbname=test";
$db = new PDO($dsn, 'root', '');
$count = $db->exec("INSERT INTO foo SET name = 'heiyeluren',gender='男',time=NOW()");
echo $count;
$db = null;
?>

 

 

不明白啥意思,俺们来慢慢讲讲。这行:
$dsn = "mysql:host=localhost;dbname=test";
就是构造我们的DSN(数据源),看看里面的信息包括:数据库类型是mysql,主机地址是localhost,数据库名称是test,就这么几个信息。不同数据库的数据源构造方式是不一样的。

$db = new PDO($dsn, 'root', '');
初始化一个PDO对象,构造函数的参数第一个就是我们的数据源,第二个是连接数据库服务器的用户,第三个参数是密码。我们不能保证连接成功,后面我们会讲到异常情况,这里我们姑且认为它是连接成功的。

$count = $db->exec("INSERT INTO foo SET name = 'heiyeluren',gender='男',time=NOW()");
echo $count;
调用我们连接成功的PDO对象来执行一个查询,这个查询是一个插入一条记录的操作,使用PDO::exec() 方法会返回一个影响记录的结果,所以我们输出这个结果。最后还是需要结束对象资源:
$db = null;

默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样:
$db = new PDO($dsn, 'root', '', array(PDO::ATTR_PERSISTENT => true));

一次操作就这么简单,也许跟以前的没有太大区别,跟ADOdb倒是有几分相似。

 

【继续了解】

如果我们想提取数据的话,那么就应该使用数据获取功能。(下面用到的$db都是上面已经连接好的对象)

<?php
foreach($db->query("SELECT * FROM foo")){
    print_r($row);
}
?>



我们也可以使用这种获取方式:

<?php
$rs = $db->query("SELECT * FROM foo");
while($row = $rs->fetch()){
    print_r($row);
}
?>



如果想一次把数据都获取到数组里可以这样:

    
[2]Postgresql数据库的一些字符串操作函数
    来源:    发布时间: 2013-11-07

最近开始研究PostgreSQL的相关知识,写了一个简单的存储结构,慢慢的发现PostgreSQL还是很值得去研究的

--
-- 建立小时记录与日记录的关联规则
DROP FUNCTION IF EXISTS group_tbl_moburlvisit
(name, timestamp);

CREATE FUNCTION group_tbl_moburlvisit
(
_tgrp name,
_tick timestamp
)
RETURNS name
AS $$
DECLARE
_strtick name;
_grpname name;
_tbregex name;
_subtbl name;
_grps name;
_gfmt name;
_tfmt name;
_tmp integer;
_cursor refcursor;
BEGIN
-- 确保只能从比汇聚时间小一个级别的数据中进行汇聚
IF _tgrp = 'H1' THEN _grps = '1Hour'; _gfmt = 'YYYYMMDDHH24'; _tfmt = 'YYYYMMDDHH24..';
ELSIF _tgrp = 'D1' THEN _grps = '1Day'; _gfmt = 'YYYYMMDD'; _tfmt = 'YYYYMMDD..';
ELSIF _tgrp = 'M1' THEN _grps = '1Month'; _gfmt = 'YYYYMM'; _tfmt = 'YYYYMM..';
ELSIF _tgrp = 'Y1' THEN _grps = '1Year'; _gfmt = 'YYYY'; _tfmt = 'YYYY..';
END IF;
_grpname := 'tbl_moburlvisit_' || to_char(_tick, _gfmt);
_tbregex := 'tbl_moburlvisit_' || to_char(_tick, _tfmt);
RAISE DEBUG 'Group for %, To: %, From: %', _grps, _grpname, _tbregex;

-- 获取所有符合命名规则的表,如无则退出
EXECUTE 'SELECT count(*) FROM pg_class WHERE relname ~ ' || quote_literal(_tbregex) INTO _tmp;
IF _tmp <> 0 THEN
RAISE DEBUG 'Group % sub-tables into %', _tmp, _grpname;
ELSE
RAISE DEBUG 'Sub-tables not found: %', quote_literal(_tbregex);
RETURN NULL;
END IF;

-- 检查现有复合表的子表关系,并将该子表和复合表的继承关系去除
EXECUTE 'select count(*) from pg_class where relname = ' || quote_literal(_grpname) INTO _tmp;
IF _tmp <> 0 THEN
OPEN _cursor FOR EXECUTE 'select a.relname from pg_catalog.pg_class a join pg_catalog.pg_inherits b on a.oid = b.inhrelid join pg_catalog.pg_class c on b.inhparent = c.oid where c.relname = ' || quote_literal(_grpname);
LOOP
FETCH _cursor INTO _subtbl;
IF NOT FOUND THEN EXIT; END IF;
RAISE DEBUG 'Cut table % from %', _subtbl, _grpname;
EXECUTE 'ALTER TABLE ' || _subtbl || ' NO INHERIT
    
[3]逻辑读产生Cache Buffer Chain(简称CBC) Latch的解析
    来源: 互联网  发布时间: 2013-11-07

测试环境:版本11gR2
SQL> select * from v$version where rownum=1;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

 

一、逻辑读的过程
  1、Oracle以每个块的文件号、块号和类型做HASH运算,得到HASH值。根据HASH值,到HASH表中取出指定块的内存地址
  2、获取CBC Latch(实验的重点测试部分)
  3、根据HASH值,搜索CBC链表
  4、根据DBA找到BH(Buffer Header)加Buffer Pin
  5、加完Buffer Pin马上释放CBC Latch
  6、访问Buffer开始fetch数据
  7、获取CBC Latch
  8、释放Buffer Pin
  9、释放CBC Latch

 

二、取T1表的第一行数据及ROWID,根据dbms_rowid包查出这行数据的文件号、块号
SQL> select rowid,dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block#,id,name from gyj.t1 where rownum=1;

ROWID                   FILE#     BLOCK#         ID NAME
------------------ ---------- ---------- ---------- ----------
AAASP9AAGAAAACHAAA          6       135          1 aaaaa

这里的DBA(Data Block Address)就是由6号文件和135号块组成

 

三、根据文件号块号获取CBC Latch的地址
SQL> select hladdr from x$bh where file#=6 and dbablk=135;
  HLADDR
----------------
00000003A4282A90

 

四、根据CBC Latch的地址可以查出这个CBC Latch被获得的次数
1.获取CBC Latch的次数为245
SQL> select addr,name,gets from v$latch_children  where addr='00000003A4282A90';
ADDR             NAME                                                                   GETS
---------------- ---------------------------------------------------------------- ----------
00000003B09F7C58 cache buffers chains                                                    245

2.再次读取T1表的第一数据,即产生一次逻辑读
SQL>select id,name from gyj.t1 where rowid='AAASP9AAGAAAACHAAA';
   ID      NAME
   -------- ------------
    1     gyj1

3.CBC Latch的次数变为247,说明一次逻辑读产生两次CBC Latch
SQL> select addr,name,gets from v$latch_children  where addr='00000003A4282A90';
ADDR             NAME                                                                   GETS
---------------- ---------------------------------------------------------------- ----------
00000003A4282A90 cache buffers chains                                                    247

 

五、查本会话下的进程号
SQL> select spid from v$session s,v$process b where s.paddr=b.addr and s.sid in(select sid from v$mystat where rownum=1);

SPID
------------------------
2416

 

六、利用Dtrace工具跟踪
1.编写个简单的dtrace脚本
vi dtrace.d

#!/usr/sbin/dtrace -s -n
dtrace:::BEGIN
{
        i=1;
}

pid$1:::entry
{
        printf("i=%d PID::entry:==%s:%s:%s:%s %x %x %x %d %x %x",i, probeprov, probemod, probefunc, probename,arg0,arg1,arg2,arg3,arg4,arg5);
        i=i+1;
}

2.授权限
chmod 755 dtrace.d

3.执行dtrace命令生成跟踪日志
./dtrace.d -x switchrate=1hz -b 32m 2416 > dtracecbc.log --用这条命令加大了缓存,避免丢失日志

4.显示主要dtrace部分日志,在dtracecbc.log中搜索latch地址:3A4282A90

  CPU     ID                    FUNCTION:NAME
  --逻辑读开始
  1  63919                    kcbgtcr:entry i=592 PID::entry:==pid2416:oracle:kcbgtcr:entry fffffd7ffc98bc00 0 2fe 0 23dede0 fffffd7fffdfa7a0
  --获取CBC Latch
  1 128720                  sskgslcas:entry i=593 PID::entry:==pid2416:oracle:sskgslcas:entry 3a4282a90 0 1 0 0 3a4c953d0          
  1  60714                     ktrexf:entry i=594 PID::entry:==pid2416:oracle:ktrexf:entry fffffd7fffdfa7a0 d7fcd60 0 15392235540 1fe8 23dc9f0
  1  64185                     kcbzgs:entry i=595 PID::entry:==pid2416:oracle:kcbzgs:entry 1 d7fcd60 0 0 0 23dc9f0
  1  53939           kssadf_numa_intl:entry i=596 PID::entry:==pid2416:oracle:kssadf_numa_intl:entry 23 3a4145900 3a487d9e8 0 0 1d
  --根据DBA找到BH(Buffer Header)加Buffer Pin
  1 128720                  sskgslcas:entry i=597 PID::entry:==pid2416:oracle:sskgslcas:entry 3957f6280 0 1 0 3957f6238 3957f6238
  --加完Buffer Pin马上释放CBC Latch
  1 128723                 sskgsldecr:entry i=598 PID::entry:==pid2416:oracle:sskgsldecr:entry 3a4282a90 1 1 0 1 2000000000000000          
  1  63951                     kcbcge:entry i=599 PID::entry:==pid2416:oracle:kcbcge:entry fffffd7ffc98bc00 0 77 0 fffffd7ffc98b7dc 0
  1  64116                  kcbds2pbh:entry i=600 PID::entry:==pid2416:oracle:kcbds2pbh:entry fffffd7ffc98bc00 0 77 0 fffffd7ffc98b7dc 0
  1  60179                     ktcckv:entry i=601 PID::entry:==pid2416:oracle:ktcckv:entry fffffd7ffc98bc00 fffffd7ffc98b7d4 77 0 3a3c935f0 0
  1 104774                     kafger:entry i=602 PID::entry:==pid2416:oracle:kafger:entry 39572e064 fffffd7fffdfb200 39d84e4f0 2 1 1
  1  83919                     kpofcr:entry i=603 PID::entry:==pid2416:oracle:kpofcr:entry fffffd7fffdfb4b0 1 39d84e4f0 2 4c30d40 3a4fd3790
  1 124023                     ttcrxh:entry i=604 PID::entry:==pid2416:oracle:ttcrxh:entry d8055e8 d7f58f0 fffffd7fffdfafe0 48 214 1
  1 209006                     memcpy:entry i=605 PID::entry:==pid2416:libc.so.1:memcpy:entry ddfa329 fffffd7fffdfafe0 30 48 ddfa359 d7f5a00
 

    
最新技术文章:
 




特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3