扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
ADODB 是 Active Data Objects Data Base 的简称,它是一种 PHP 存取数据库的函式组件。现在 SFS3 系统 (校园自由软件交流网学务系统) 计划的主持人陈莹光老师,决定采用此一组件,为了让更多有心参与该项目的伙伴们能够顺利加入发展的行列,小弟认为有必要把 ADODB 的中文入门介绍写出来,以方便伙伴们参考备查。
创新互联建站服务项目包括都匀网站建设、都匀网站制作、都匀网页制作以及都匀网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,都匀网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到都匀省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
虽然 PHP 是建构 Web 系统强有力的工具,但是 PHP 存取数据库的功能,一直未能标准化,每一种数据库,都使用另一种不同且不兼容的应用程序接口(API)。为了填补这个缺憾,因此才有 ADODB 的出现。一旦存取数据库的接口予以标准化,就能隐藏各种数据库的差异,若欲转换至其它不同的数据库,将变得十分容易。
目前 ADODB 支持的数据库种类非常地多,例如:MySQL, PostgreSQL, Interbase, Informix, Oracle, MS SQL 7, Foxpro, Access, ADO, Sybase, DB2 以及一般的 ODBC (其中 PostgreSQL、Informix、Sybase 的driver 是由自由软件社群发展之后贡献出来的)。
使用 ADODB 最大的优点之一是:不管后端数据库如何,存取数据库的方式都是一致的,开发设计人员不必为了某一套数据库,而必须再学习另一套不同的存取方法,这大大减轻开发人员的知识负担,过去的知识往后仍可继续使用,转移数据库平台时,程序代码也不必做太大的更动。
其实 ADODB 这样的发展理念,并不是首创的,DBI 比 ADODB 出现得更早,它提供 Perl 存取数据库时,使用一致的 API 呼叫接口。相信用过 Perl + DBI 的朋友,再来用 ADODB 时,会有一种似曾相识的感觉。
另外,ADODB 对用过 ASP 的人而言,应该不陌生,这类朋友对 ADODB 应该很容易接受。
我们来看一下,ADODB 的简单用法:
?php
// 引入 adodb 的 inc 档,才能呼叫 adodb 提供的函式
include('adodb/adodb.inc.php');
// 选择连接的数据库种类,以建立联机对象,
// 一旦对象建立,即可使用其成员函式来处理数据库。
// 以下 $conn 即此一物件(object)
$conn = ADONewConnection('mysql');
// 要不要显示侦错讯息,false 不要,true 要。
// $conn-debug = false;
$conn-debug = true;
// 连接数据库
// 用法:$conn-Connect('主机', '使用者', '密码', '数据库');
// 用例:
$conn-Connect('localhost', 'piza', 'ooo123', 'test');
// 若欲采用持续性连接,上式可换用 PConnect:
// $conn-PConnect('localhost', 'piza', 'ooo123', 'test');
// 设定 sql 命令
$sql = "insert into t values ('abcde', 18)";
// 执行 sql 命令
$rs = $conn-Execute($sql);
// 检查执行结果,若 $rs == false,则呼叫 $conn 对象的成员函式 ErrorMsg()
if (!$rs) print $conn-ErrorMsg(); else print "OK!";
?
结果如下:
---------------------------------------------
(mysql): insert into t values ("abcde",18)
---------------------------------------------
OK!
若把侦错关掉,即 $conn-debug=false,则结果如下:
OK!
以下,逐步为各位介绍:使用 ADODB 的重点方法。
2. 安装
ADODB 的首页在:,目前(2002/10/24)最新版是:2.42 版,可至 ADODB 下载或至台南县教网中心 FTP 下载。
安装 ADODB 的方法超极简单,只要下载、解压、放入适当位置,即可完成 ! 如下所示:
1. 下载:
$ ncftp
cd sysop/ADODB
get adodb242.tgz
2. 解压:
假设我把 adodb242.tgz 放入 /var/www/html 中
$ cp adodb242.tgz /var/www/html
$ tar xvzf adodb242.tgz
如下所示:
adodb/adodb-cryptsession.php
adodb/adodb-csvlib.inc.php
adodb/adodb-errorhandler.inc.php
adodb/adodb-errorpear.inc.php
adodb/adodb-lib.inc.php
adodb/adodb-pager.inc.php
....以下省略....
现在,您在 /var/www/html/adodb 已安装好 ADODB 了。
3. 引入 ADODB
一旦安装好 ADODB,使用前,应把 ADODB 相关的含入文件引入您的程序中。adodb 目录放在任何位置无所谓,只要能指向正确路径文件名即可。一般而言,您的程序代码只须引入 adodb.inc.php。
作法如下:
在您的 PHP 程序中:
include('路径/adodb/adodb.inc.php');
或
include_once('路径/adodb/adodb.inc.php');
例:
若您的程序和 adodb 在同一目录下:
.
..
adodb/
something.php*
则:
include('adodb/adodb.inc.php');
即可。
若位置是在某一个目录 somedir 中:
.
..
adodb
somedir/something.php
则必须使用:
include('../adodb/adodb.inc.php');
除了 adodb.inc.php 这个含入档,ADODB 还提供许多 adodb-*.inc.php 的含入档,这些多半是为驱动某些数据库的特殊用法而设的。
若是引入 adodb-session.php 则可让您将 session 存入数据库中来维护运用。
若是引入 adodb-pager.inc.php,可方便您做分页显示。
若是引入 adodb-errorhandler.inc.php,可让您自订错误处理讯息。
若是含入 adodb-pear.inc.php,可让您使用 PHP4 的 PEAR DB 语法来使用 ADODB。此时,尚可使用 DSN 连接数据库的字符串设定。如 $dsn="mysql://piza:ooo123@localhost/test";
若是引入 tohtml.inc.php,可帮您在程序代码中,方便将取出的记录,转成 HTML 的表格(table)来显示。
若是引入 toexport.inc.php,可让您方便地输出 CSV 档或以 tab 分隔字段的数据文件。
若是引入 rsfilter.inc.php,可让您在使用记录之前,预做过滤处理。
若是引入 pivottable.inc.php,可让您使用 pivot table 功能(俗称 cross-tabulations)。
注意 ! adodb.inc.php 是一定要引入的,其它,则视您要使用那一个功能,再引入该含入档即可。
4. 选用数据库种类,建立联机对象
由于 ADODB 使用对象导向的作法,因此您在引入档之后,接着请视您后端数据库的种类,建立一个联机对象。作法如下:
以 MySQL 数据库为例:
$conn = ADONewConnection('mysql');
注:NewADOConnection 和 ADONewConnection 是一样的,二者皆可使用。
上例中的 'mysql' 是指数据库的 drvier 的种类,ADODB 会据此呼叫对应的数据库 driver。
其它常用的 driver 有:access、ado、ado_access、ado_mssql、db2、vfp、ibase、borland_ibase、informix、 imformix72、mssql、oci8、odbc、postgres、postgres64、postgres7、sqlanywhere、 sybase....等等。
我们称建立的对象 $conn 为一 ADOConnection 对象,它代表与数据库的连接事务,皆透过这个对象来处理。ADOConnection 对象会提供许多处理的方法,以对象导向的说法,这些方法称为成员函式,这是外界存取此一对象的接口。
一旦联机对象建立之后,就有许多对象函式可供您使唤啦 ! 请看下一节的介绍。
5. 侦错模式
程序开发的过程,为了方便查出出现问题可能的地方,通常我们会打开侦错模式,俟程序功能确实稳定之后,再将它关闭。ADODB 提供侦错模式,存取数据库时,能显示其运作方式。
打开侦错模式,使用法:
$conn-debug=true
关闭侦错模式,使用法:
$conn-debug=false
6. 连接数据库
接着,使用 $conn 联机对象的 Connect 或 PConnect 函式来连接特定的数据库,此时必须提供 DSN (Data Source Names)相关数据,DSN 可能包括:主机名称、数据库使用者、数据库密码、数据库名称。不同的数据库种类,DSN 可能可以省略其中若干项。以 MySQL 而言,则上述四者都要提供。
该函式会传回 true 或 false,用以表示是否连接成功。
用例:
// 格式:$conn-Connect('主机', '使用者', '密码', '数据库');
$conn-Connect('localhost', 'piza', 'ooo123', 'test');
或者,采持续性连接:
// 格式:$conn-PConnect('主机', '使用者', '密码', '数据库');
$conn-PConnect('localhost', 'piza', 'ooo123', 'test');
若欲探查是否有联机成功,可用一个变量来接取传回值:
$mch="localhost";
$user="piza";
$pwd="ooo123";
$database="test";
$cok = $conn-Connect($mch, $user, $pwd, $database);
或者,采持续性连接:
$cok = $conn-PConnect($mch, $user, $pwd, $database);
if (!$cok) { echo "无法连接数据库 $database"; exit; }
7. 设定 sql 命令语法、执行 sql 命令
接下来,您就可以设计您要执行的 sql 命令语法,然后付诸执行。
$sql = "这里放 SQL 的命令语法";
$rs = $conn-Execute($sql);
其中,$rs 为回传的结果,若 $rs == false,则表示执行失败,您必须仔细检查一下。
您不一定要把命令语法放在 $sql 变量中,也可以直接放入 Execute( ) 括号中。若命令较短无妨,若命令较长,我建议您还是用一个变量 $sql 来设定命令字符串吧 !
下一节开始,为各位介绍 SQL 的基本命令,如:Insert、Select、Update、Delete 等等的用法。
8. 插入记录(Insert)
Insert 的用法如下:
// $name 为字符串,$year 为数字
$name='abcde';
$year=18;
// 插入一笔记录,命令的大小写无妨,但数据表 t 及变量则大小写有分别 !
$sql = "INSERT INTO t VALUES ('$name', $year)";
// $sql = "insert into t values ('$name', $year)"; 亦可。
// 执行
$rs = $conn-Execute($sql);
// 检查执行结果,进行错误处理;若正常,则继续其它动作....
if (!$rs) print $conn-ErrorMsg();
....以下省略....
ErrorMsg() 是错误显示的函式,它会取出错误讯息,并显示出来。
另外,ADODB 提供一种 记录集(RecordSet) 函式 GetInsertSQL(),可帮您产生 Insert 的语法。
例子如下:
?php
// 引入 ADODB
include('adodb/adodb.inc.php');
// 建立联机对象
$conn = ADONewConnection('mysql');
// 侦错
$conn-debug=true;
// DSN 四项基本数据设定
$mch="localhost";
$user="root";
$pwd="jack168";
$database="test";
// 连接至数据库 test
$conn-PConnect($mch, $user, $pwd, $database);
// 产生一笔空记录
$sql = "select * from t where year=-1";
$rs = $conn-Execute($sql);
// 用一个空数组来装要更新的数据
$r = array();
$r['name']='john';
$r['year']=28;
// 用 GetInsertSQL 函式来制作一个完整的 sql 命令,此 sql 命令放在 $insertSQL 中
$insertSQL = $conn-GetInsertSQL($rs, $r);
// 执行插入
$conn-Execute($insertSQL);
$conn-Close();
?
侦错讯息如下:
-----------------------------------------------------------
(mysql): select * from t where year=-1
-----------------------------------------------------------
(mysql): INSERT INTO t ( name, year ) VALUES ( 'john', 28 )
-----------------------------------------------------------
9. 取出记录(Select)
Select 的用法如下:
?php
// 引入 ADODB
include('adodb/adodb.inc.php');
// 建立联机对象
$conn = ADONewConnection('mysql');
// 不侦错
$conn-debug=false;
// DSN 四项基本数据设定
$mch="localhost";
$user="piza";
$pwd="ooo123";
$database="test";
// 连接至数据库 test
$conn-PConnect($mch, $user, $pwd, $database);
// 执行 Select 由表格 t 取出数据,
// 它会传回一个 ADORecordSet 记录集对象 $rs (RecordSet)
// 实际上 $rs 是一个 cursor 指标,它拥有目前的记录(row 或称 record),
// 该记录的所有字段数据的内容,存放在 fields 这个数组之中
// ,以数字为索引,第一个由 0 开始
$rs = $conn-Execute('select * from t');
// 若 $rs 为 false,则秀出错误讯息
if (!$rs) {
print $conn-ErrorMsg();
} else {
// 当尚未到达 记录集 $rs 的结束位置(EOF:End Of File)时,(即:还有记录尚未取出时)
while (!$rs-EOF) {
// 秀出所有字段,$FieldCount() 会传回字段总数
for ($i=0, $max=$rs-FieldCount(); $i $max; $i++) {
print $rs-fields[$i] . " ";
}
// 移至下一笔记录
$rs-MoveNext();
// 换列
echo "br\n";
}
}
$rs-Close(); // 可不用
$conn-Close(); // 可不用
?
$rs-fields[] 数组是由 PHP 的数据库扩展功能产生的,某些扩展功能并不支持使用字段名称当作索引。
若欲使用名称当作索引,也就是俗称的 hash 或 associative arrays,则需使用全域变量 $ADODB_FETCH_MODE 加以指定。
以下设定:使用数字索引 $ADODB_FETCH_MODE= ADODB_FETCH_NUM;
以下设定:使用名称索引 $ADODB_FETCH_MODE= ADODB_FETCH_ASSOC;
下面是使用名称索引的例子:
?php
// 引入 ADODB
include('adodb/adodb.inc.php');
// 建立联机对象
$conn = ADONewConnection('mysql');
// 不侦错
$conn-debug=false;
// DSN 四项基本数据设定
$mch="localhost";
$user="root";
$pwd="jack168";
$database="test";
// 连接至数据库 test
$conn-PConnect($mch, $user, $pwd, $database);
// 执行 sql 之前,指定使用名称索引
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
// 执行 Select,它会传回一个 ADORecordSet 记录集对象 $rs
// 实际上 $rs 是一个 cursor 指标,它拥有目前的记录内容,
// 该记录存放在 fields 这个数组之中
$rs = $conn-Execute('select * from t');
// 若 $rs 为 false,则秀出错误讯息
if (!$rs) {
print $conn-ErrorMsg();
} else {
// 当尚未到达记录集结束位置(EOF)时,
while (!$rs-EOF) {
// 秀出所有字段
print $rs-fields['name'] . " " . $rs-fields['year'];
// 移至下一笔记录
$rs-MoveNext();
// 换列
echo "br\n";
}
}
$rs-Close(); // 可不用
$conn-Close(); // 可不用
?
10. 取出记录(使用 FetchRow)
这里示范 FetchRow 的用法:
$sql = "select * from t";
$rs = $conn-Execute($sql);
if ($rs) {
while( $ar = $rs-FetchRow() ) {
print $ar['name'] ." " . $ar['year'];
print "br\n";
}
}
FetchRow() 会将取出的记录传回,您可用一个 array 来接取。
注意 ! 使用 FetchRow() 就不必再用 MoveNext(),FetchRow 内部会自动完成移至下一笔记录的动作。
11. 更新记录(Update)
您可以用传统的方式:
$sql ="UPDATE t SET name='john', year=28 WHERE year=18";
$conn-Execute($sql);
也可以用以下这种方式:
?php
// 引入 ADODB
include('adodb/adodb.inc.php');
// 建立联机对象
$conn = ADONewConnection('mysql');
// 侦错
$conn-debug=true;
// DSN 四项基本数据设定
$mch="localhost";
$user="piza";
$pwd="ooo123";
$database="test";
// 连接至数据库 test
$conn-PConnect($mch, $user, $pwd, $database);
// 选择要更新的那一笔记录
$sql = "select * from t where year=18";
$rs = $conn-Execute($sql);
// 用一个空数组来装要更新的数据
$r = array();
$r['name']='john';
$r['year']=28;
// 用 GetUpdateSQL 函式来制作一个完整的 sql 命令,此 sql 命令放在 $updateSQL 中
$updateSQL = $conn-GetUpdateSQL($rs, $r);
// 执行更新
$conn-Execute($updateSQL);
$conn-Close();
?
侦错讯息如下:
-------------------------------------------------------------
(mysql): select * from t where year=18
-------------------------------------------------------------
(mysql): UPDATE t SET name = 'john', year = 28 WHERE year=18
-------------------------------------------------------------
12. 删除记录(Delete)
删除记录很简单,采传统方式即可: $sql = "DELETE FROM t WHERE year=18";
$rs = $conn-Execute($sql);
13. 使用字段对象(Field Objects)
这里示范字段对象 FetchField 的用法,用以取得字段名称及字段型态:
$sql = "select * from t";
$rs = $conn-Execute($sql);
if ($rs) {
while (!$rs-EOF) {
// 取出第二个字段
$f = $rs-FetchField(1);
// 印出字段名称 及 字段型态
print $f-name . ":" . $f-type;
$rs-MoveNext();
print "br\n";
}
}
另外,ADODB 提供一个 RecordSet 函式 MetaType(),可将原始的字段型态转成一般型态代码:
C : 字符
X : text
B : blob
D : 日期
T : timestamp
L : 布尔值或位
I : 整数
N : 数字型态,包括:自动增加、数值、浮点数、实数及整数
R : serial、自动增加
用例:
$f = $rs-FetchField(1);
// 印出字段名称 及 字段型态的代码
print $f-name . ":" . $rs-MetaType($f-type);
14. 简单分页(Pager)
ADODB 提供一种简单分页显示记录的方法,使用前,要将 adodb-pager.inc.php 引入。
?php
include('adodb/adodb.inc.php');
// 引入分页功能
include('adodb/adodb-pager.inc.php');
// 启动 session
session_start();
$db = ADONewConnection('mysql');
$mch="localhost";
$user="piza";
$pwd="ooo123";
$database="test";
$db-Connect($mch, $user, $pwd, $database);
$sql = "select * from t";
// 产生 pager 对象
$pager = new ADODB_Pager($db, $sql);
// 每一页秀 5 笔记录
$pager-Render($rows_per_page=5);
?
结果如下:
Figure 1. 简单分页功能
每页显示记录的数目是由 Render() 来控制的,若没有传入指定的 row 数给 Render(),默认值每页秀 10 笔。
另外,字段名称也可以改变,如下示范:
?php
include('adodb/adodb.inc.php');
// 引入分页功能
include('adodb/adodb-pager.inc.php');
// 启动 session
session_start();
$db = ADONewConnection('mysql');
$mch="localhost";
$user="piza";
$pwd="ooo123";
$database="test";
$db-Connect($mch, $user, $pwd, $database);
$sql = "select name as '姓名', year as '年纪' from t";
// 产生 pager 对象
$pager = new ADODB_Pager($db, $sql);
// 每一页秀 5 笔记录
$pager-Render($rows_per_page=5);
?
结果如下:
Figure 2. 改变字段名称
15. 输出 CSV 档
ADODB 提供输出 CSV 档的方法,使用前,要将 toexport.inc.php 引入。
?php
include('adodb/adodb.inc.php');
// 引入输出 CSV 文件功能
include('adodb/toexport.inc.php');
$db = ADONewConnection('mysql');
$mch="localhost";
$user="piza";
$pwd="ooo123";
$database="test";
$db-Connect($mch, $user, $pwd, $database);
$sql = "select name as '姓名', year as '年纪' from t";
$rs = $db-Execute($sql);
// 秀出 CSV 格式
print rs2csv($rs);
?
结果如下:
姓名,年纪
abcde,45
yyy,20
ppp,34
mmm,13
hhh,41
rrr,65
kkk,29
miso,154
sss,89
abc,18
abcde,0
uyt,58
john,28
也可用 tab 分隔字段,使用 rs2tab 方法如下:
print rs2tab($rs, false);
注: false 表示不显示字段名称
结果如下:
abcde 45
yyy 20
ppp 34
mmm 13
hhh 41
rrr 65
kkk 29
miso 154
sss 89
abc 18
abcde 0
uyt 58
john 28
若是 print rs2tab($rs, true);
结果如下:
姓名 年纪
abcde 45
yyy 20
ppp 34
mmm 13
hhh 41
rrr 65
kkk 29
miso 154
sss 89
abc 18
abcde 0
uyt 58
john 28
也可以将结果由标准输出(STDOUT)显示,使用 rs2tabout 方法如下:
print rs2tabout($rs);
执行结果如下:
Figure 1. 在console中显示结果
也可以存成 CSV 档:
// 档案路径
$path = "/tmp/test.csv";
// 开档供写入
$fhd = fopen($path, "w");
// 若开档成功
if ($fhd) {
// 则写入 CSV
rs2csvfile($rs, $fhd);
// 也可以使用 rs2tabfile($rs, $fhd);
// 关档
fclose($fhd);
}
结果如下:
[ols3@p web]$ cat /tmp/test.csv
姓名,年纪
abcde,45
yyy,20
ppp,34
mmm,13
hhh,41
rrr,65
kkk,29
miso,154
sss,89
abc,18
abcde,0
uyt,58
john,28
16. 取出一定笔数的记录 (使用 SelectLimit)
ADODB 提供一个 ADOConnect 函式 SelectLimit,可供您取出一定笔数的记录,用法如下:
$conn-Connect($mch, $user, $pwd, $database);
rs = $conn-SelectLimit("Select * from t", 3, 1);
// 取出 3 笔、在第 1 笔之后
// 秀出这 3 笔记录
if ($rs) {
while( $ar = $rs-FetchRow() ) {
print $ar['name'] ." " . $ar['year'];
print "br\n";
}
}
上式是说:在第 1 笔记录之后,取出 3 笔,也就是第 2、3、4 笔记录。
结果如下:
--------------------------------------
(mysql): select * from t LIMIT 1,3
--------------------------------------
注意 ! SelectLimit 的写法刚好和 MySQL 语法相反 !
17. 结语
本讲义,主要是为:有心参与 SFS3 (sfs.wpes.tcc.edu.tw) 计划的伙伴们而写的。做为一份入门文件,以上这些介绍,应该是足够让您了解 ADODB 并且能把它应用在 SFS3 或其它有意义的地方了吧? 若果真如此,小弟就心满意足了 !
ref. 参考资源
ADODB 网站
ADODB 手册
PHP 对象导向入门
本文链接:
7月底,农行(601288.SH)宣告成立金融 科技 子公司农银金融 科技 有限责任公司,注册资本6亿。目前已有11家银行成立金融 科技 子公司,包括五家国有大行、五家股份行和一家城商行。新一家金融 科技 子公司的成立振奋市场,而国内银行金融 科技 是否能够与国际抗衡,是否能完成“进口替代”的话题再次浮出水面。
长久以来,IOE技术架构是银行业的标准配置和唯一选择,而在2013年之后,由于金融系统IT架构定价权和 游戏 规则控制在海外厂商手中,并且随着移动互联网的普及,高频交易让传统系统不堪重负,银行业也开始艰难谋求去IOE。
时隔7年,在金融 科技 助推下,银行们通过自我研发去IOE仍在进行中,也有银行依靠互联网等外部力量以求快速实现IT架构国产化。
银行业去IOE始于2013年左右。图 站酷海洛
IOE,分别指IBM(国际商用机器公司)、Oracle(甲骨文)和EMC(易安信),三者分别是小型机、数据库和高端存储的领导厂商,一定程度上主导了企业的IT架构。它们组成的系统一度被视为大型金融企业后台的“黄金架构”。
中国银行业自上世纪90年代开始逐步实现电子化,陆续采用数据、操作、应用大集中的管理模式,即数据中心大集中时代,以革除各家分支行各自为政的弊病,实现网点和业务的数据集中。而IBM以其强大的数据处理能力,装机量在国内一枝独秀。
当时,各类银行争相引进海外业务系统产品,实现流程改造和管理方式改革。
银行业去IOE始于2013年左右。
一直以来,由于银行业采用IOE为代表的IT基础体系,使得如此重要的金融机构IT整体都处于海外厂商的控制之中。可想而知,如若存在技术漏洞,或被主动植入漏洞,或者是国与国之间产生矛盾,供应商被要求停止技术服务,则金融业暴露在安全风险之中。
因此,国家层面基于金融与信息安全的导向推动提出了去IOE的想法,2012年6月国务院发布《关于大力推进信息化发展和切实保障信息安全若干意见》(国发〔2012〕23号),金融监管部门也期望银行逐年减轻对IOE的依赖程度。
尽管去IOE化在2014年、2015年就成为了金融 科技 领域的热门话题,但是它的进展速度显然没有它的热度上得快。
广发证券研报显示,去IOE在开始几年在传统银行间开展得并不顺利。
主要原因包括:第一,大型银行当前集中处理的业务模式对于服务器的稳定性要求极高。而IBM大型机/小型机的稳定性无人能及。其次,中小银行采用开放式平台架构,可以不用IBM服务器。但国产设备的性能、安全性、稳定性一直难以被信任。此外,服务器、存储、操作系统、数据库等基础设施层次相互依赖,难以单一替换。因此,过去5-10年,难以真正意义上撼动海外厂商在国内银行业的地位。
金融壹账通总经理助理、Gamma平台CEO区海鹰在接受媒体采访时对21世纪经济报道记者表示,去IOE仍是银行业头疼的问题。“因为金融是国家与 社会 最重要的一个稳定因素,银行业内部使用的技术中IOE占比非常高,如何去IOE对于银行业来说是一个非常大的挑战。”
区海鹰表示,去IOE只能“小步慢走”式迁移,而且这个工作量非常大。应用层、硬件层迁移已经非常耗费精力,而底层的改变要用到全部国产的服务器、网络,难度可想而知,“估计这个改造本身就是5-10年的工作”。
2019年10月,中国互联网金融协会发布的《中国商业银行数字化转型调查研究报告》显示,参与调研的75%的银行已经或正在启动数字化转型。这其中,不少银行通过自行研发实现了国产化架构支撑关键业务。
据微众银行年报披露,截至2018年底,微众银行已建成229个关键系统,1202个子系统。依靠分布式架构及开源技术的深度应用,行内系统成功支持了年内亿级客户量、亿级日交易量,达到国有大型银行同等规模。与此同时,行内账户运维成本持续下降45%。
今年5月,陆金所也宣布去“O”已经完成95%,预计到今年中实现开源数据库的完全替代。陆金所选择了MySQL的开放式架构作为Oracle核心数据库的替代方案。经测算,完全“去O”之后,系统软硬件成本将节约近90%。
如果说,微众银行等互联网银行实现去IOE更为轻车熟路,那么更多的银行通过外部合作,来降低对海外厂商的依赖,近年来尤其实现提速。
2019年5月,华为正式面向全球推出了GaussDB数据库,其GaussDB OLTP数据库已在招商银行综合支付交易系统成功上线投产,也已在工商银行内上线投产。同月,达梦发布DM8.0,10月23日,该新核心系统所引入的达梦数据库正式通过湖北银行项目方的验收。
去年10月,蚂蚁金服OceanBase登顶TPC-C,这是国产数据库首破OLTP的benchmark世界纪录。OceanBase落地西安银行,西安银行完成实施互联网金融业务平台MySQL数据库、互联网交易资金存管平台Oracle数据库向OceanBase分布式数据库的完整迁移。同月,中兴GoldenDB成功帮助中信银行替换DB2,换“心”后的中信银行信用卡核心交易系统对外投产,这是全国性股份制商业银行的首例。11月,腾讯宣布开源TBase数据库,TDSQL数据库落地张家港农商银行新一代核心业务系统。
对于互联网金融公司和银行的 科技 子公司在去IOE领域的竞争,一位金融 科技 业内人士认为,互联网 科技 公司的 科技 创新能力确实非常强,而且也有很大的服务C端用户的规模。银行业尤其是大行金融 科技 子公司从纯技术的角度与互联网公司旗鼓相当,但是互联网公司本身自带流量,具有很大的优势。
但上述人士坦言,数据库市场被国外厂商垄断,自研企业实力与Oracle仍有一定差距。智研咨询发布的《2020-2026年中国数据库市场深度分析及未来发展前景预测报告》显示:2018年我国数据库软件市场规模为139.25亿元,其中,关系型数据库规模约118.36,占比约85%。Oracle数据库关系型数据库市场份额超过46%,占数据库市场约39.1%。
国产数据库方面,既有传统大学成立的数据库企业,包括人大金仓、武汉达梦、神舟通用、南大通用、山东瀚高等,也有近几年主要以阿里、腾讯、华为为代表的企业研发也加快了追赶脚步。
从国产数据库的技术来源看,国产关系型数据库多源自或者借鉴开源MySQL、PostgreSQL等数据库及其变种,或收购商业源码(例如Informix)+自研的方式,大数据平台多源自或直接整合开源大数据生态组件,纯自研的国产数据库较少,数据库种类不够丰富,核心竞争力亟待突破。
更多内容请下载21 财经 APP
介绍一些Python如今最常见的应用领域,以及每个应用领域内所用的一些工具。
系统编程
Python的标准库绑定了POSIX以及其他常规操作系统(OS)工具:环境变量、文件、套接字、管道、进程、多线程、正则表达式模式匹配、命令行参数、标准流接口、Shell 命令启动器、文件名扩展等。
用户图形接口
Python的简洁以及快速开发周期十分适合开发GUI 程序。Python内置了TKinter的标准面向对象接口TK GUI API,使Python程序可以生成可移植的本地观感的GUI。通过适当的库,你可以在Python中使用其他的GUI工具包,例如,通过PyQt使用Qt、通过 PyGTK使用 GTK、通过PyWin32使用 MFC、通过 IronPython使用 .NET,以及通过 Jython(Java版本的Python)使用Swing等。
Internet脚本
Python提供了标准的Internet模块,它使得Python程序能够广泛地在多种网络任务发挥作用,无伦是在服务端还是客户端都是如此。不仅如此,涌现了许多针对Python的 Web开发工具包,例如,Django、TurboGears、web2py、Pylons、Zope 和 WebWare,它们使得Python能够快速构建功能完善和高质量的网站。
组件集成
在上面千锋武汉Python小编也提到过,Python是一门“胶水”语言,它可以通过C/C++系统进行扩展,并能够嵌套C/C++系统的特性,使其能够作为一种灵活的黏合语言。例如,将一个 C 库集成到Python中,能够利用Python进行测试并调用库中的其他组件。
数据库编程
对于数据库,Python提供了对所有主流关系数据库系统的接口,例如,Sybase、Oracle、Informix、ODBC、MySQL、PostgreSQL、SQLite 等。Python标准的pickle模块提供了一个简单的对象可持久化系统:它能够让程序轻松地将整个Python对象保存和恢复到文件和文件类的对象中。
数值计算和科学计算编程
Python在这方面提供了一个非常好的库NumPy,它包括很多高级工具,例如,矩阵、标准数学库的接口等。
游戏、图像、人工智能、机器人等
Python的应用领域很多,例如:
1. 可以利用Pygame系统使用Python对图形和游戏进行编程。
2. 使用PySerial扩展在Windows、Linux以及更多系统上进行串口通信。
3. 用PIL、PyOpenGL、Blender、Maya和其他的一些工具进行图像处理。
4. 用PyRo工具包进行机器人控制编程
5. 使用神经网络仿真器和专业的系统shell 进行AI编程。
6. 使用NLTK包进行自然语言分析。
以上就是Python最常见的一些应用领域。
一、DM
软件名称:达梦数据库(DM)。
开发商:武汉达梦数据库有限公司。
软件描述:
达梦数据库具有如下技术特色:支持多个平台之间的互联互访、高效的并发控制机制、有效的查询优化策略、灵活的系统配置、支持各种故障恢复并提供多种备份和还原方式。
具有高可靠性、支持多种多媒体数据类型、提供全文检索功能、各种管理工具简单易用、各种客户端编程接口都符合国际通用标准、用户文档齐全。
官网:
二、OpenBASE
软件名称:OpenBASE。
开发商:东软集团有限公司。
软件描述:
主要包括OpenBASE 多媒体数据库管理系统、OpenBASE Web应用服务器、OpenBASE Mini嵌入式数据库管理系统、OpenBASE Secure安全数据库系统等产品。
所有的这些产品涵盖了企业应用、Internet/Intranet、移动计算等不同的应用领域,具有不同的应用模式。
形成了OpenBASE面向各种应用的全面的解决方案。多媒体数据库管理系统OpenBASE是OpenBASE产品系列的核心和基础,其它的产品都是在其基础上,根据各自应用领域的不同特点发展、演变而成的。
官网:
三、思极有容
软件名称:思极有容分布式数据库。
开发商:国网信通和创意信息联合研发
软件描述:
一款国产自主可控的分布式关系型数据库。支持国产CPU、操作系统生态,支持云平台和容器。在安全方面,设定多种权限访问、审计、流量控制机制,实现真正资源隔离。
产品采用当前领先分布式技术,提供多种隔离级别,保障完整分布式事务。通过读写分离、并行计算、在线横向扩展,实现集群性能准线性提升,可达数百万级TPM。
官网:
四、KingbaseES
软件名称:金仓数据库管理系统KingbaseES。
开发商:北京人大金仓信息技术有限公司。
软件描述:
交互式工具ISQL;图形化的数据转换工具; 多种方式的数据备份与恢复; 提供作业调度工具;方便的用户管理;支持事务处理;支持各种数据类型;提供各种操作函数;提供完整性约束;支持视图;支持存储过程/函数;支持触发器。
官网:
五、阿里的数据库系统
软件名称:OceanBase PolarDB
官方称为“完全自主研发的金融级分布式关系数据库”。下面是其官网的介绍:OceanBase 对传统的关系数据库进行了开创性的革新。
在普通硬件上实现金融级高可用,在金融行业首创“三地五中心”城市级故障自动无损容灾新标准,同时具备在线水平扩展能力,创造了4200万次/秒处理峰值的纪录(注:当时TPS官宣为25.6w)。
现在OceanBase的版本已经2.x了,OceanBase TPC-C的评测刷遍了朋友圈,TPS达到了100w (6088w tpmc),榜单第一。
官网:
六、腾讯的数据库系统
软件名称:TDSQL
其官网简介:分布式数据库(Tencent Distributed SQL,TDSQL)是腾讯打造的一款分布式数据库产品,具备强一致高可用、全球部署架构、分布式水平扩展、高性能、企业级安全等特性。
同时提供智能 DBA、自动化运营、监控告警等配套设施,为用户提供完整的分布式数据库解决方案。
目前 TDSQL 已经为超过500+的政企和金融机构提供数据库的公有云及私有云服务,客户覆盖银行、保险、证券、互联网金融、计费、第三方支付、物联网、互联网+、政务等领域。TDSQL 亦凭借其高质量的产品及服务,获得了多项国际和国家认证,得到了客户及行业的一致认可。
官网:
三、华为的数据库系统
软件名称:GaussDB
全球首款AI-Native数据库,内部有100、200、300多个版本,应该是基于PostgreSQL开发的。在国内,可能除了阿里,就到华为的团队了(高斯实验室)。和不少高校建立了合作。
官网:
总结
如果你倾向极强的定制性和高度兼容MySQL,推荐思极有容数据库,因为它这两者是优化到极致且比较简洁,可控性强。
常用数据库
1. IBM 的DB2
作为关系数据库领域的开拓者和领航人,IBM在1997年完成了System R系统的原型,1980年开始提供集成的数据库服务器—— System/38,随后是SQL/DSforVSE和VM,其初始版本与SystemR研究原型密切相关。DB2 forMVSV1 在1983年推出。该版本的目标是提供这一新方案所承诺的简单性,数据不相关性和用户生产率。1988年DB2 for MVS 提供了强大的在线事务处理(OLTP)支持,1989 年和1993 年分别以远程工作单元和分布式工作单元实现了分布式数据库支持。最近推出的DB2 Universal Database 6.1则是通用数据库的典范,是第一个具备网上功能的多媒体关系数据库管理系统,支持包括Linux在内的一系列平台。
2. Oracle
Oracle 前身叫SDL,由Larry Ellison 和另两个编程人员在1977创办,他们开发了自己的拳头产品,在市场上大量销售,1979 年,Oracle公司引入了第一个商用SQL 关系数据库管理系统。Oracle公司是最早开发关系数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率名列前茅。
3. Informix
Informix在1980年成立,目的是为Unix等开放操作系统提供专业的关系型数据库产品。公司的名称Informix便是取自Information 和Unix的结合。Informix第一个真正支持SQL语言的关系数据库产品是Informix SE(StandardEngine)。InformixSE是在当时的微机Unix环境下主要的数据库产品。它也是第一个被移植到Linux上的商业数据库产品。
4. Sybase
Sybase公司成立于1984年,公司名称“Sybase”取自“system”和 “database” 相结合的含义。Sybase公司的创始人之一Bob Epstein 是Ingres 大学版(与System/R同时期的关系数据库模型产品)的主要设计人员。公司的第一个关系数据库产品是1987年5月推出的Sybase SQLServer1.0。Sybase首先提出Client/Server 数据库体系结构的思想,并率先在Sybase SQLServer 中实现。
5. SQL Server
1987 年,微软和 IBM合作开发完成OS/2,IBM 在其销售的OS/2 ExtendedEdition 系统中绑定了OS/2Database Manager,而微软产品线中尚缺少数据库产品。为此,微软将目光投向Sybase,同Sybase 签订了合作协议,使用Sybase的技术开发基于OS/2平台的关系型数据库。1989年,微软发布了SQL Server 1.0 版。
6. PostgreSQL
PostgreSQL 是一种特性非常齐全的自由软件的对象——关系性数据库管理系统(ORDBMS),它的很多特性是当今许多商业数据库的前身。PostgreSQL最早开始于BSD的Ingres项目。PostgreSQL 的特性覆盖了SQL-2/SQL-92和SQL-3。首先,它包括了可以说是目前世界上最丰富的数据类型的支持;其次,目前PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统、数据完整性检查等特性的唯一的一种自由软件的数据库管理系统.
7.mySQL
mySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司。在2008年1月16号被Sun公司收购。目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。MySQL的官方网站的网址是:
1、参与系统整体的架构设计、数据设计,技术方案的讨论和决策;
2、独立完成系统模块的分析、设计,独立研发关键模块、关键算法的程序;
3、能够独立维护现有技术框架,进行技术攻坚,解决项目开发过程中的技术难4、对新系统或已有系统总体结构框架提出建设性的意见和建议。
能力要求:
1、精通J2EE\J2SE体系结构,熟悉主流J2EE框架springMVC、ehcache、mybatis、hibernate、velocity等;熟练使用ant/maven等构建工具;
2、有扎实的Java基础,在指定的需求下完成安排工作任务;
3、熟悉Linux/Apache/Nginx/PostgreSQ等基础服务的配置,优化和故障排查;
4、熟悉主流数据库系统的使用和优化,如:Postgresql、MySQL等;
5、有强烈的责任心和良好的沟通能力,能严格遵循编码规范和工作流程;
6、性格开朗,具有团队合作精神,学习能力强,能承受较大的工作压力;
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流