Effective-Perl-Notes
可遵循 perlstyle 文档的风格.
本书相关的网站 ( http://effectiveperl-programming.com/ )
Perl 高尔夫, 是一种不定时举行的 Perl 程序设计游戏, 以程序编码最短者获胜, 就像高尔夫球中最少杆者获胜一样, 具体参考 http://perlgolf.sourceforget.net/
第12章 数据库
预备 SQL 语句以复用并节省时间
先缓存对查询语句的解析和预处理结果, 以便后续执行时复用.
prepare
方法返回查询语句句柄对象 $sth
, 将相关预备信息存储在其内部:
1 |
|
碰到使用占位符构造的查询语句, 数据库会自动缓存.
在查询语句句柄对象上调用 execute
方法来查询:
1 |
|
使用 prepare_cached
可以自动缓存查询句柄.
利用 SQL 占位符将参数值自动引起
始终在 SQL 语句检索值的位置使用占位符. 可以改善性能以及避免 SQL 注入.
注意
- 不要在查询语句中直接内插变量
- 用占位符表示动态数据的值
要是单条语句需要多次运行, 可以将它先做预备, 然后在执行时提供具体数据:
1 |
|
创建动态的 SQL 元素.
占位符只适用于代表插入查询语句中的数据值 (也就是 scalar value), 无法表示查询语句的某个组成部分. (如数据库, 表的名字).
若是在运行时才能确定所查询的表, 可以利用 DBI 的 quote_identifier
方法将表名变量的值安全转义后构造查询语句:
1 |
|
通过绑定返回列快速访问数据
直接将固定变量的引用绑定到查询句柄上, 通过类似内存指针的方式定位数据, 避免无效的赋值操作.
使用 bind_columns
或 bind_col
来选择需要的列.
如, 将以下代码:
1 |
|
改为:
1 |
|
复用数据库连接
连接数据库是一项比较耗时的操作, 应避免创建过多的连接, 尽可能使用缓存的连接.
如果一段时间没有交互, 数据库服务器会切断连接, 可以用 DBI 的 ping
方法检查当前连接是否有效.
1 |
|
考虑共享数据库连接, 如:
- 一个对象一个连接
- 一个类一个连接
- 在进程间共享连接
在进程间共享连接可使用 DBD::Gofer
模块架设代理服务器, 由它管理 DBI 连接. 它会在独立进程中维护连接缓存.