top
Loading...
7.1.2.為可移植性設計應用程序
7.1.2. 為可移植性設計應用程序

因為不同SQL服務器實現了標準SQL的不同部分,需要花功夫來編寫可移植的SQL應用程序。對很簡單的選擇/插入,很容易實現移植,但是需要的功能越多則越困難。如果想要應用程序對很多數據庫系統都快,它變得更難!

為了使一個復雜應用程序可移植,你需要選擇它應該工作的SQL服務器,并確定這些服務器支持什么特性。

所有數據庫都有一些弱點。這就是它們不同的設計折衷導致的不同行為。

可以使用MySQLcrash-me程序來找出能用于數據庫服務器選擇的函數、類型和限制。crash-me并不能找出所有的特性,但是其廣度仍然很合理,可以進行大約450個測試。

crash-me可以提供的一種類型的信息的例子:如果想要使用InformixDB2,不應該使用超過18個字符的列名。

crash-me程序和MySQL基準程序是獨立于數據庫的。通過觀察它們是如何編寫的,編可以知道必須為編寫獨立于數據庫的應用程序做什么。基準本身可在MySQL源碼分發的“sql-bench”目錄下找到。它們用DBI數據庫接口以Perl寫成。使用DBI本身即可以解決部分移植性問題,因為它提供與數據庫無關的的存取方法。

如果你為數據庫的獨立性而努力,需要很好地了解每個SQL服務器的瓶頸。例如,MySQL在檢索和更新MyISAM表記錄方面很快,但是在同一個表上混合慢速讀者和寫者方面有一個問題。另一方面,當你試圖訪問最近更新了(直到它們被刷新到磁盤上)的行時,在Oracle中有一個很大的問題。事務數據庫總的來說在從記錄文件表中生成總結表方面不是很好,因為在這種情況下,行鎖定幾乎沒有用。

為了使應用程序“確實”獨立于數據庫,需要定義一個容易擴展的接口,用它可操縱數據。因為C++在大多數系統上可以適用,使用數據庫的一個C++ 類接口是有意義的。

如果你使用某個數據庫特定的功能(例如MySQL專用的REPLACE語句),應該為SQL服務器編碼一個方法以實現同樣的功能。盡管慢些,但確允許其它服務器執行同樣的任務。

MySQL,可以使用/*! */語法把MySQL特定的關鍵詞加到查詢中。在/**/中的代碼將被其它大多數SQL服務器視為注釋(并被忽略)

如果高性能真的比準確性更重要,就像在一些web應用程序那樣,一種可行的方法是創建一個應用層,緩存所有的結果以便得到更高的性能。通過只是讓舊的結果在短時間后‘過期’,能保持緩存合理地刷新。這在極高負載的情況下是相當不錯的,在此情況下,能動態地增加緩存并且設定較高的過期時限直到一切恢復正常。

在這種情況下,表創建信息應該包含緩存初始大小和表刷新頻率等信息。

實施應用程序緩存的一種方法是使用MySQL查詢緩存。啟用查詢緩存后,服務器可以確定是否可以重新使用查詢結果。這樣簡化了你的應用程序。參見5.13節,“MySQL查詢高速緩沖”。

作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/optimization.html
北斗有巢氏 有巢氏北斗