级别: 初级 Nikolay V. Yevik (yevik@us.ibm.com), 技术顾问, IBM
2005 年 5 月 08 日
MySQL 数据库服务器可以运行在基于 IBM® POWER™ 和 PowerPC® 处理器的服务器上的 Linux®(统称为 POWER 上
的 Linux)中,通过此系列文章的第 2 部分(也是最后一部分)了解其可用性。第 2 部分的重点是
使用某些主流编程语言为 MySQL 开发应用程序,比如 PHP、Java™、C/C++、Python 和 Perl。
作为面向在 POWER 上 Linux 中使用 MySQL 的应用程序开发者的一篇简短指南,本文适合那些熟悉自己的系统环境、
网络、媒体设备和磁盘资源的 MySQL 开发者和数据库管理员阅读。
介绍
第 1 部分
介绍了 POWER 上 Linux 中的 MySQL 及相关工具,并涵盖了一些主要的概念,比如创建数据库、填充
数据以及验证参照完整性。
本部分介绍使用主流编程语言(比如 PHP、Java、C/C++、Perl 和 Python)在 POWER 上 Linux 中
开发与 MySQL 通信的应用程序的基本概念。
本部分中的示例基于 第 1 部分 中
所创建的数据库。为了更好地理解本文中描述的示例,请回顾第 1 部分中创建的数据库结构。
所有示例都在 POWER 上 Linux 中编译和运行。不过请注意,这些说明也适用于普通的 Linux。
使用 PHP 进行 MySQL 开发
本节描述了如何在最常见的情形中使用 PHP 和 MySQL:使用 Apache Web 服务器。
在大部分常见的配置中,您应该在系统中安装以下组件:
- 包含 PHP 二进制程序的 PHP 文件
- 用于您的 Apache 版本的 PHP 模块
- Apache web 服务器
- 具有 MySQL 访问函数的 PHP 扩展模块
在任何 Linux 发行版本标准安装媒介中,包括 POWER 和 PPC 上的 Linux,通常以 rpm 软件包的形式
附带这些组件。
这里假定您想要创建一个非常简单的基于 web 的应用程序,让您能够向 CONTRACTING 数据库的 EMPLOYEE 表中插入数据,并能从中
导出数据。
图 1 中给出了 HTML 输入表单。
图 1. HTML 数据输入表单
这个 HTML 数据输入表单的动作是调用 PHP 脚本 insert.php,如下所示:
...
<FORM METHOD="POST" ACTION="insert.php">
... |
这个表单的主要组件是:文本输入框 "Personal_FirstName" 和 "Personal_LastName",
三个用于输入雇员的 SSN 的文本框,以及具有工作名称和相应分配的工作代码的下拉单选列表,见下面摘录的
代码:
. . .
<SELECT NAME="Job_Title">
<option value="200" selected>Application Programmer</option>
<option value="201">Database Administrator</option>
<option value="202">Technical Support</option>
<option value="203">Database Designer</option>
</SELECT>
. . .
|
注意:为了重点介绍主要的概念,此示例并没有引入严格的用户数据输入验证和错误处理,
这在生产质量的应用程序中通常是会有的。
当用户点击 Submit Form 按钮时,下面所示的 insert.php 脚本就会在服务器端运行:
清单 1. PHP 代码示例
<?
//MySQL server username, password, and database name
$username="username";
$password="password";
$database="CONTRACTING";
//Extracting information from the form
$first_name=$_POST['Personal_FirstName'];
$last_name=$_POST['Personal_LastName'];
$ssn=$_POST['Personal_SSN1'].$_POST['Personal_SSN2'].$_POST['Personal_SSN3'];
$job_id=$_POST['Job_Title'];
echo '<b>', 'Data extracted from the form: ', '</b>', <br>';
echo 'First Name: ', "$first_name", '<br>';
echo 'Last Name: ', "$last_name", '<br>';
echo 'Social Security Number: ', "$ssn", '<br>';
echo 'Job ID: ', "$job_id", '<p>';
//Connecting to the MySQL server
echo '<b>', 'MySQL server connection status: ', '</b>';
$conn=mysql_connect('127.0.0.1',$username,$password);
if (!$conn) {
die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully', '<p>';
//Changing into the database
echo '<b>', 'Selecting database ', "$database", ' status: ', '</b>';
@mysql_select_db($database) or die( "Unable to select database");
echo 'Successful', '<p>';
//Inserting data into the database
$query = "INSERT INTO EMPLOYEE VALUES ('$ssn','$last_name','$first_name','$job_id')";
echo '<b>', 'SQL query: ', '</b>', "$query", '<p>';
echo '<b>', 'Inserting data status: ', '</b>';
$result=mysql_query($query);
if (!$result) {
die(mysql_error());
}
echo 'Successful', '<p>';
//Displaying inserted data
$query="SELECT * FROM EMPLOYEE";
$result=mysql_query($query);
if (!$result) {
die(mysql_error());
}
$num=mysql_numrows($result);
mysql_close($conn);
echo "<b><center>Displaying the EMPLOYEE table contents:</center></b><br><br>";
$i=0;
while ($i < $num) {
$first_name=mysql_result($result,$i,"EMP_FNAME");
$last_name=mysql_result($result,$i,"EMP_LNAME");
$ssn=mysql_result($result,$i,"EMP_SSN");
$job_id=mysql_result($result,$i,"JOB_CODE");
echo "<b>$first_name $last_name</b><br>SSN: $ssn<br>Job ID: $job_id<p>";
$i++;
}
?>
|
PHP 脚本的输出如 图 2 所示。
图 2. PHP 脚本生成的 HTML 网页
注意,关于雇员 Adam Adams 的最后一个条目已经如预期地插入到 EMPLOYEE 表中。
通过此示例可以看出,使用 PHP、Apache 和 MySQL 创建数据库驱动的 Web 应用程序是多么简单,
在主流的 Linux 发行版本(包括用于 POWER 和 PPC 体系结构的 Linux)中默认都会包含这些组件。
使用 Java 进行 MySQL 开发
有一类非常广泛的话题:与 MySQL 等关系型数据库通信的基于 Java™ 的多层应用程序。
本节介绍了一个非常简单的示例,使用本地 Java 应用程序连接到 MySQL。
为了让 Java 程序能够与特定的数据库进行通信,您要有一个用于那个数据库的 Java Database Connectivity(JDBC)
驱动程序。与大部分主流的关系数据库管理系统(Relational Database Management Systems,RDBMS)一样,MySQL 也有
其自己的 JDBC 驱动程序,当前包括:
- 来自 MySQL AB 的 MySQL Connector/J
- Resin JDBC 驱动程序
MySQL Connector/J 是用于 MySQL RDBMS 的 Sun 的 JDBC 3.0 API 实现,是用于 MySQL 的官方 JDBC 驱动程序。
它是百分之百使用 Java 编写的,因此可以运行于任何具备适当 JVM 环境的操作系统中,包括 POWER 上 Linux 发行版本。
所以,此示例使用的是 Connector/J 驱动程序。它是类型 IV JDBC 驱动程序,已知能够在 POWER 上 Linux 中应用于多种 Web
应用程序服务器,比如 IBM WebSphere、BEA WebLogic、Apache Tomcat、JBoss,还有很多。
当然,除了需要用于 MySQL 的 JDBC 驱动程序以外,您还需要 JDK 本身。撰写本文时,IBM 为用于 POWER 和 PPC 体系结构
的 Linux 所提供的最新版本是 JDK 1.4.2,既有 32-位 的也有 64-位的。可以在线获得针对 Java 技术的
IBM Developer Kits(见 参考资料)。
此示例展示的基本代码将连接到 MySQL 数据库并执行查询。
下面是本示例的完整的 Java 代码:
清单 2. Java 代码示例
import java.io.*;
import java.util.*;
import java.sql.*;
public class Java_MySQL
{
public static void display_rs(ResultSet rs) throws SQLException
{
try{
ResultSetMetaData rsmd = rs.getMetaData();
for (int i = 1; i <= rsmd.getColumnCount(); ++i)
System.out.print("\t\t\t" + (rsmd.getColumnName(i)).toUpperCase() );
System.out.println();
while ( rs.next() )
{
for (int j = 1; j <= rsmd.getColumnCount(); ++j)
{
Object obj = rs.getObject(j);
System.out.print("\t\t\t" + obj.toString());
}
System.out.println();
}
}
catch (SQLException E) {
System.out.println("SQLException: " + E.getMessage());
System.out.println("SQLState: " + E.getSQLState());
System.out.println("VendorError: " + E.getErrorCode());
E.printStackTrace();
System.exit(1);
}
}
public static void main(String args[])
{
Statement statement = null;
Connection connection = null;
ResultSet resultset;
String query, prompt, input;
int choice = -1;
try {Class.forName("com.mysql.jdbc.Driver").newInstance();}
catch (Exception E) {
System.err.println("Unable to load driver.");
E.printStackTrace();
System.exit(1);
}
try {
String url="jdbc:mysql://localhost/CONTRACTING";
String username="username";
String password="password";
connection=DriverManager.getConnection(url, username, password);
}
catch (SQLException E) {
System.out.println("SQLException: " + E.getMessage());
System.out.println("SQLState: " + E.getSQLState());
System.out.println("VendorError: " + E.getErrorCode());
E.printStackTrace();
connection=null;
System.exit(1);
}
prompt = "\n\t\t\t1. Show contents of the table JOB\n" +
"\t\t\t2. Exit\n\n";
while(true)
{
System.out.println(prompt);
try {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
input = in.readLine();
choice = Integer.parseInt(input);
}
catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
try {
switch (choice)
{
case 1:
query="SELECT * FROM JOB;";
statement = connection.createStatement();
resultset = statement.executeQuery(query);
display_rs(resultset);
break;
case 2:
System.out.println("Bye!");
System.exit(0);
default:
System.err.println("Invalid value entered!");
}
}
catch (SQLException E) {
System.out.println("SQLException: " + E.getMessage());
System.out.println("SQLState: " + E.getSQLState());
System.out.println("VendorError: " + E.getErrorCode());
E.printStackTrace();
connection=null;
System.exit(1);
}
}
}
}
|
函数 display_rs() 中有显示 ResultSet 对象的
标准代码。与 MySQL 数据库的连接在 main() 函数中完成。
在 MySQL Connector/J 中实现 java.sql.Driver 的类的名称是
com.mysql.jdbc.Driver。org.gjt.mm.mysql.Driver 类名
可以用于保持与较老版本的向后兼容。
让 JVM 可以使用 Connector/J JDBC 驱动程序的最常见方式是,在 CLASSPATH 变量中
包含 mysql-connector-java-[version]-bin.jar 文件的路径。
下面给出了字符串,接着是通常的 JDBC URL 格式:
String url="jdbc:mysql://localhost/CONTRACTING";
|
成功地连接到 MySQL 服务器和数据库后,您就可以执行简单的查询,如下:
1. Show contents of the table JOB
2. Exit
|
选项“1”将显示出查询 “SELECT * FROM JOB”的结果。
JOB_CODE JOB_NAME JOB_HOUR_CHRG
200 Application Programmer 35.48
201 Database Administrator 38.50
202 Technical Support 27.00
207 Database Designer 49.99
|
第二个选项将生成 JOB 表的内容,第三个选项将关闭程序。
此示例的编译和运行使用的是 IBM 为用于 POWER 和 PPC 体系结构的 Linux 所提供的 64-位 JDK 1.4.2。
使用 C 和 C++ 进行 MySQL 开发
在 MySQL 服务器中附带了用于连接 MySQL 的官方 C API。要使用用于 MySQL 的 C API,您的代码必须包含 mysql.h 头文件,
确保您的程序链接到 MySQL 客户机程序库。
也有 C++ API,名为 MySQL++,用于通过 C++ 连接 MySQL。这个 API 是 MySQL 的 C API 的一个 C++ 包装器。
它是依照标准模板库(Standard Template Library,STL)的原理构建的。所以,使用它与使用 STL 组件一样
简单。可以从 Tangentsoft.net 获得 MySQL++;那个 Web 站点还有很多能够编译的示例,可以用来自学这个 API(见 参考资料)。
本节给出了一个示例,介绍如何在 POWER 和 PPC 上的 Linux 中使用用于 MySQL 的官方 C API。
下面是一个简单的代码示例,展示了连接到 MySQL 数据库并从中获取数据所需要的标准函数调用:
清单 3. C 代码示例
#include <stdlib.h>
#include <stdio.h>
#include <mysql.h>
int
main(int argc, char **argv) {
MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;
unsigned int num_fields;
unsigned int i;
char *query="SELECT * FROM JOB";
/*Initializing MySQL connection*/
if(mysql_init(&mysql)==NULL) {
printf("Failed to initate MySQL connection\n");
exit(1);
}
/*Connecting to MySQL server*/
if (!mysql_real_connect(&mysql,"127.0.0.1","username","password",NULL,0
,NULL,0)) {
printf( "Failed connect to the server: %s\n",
mysql_error(&mysql));
exit(1);
}
/*Selecting database*/
if(mysql_select_db(&mysql,"CONTRACTING")!=0)
printf( "Failed select CONTRACTING: %s\n", mysql_error(&mysql));
/*Performing SQL query*/
if(mysql_query(&mysql,query)) {
printf("MySQL query error: %s\n",mysql_error(&mysql));
mysql_close(&mysql);
exit(1);
}
res = mysql_store_result(&mysql);
if (res) {
num_fields = mysql_num_fields(res);
while ((row = mysql_fetch_row(res)))
{
for(i = 0; i < num_fields; i++) {
printf("%s\t", row[i] ? row[i] : "NULL");
}
printf("\n");
}
mysql_free_result(res);
}
else {
if(mysql_field_count(&mysql) > 0)
{
printf( "Error getting records: %s\n", mysql_error(&mysql));
}
else {
printf( "Failed to find any records and caused an error:
%s\n", mysql_error(&mysql));
}
}
mysql_close(&mysql);
}
|
可见,程序的标准结构与先前的示例是相同的:初始化连接、连接到服务器、选择数据库并执行查询、显示结果,最后
关闭数据库连接。
要使用用于 POWER 上 Linux 的 IBM XL C/C++ 编译器进行编译,请执行下面的命令:
xlc -o C_MySQL C_MySQL.c -qarch=auto –O -I/usr/local/mysql/include
-L/usr/local/mysql/lib -lmysqlclient -lz
|
使用 GNU C/C++ 编译器编译同样的代码,需要的编译器标记相同,只是要减去 –qarch=auto
选项,如下所示:
g++ -o C_MySQL C_MySQL.c –O -I/usr/local/mysql/include
-L/usr/local/mysql/lib -lmysqlclient -lz
|
–qarch=auto 选项指示 IBM XL C/C++ 编译器自动确定主机 POWER 或者 PPC 体系结构,并
为其生成高度优化的代码。
IBM XL C/C++ 编译器可以为 POWER 和 PPC 体系结构生成高度优化的机器代码,相对于使用 GCC 的 C/C++
编译器所编译的二进制代码,通常会有显著的性能提高。要深入了解用于 POWER 上 Linux 的 IBM XL C/C++
编译器,请参考 XL C/C++ Advanced Edition for Linux Web 网页(见 参考资料)。
当运行那个编译过的二进制程序时,会执行“SELECT * FROM JOB”查询,并向标准输出打印结果。
200 Application Programmer 35.48
201 Database Administrator 38.50
202 Technical Support 27.00
207 Database Designer 49.99
|
可见,MySQL 的 C API 相当简单易用。
使用 Python 进行 MySQL 开发
在用于 POWER 和 PPC 体系结构的 Linux 发行版本中,您也可以使用脚本语言(比如 Python、Perl 和 Ruby)来开发与 MySQL 通信的
应用程序。在用于 POWER 和 PPC 的主流 Linux 中,包含了针对这些语言的
MySQL API 以及运行期环境。
本节介绍了如何使用 Python 开发一个用于 MySQL 的简单示例应用程序。
要在 Linux 中开发用于 MySQL 的 Python 应用程序,您需要至少安装两个组件:
- Python 解释运行期环境
- 用于 Python 的 MySQLdb Python-MySQL 数据库服务器接口
在 Red Hat Enterprise Linux(RHEL)和 SUSE LINUX Enterprise Server(SLES)等用于 POWER 体系结构的 Linux 中,
会包含上面的两个组件。
您也可以访问 Python.org 和 Python-MySQL 项目主页来获得最新的 Python 环境(见 参考资料)。
下面的示例展示了一个简单的 Python 应用程序。
清单 4. Python 代码示例
#! /usr/bin/python
# import MySQL module
import MySQLdb
# connect to the database
db = MySQLdb.connect(host="127.0.0.1", user="username",
passwd="password", db="CONTRACTING")
# get a cursor
cursor = db.cursor()
# SQL statement
cursor.execute("SELECT * FROM JOB")
# get the result set
result = cursor.fetchall()
# iterate through the result set
for record in result:
print record[0] , "\t", record[1], "\t", record[2]
|
可见,这个示例程序的结构很简单,遵循了先前示例的结构。
假定文件名是 python2mysql.py,则您可以通过执行下面的命令来执行这个程序:
另一种方式,您可以修改 python2mysql.py 的权限,令其可以执行,然后执行它。在这种情况下,必须要
有类似如下的“magic”行:
要在运行之前修改权限以使得文件可以执行,运行下面的命令:
chmod 755 python2mysql.py |
现在我们就可以如运行 shell 脚本一样运行这个文件:
nik@bluebill:~> ./python2mysql.py
200 Application Programmer 35.48
201 Database Administrator 38.5
202 Technical Support 27.0
207 Database Designer 49.99 |
要获得关于 Python 的更多资料,请参考 Python 文档项目(见 参考资料)。
使用 Perl 进行 MySQL 开发
要使用 Perl 开发用于 MySQL 的应用程序,您需要至少拥有下面的组件:
- Perl 解释运行期环境
- Perl 数据库接口(Database Interface,DBI)
- 用于 MySQL 数据库的 Perl 数据库接口
在 RHEL 和 SLES 等主流的 POWER 上 Linux 发行版本的标准发行版本中,包含全部这些组件。
在网络上可以找到最新的 Perl 和 Perl MySQL DBI 发布版本和文档(见 参考资料)。
本节给出了一个简单的示例,执行与前面的 Python 示例相同的功能。
下面的示例连接到 CONTRACTING 数据库,执行查询并显示出结果:
清单 5. Perl 代码示例
#!/usr/bin/perl
use DBI;
# server host information
$host="127.0.0.1";
$port="3306";
#database and user credentials information
$db="CONTRACTING";
$userid="mysql";
$passwd="";
$connectionInfo="DBI:mysql:database=$db;$host:$port";
# connect to the database
$dbconn = DBI->connect($connectionInfo,$userid,$passwd);
# prepare and execute query
$query = "SELECT * FROM JOB ORDER BY JOB_CODE";
$st = $dbconn->prepare($query);
$st->execute();
# assign columns
$st->bind_columns(undef, \$JOB_CODE, \$JOB_NAME, \$JOB_HOUR_CHRG );
# output the result
while($st->fetch()) {
print "$JOB_CODE\t $JOB_NAME\t $JOB_HOUR_CHRG\n";
}
$st->finish();
# disconnect from the database
$dbconn->disconnect;
|
与先前的 Python 示例一样,可以在命令行中通过解释器运行这个 Perl 代码:
或者令其可以执行:
并如同运行 shell 脚本一样运行它:
nik@bluebill:~> ./perl2mysql.pl
200 Application Programmer 35.48
201 Database Administrator 38.50
202 Technical Support 27.00
207 Database Designer 49.99 |
在后面一种情况下,必须要有指向 Perl 二进制程序位置的“magic”行:
要获得关于联合使用 Perl 和 MySQL 的更多资料,请参考 MySQL Perl Web 网页(见 参考资料)。
结束语
人们普遍认为 MySQL 是当前性能最好的可用开放源代码企业级 Linux 关系数据库服务器之一。IBM 64-位 POWER 平台具备
出众的性能、可靠性和高可用性,能够满足现今客户的所有需求。MySQL RDBMS 具备强健的特性,基于 IBM POWER 处理器的服务
器具备微分区、动态启用和禁用 SMT 的能力,它们联合起来为市场提供了一个最为强大的 Linux 数据库服务器平台。
参考资料
关于作者  | |  |
Nikolay Yevik 是 IBM eServer Solutions Enablement 团队的一名 Linux 技术顾问,在那里他帮助 ISV 在 IBM
pSeries 平台上应用 AIX 和 Linux 应用程序。 |
对本文的评价
|