|
|

许多WEB应用程序内部通常重复运行带不同自变量的相同数据库查询,或以全有或全无块的形式执行一组相关查询。要满足这些要求,大多数数据库系统(包括MySQL)支持预编译查询与事务,多数脚本语言(如PHP和Perl)也拥有内置函数访问这些数据库特性。然而,上述两项特性是MySQL的新功能,因此给那些以前没有见过它们的开发者制造了一些麻烦。
本文旨在解决这一问题。文章讨论了支持MySQL事务和预编译查询的Perl DBI函数,并对其工作原理和应用方法进行说明。
预编译查询
在数据库中执行批量上传时,我们经常见到这样的SQL查询,这些查询仅在提交给INSERT命令的参数上有所不同。在这些情况下,应用所谓的预编译查询是一种常用的优化方法,它为查询建立一个模板,然后再向模板中导入不同的必要值,从而减少了数据库消耗。如果使用得当,这个特性能够显著提高应用程序的性能。
为说明这一点,我们以一个二域表格为例,如下面的列表A所示:- mysql> SELECT * FROM users;
- +-------+--------+
- | fname | lname|
- +----------------+
- | Joe| Blow|
- +-------+--------+
- 1 row in set (0.09 sec)
复制代码列表A
现在,假设我需要通过INSERT查询向这个表格中输入一组新记录。很明显,每次运行时,查询的格式保持不变,只有输入的值发生变化。要完成这一操作,最佳方法是为INSERT查询建立一个内置DBI“占位符”的模板,然后在每次运行时用实际值来代替占位符。如列表B所示:- #!/usr/bin/perl
- use DBI;
- # create database connection
- my $dbh = DBI->connect("DBI:mysql:database=somedb;
- host=localhost", "user", "pass", {'RaiseError' => 1});
- # prepare template query
- my $sth = $dbh->prepare
- ("INSERT INTO users (fname, lname) VALUES (?, ?)");
- # execute query with first set of parameters
- $sth->execute('John', 'Doe');
- # execute query with second set of parameters
- $sth->execute('Jane', 'Low');
- # close connection
- $dbh->disconnect();
复制代码列表B |
|