摘 要:隨著Internet平臺下各種技術和服務的迅速發展,web信息系統也得到了很大的發展。與此同時,web信息系統所要處理的數據也越來越多,這就對系統的性能提出了更高的要求。數據庫是web信息系統的核心,其應用水平直接影響信息系統的性能。現在的數據庫信息系統數據繁雜龐大,數據庫的訪問操作頻繁,因此要求數據庫擁有高吞吐量,高效,及時,準確處理數據的特點。因而如何對信息系統中數據庫的性能進行優化具有重大意義,它可以提高信息系統的響應速度,減少數據的空間占用。本文的研究主要以我們正在做的一個項目——網上競價系統作為平臺,著重從軟件工程的角度來研究,在軟件開發的各個階段可以采用什么策略來對數據庫進行優化。
關鍵詞:網上競價系統;數據庫;優化策略
1 項目介紹
本網上競價系統是為采購商和供貨商提供公平交易,理想選擇,合理投標的網絡平臺。
本系統劃分為九個模塊,各模塊如下:注冊登錄,商品庫管理,公告管理,合作供應商管理,會員管理,競標管理,招標控制,采購項目管理,郵件管理。
2 數據庫設計
2.1 物理模型
這個數據庫設計可以分為一下幾個部分:
系統的兩類用戶
另外,采購商和供應商之間可以相互發送Email,它們是多對多的關系,所以可以單獨建立一個Email表來存放信息,避免如下情況所產生的數據冗余:一個采購商和一個供應商之間可以發送多封Email,如果將信息存放在Buyer或Supplier表中,那么假如雙方發送了n封郵件,則Buyer或Supplier中的屬性將會重復儲存n-1次。
采購商和供應商參與到一個采購項目(Project)之中同樣將采購商、供應商和采購項目之間的聯系單獨存放到一張表paticipate中,以減少數據冗余。
供應商對子項目(item)進行報價
供應商有自己的信用度(SupplierEvaluation)
供應商可以管理自己的商品(SupplierProduct)
商品有自己的類型(ProductType)
2.2 產品管理模塊的實現和優化
持久層主要采用Spring+Hibernete的架構實現。供應商產品的管理主要涉及供應商(Supplier)、產品(SupplierProduct)和產品的類型(Producttype)這三個對象,它們分別與數據庫的中Supplier、SupplierProduct、Producttype三張表對應。我們可以通過面向對象的方法來對數據庫進行操作。比如說新增供應商產品,我們可以在業務邏輯層構造一個SupplierProduct對象,然后直接調用SupplierProductDAO的Save方法將其寫到數據庫。代碼如下:
public void addProduct(SProductForm s) throws NumberFormatException, RuntimeException{
String n=s.getType();
List l=typeDAO.findByPtypeName(n);
Producttype type=(Producttype)l.get(0);
//獲取當前登陸供應商
Supplier supplier= getCurrentSupplier();
//產品
Supplierproduct product=new Supplierproduct();
product.setSproductQuatity(Integer.parseInt(s.getQuantity()));
product.setProducttype(type);
product.setSupplier(supplier);
product.setSproductBrand(s.getBrand());
product.setSproductDesc(s.getDesc());
product.setSproductName(s.getName());
//保存產品
productDAO.save(product);
}
而ProductDao類繼承Spring的HibernateDaoSupport,簡化了數據庫的操作,它有一個HibernateTemplate屬性,封裝了Hibernete的一些常用的方法,我們只需要使用Save方法就可以將一個對象寫到數據庫。代碼如下:
public class SupplierDAO extends HibernateDaoSupport implements ISupplierDAO {
private static final Log log = LogFactory.getLog(SupplierDAO.class);
public void save(Supplier transientInstance) {
log.debug(\"saving Supplier instance\");
try {
getHibernateTemplate().save(transientInstance);
log.debug(\"save successful\");
} catch (RuntimeException re) {
log.error(\"save failed\", re);
throw re;
}
}
面向對象的數據庫操作雖然便利,但當關聯對象較多是,性能有受到很大影響。Hibernete3默認為我們提供了延遲加載的機制,使我們不必一次把所有關聯對象全部加載進來,節約了內存,提高了系統的性能。但是這樣做存在一個問題,當Session關閉之后,你就訪問不到與之相關聯的對象,這里我使用了一個過濾器OpenSessionInViewFilter,它使得session在用戶的一個請求期間保持打開狀態,解決了剛才的那個問題。
當多個用戶同時對數據庫進行操作時會造成異常。我們可以對系統加入事務處理的功能,以避免上面的情況。本系統采用了Spring的攔截器,對需要事務管理的方法注入對應的攔截器。
3 結束語
數據庫優化是一個綜合性的任務,涉及到硬件和軟件等方面的知識。通過將以上優化策略應用于該統的設計和實現過程,以驗證優化策略的有效性。
參考文獻
[1]Abraham Silberschatz,數據庫系統概念,機械工業出版社.
[2](英)康諾利等,數據庫設計教程, 清華大學.
[3](美)鮑威爾, 數據庫設計入門經典,清華大學.
[4]SQL語句教程,http://sql.1keydata.com/cn/sql.php.
[5]王熙照,數據庫原理與應用,河北人民出版社.
[6]斯蒂夫(Stephens,R.K.),數據庫設計,機械工業出版社.
[7]數據庫優化全攻略,http://special.e800.com.cn/080304/index.html.
[8]林信良,Spring2.0技術手冊,電子工業出版社.
[9]Hibernete優化,http://www.javaeye.com/topic/352939.
[10]夏昕,深入淺出Hibernate,電子工業出版社.
[11]Leon Atkinson,MYSQL核心編程,清華大學出版社.
[12](奧)Michael Kofler,MySQL5權威指南(第3版) ,人民郵電出版社.