2014年11月26日 星期三

連接池(Connection Pool)介紹

對於資料庫的概念實在很不熟,還在想pool是甚麼,游泳池嗎.....
轉貼下 寫的介紹

Connection Pool Introduction

Connection Pool(連線池) 是一種資料庫連線管理的機制,它介於應用程式與資料庫之間;
集中管理資料庫的連線,能有效提升應用程式存取資料庫的效能及減少連線的錯誤。
為什麼要有Connection Pool呢?
如圖一,一般沒有使用Connection Pool的程式,當需要存取資料庫時,
便要建立一個直接與DB相連的連線(Physical Connection)。
圖一 Application_without_ConnectionPool
此做法比較不好的地方在於:
1.資料庫連線的建立成本是昂貴的,故當有許多Thread都需要建立connection時,
其資源的耗費是龐大的。
2. 一個成本昂貴的connection在程式使用完後,馬上就被Close掉,在使用上並沒有達到效益極大化。
3. 程式中請求建立的總連線數可能超過DB允許的連線數而發生Exception。
4. 程式中關於connection的使用若有不恰當的地方,如Statement或Connection沒有close,
並沒有額外的機制提供保護。
當然目標若只是建立小型的AP,可預期的連線數也不多時;其實是不需要Connection Pool的。
而若目標是建立能處理同時間大量連線請求的AP時,Connection Pool就是不可或缺的機制了。
AP中加入Connection Pool後,其運行機制如圖二所示。程式啟動時,
Connection Pool會先跟DB建立好連線(連線數可設定),並且keep住這些連線;
當程式需要使用Connection時,pool便會將手上可用的Connection借給程式,
程式使用完後再歸還給Pool即可。
圖二 Application_with_ConnectionPool

使用Connection Pool的好處有:
1. Pool會keep住與DB的連線。程式需要使用時跟pool要即可。
不用再重複地跟DB建立連線然後又釋放掉。
2. 可設定與DB最大的連線數,避免超過DB所能負擔的連線數。
3. Pool可幫忙驗證Connectin是否還正常,若不正常時,便再與DB建立好的正常連線,

確保程式取得的Connection都是正常可使用的。
4. 額外功能的提供。如幫忙檢查Connection State或幫忙關閉Statement等。
不同的Connection Pool其額外提供的功能當然也會有所不同。

在node.js裡使用node-mysql middleware 的基本query用法

node-mysql 下載及使用。 初始設定
var mysql      = require('mysql');
var DATABASE = 'xpec';
var TABLE ='member';

var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'aaa',
  password : 'xpec',
  database : 'xpec'
});
基本查詢表格印出表格內容
//connection.query()已經建立連建,不用再寫connection.connect()
connection.query('SELECT * FROM ' + TABLE, function(err, results){
      if(err) throw err;
      console.log(results);
});
connection.end(); //結束連線
table插入資料
connection.query('INSERT INTO ' + TABLE +' SET ? ',{User: 'jjjj', Psd:'123'},function(err, result){
  console.log(result.insertId);
});
connection.end();
修改update table資料
connection.query('UPDATE ' + TABLE + ' SET ' + 
'Psd=? WHERE id=?',['45645646',1],function (err,result){
  if(err){
    console.log(err);
  }else{
    console.log(result.affectedRows);
  }
});
刪除table資料
connection.query('DELETE FROM ' + TABLE +
 ' WHERE id = ? ',[3] ,function(err, result){
  if(err){
    console.log(err);
  }else{
  console.log(result.affectedRows);
  }
});

2014年11月11日 星期二

session的兩個種類(集中式,cookie-based)

session因儲存的方式不同分為兩個種類:

集中式:
ServerIDclient

舉例:在最原始的 Session 設計,大多開發者都將資料存在 Server 上,也就是你點了什麼飲料,都是記錄在 Server 裡,可能是 Database、記憶體或是檔案可以以任何一種形式儲存。然後,當你去領飲料時,店員會輸入你的號碼,用你的號碼得知你是否點過餐、點了什麼東西。

問題:
client進入不同的server的話,資料無法共享。
一般的小網站,這樣的解決方案並沒有什麼問題。但是對今天這種超大流量的網站服務來說,因為他們有無數台對外的 Server,有如無數個服務窗口,讓顧客總是隨機進入其中一個窗口來兌換飲料,所以後端怎麼存放和共享這個 session 資料,又要兼顧效能和方便維護,就變成是很大的問題。

cookie-based:
server直接把資料存在client,用clientcookie儲存session

舉例: 就是把你點什麼飲料,通通直接寫在號碼牌上。Server 就可以直接看你的號碼牌上寫了什麼,而不必花大量時間去後面建立大規模的 Server 來處理 Session

問題:Session 資料放在 cookie 裡比較快,還是放在 Server 上的資料庫比較快?
答案是放在cookie比較好。以現在頻寬限制來說,多了4k資料也不算甚麼。答案通常會是放在 cookie (以現在的頻寬限制來說,就算多了 4K 資料也不算什麼)。因為你可以省下每次 Client 連線後,去檔案或是資料庫裡挖出 Session 資料的步驟。
cookie-based只需要直接把 Client Server cookie 打開,把資料解密後取出就好,是兩次 Database 存取和一次存取的差別。


什麼是 Session 傳值?

時常會聽到『使用 Session 傳值』這類說法,其實就是利用 Session 機制儲存資料,讓不同頁面之間可以互相傳遞資料。其原理通常是使用 Query String POST body 等方法,把資料往 Server 傳之後,在 Server 端將 Client 上傳的資料存在 Session 之中。之後的連線或開啟其它頁面時,因為你拿的號碼牌是同一個,所以在不同的頁面之下,仍然可以讀到前一次所儲存在 Session 的狀態。