2014-10-22 50 views
0

我有一個涉及從多個設備(千次)記錄數據的項目 - 設備每X秒發送一次需要記錄的數據。快速多次在不同線程的SQL服務器上插入

設備嚮應用服務器(Apache TomEE)發送HTTP GET請求,服務器解析請求並將其存儲到SQL Server數據庫。

TomEE服務器被複制3次,並且負載均衡器在它們之間循環請求。 我用OpenJPA中存儲的記錄,這樣(的em持有需要存儲的記錄):

EntityTransaction tx = em.getTransaction(); 
    try { 
     tx.begin(); 
     u = execute(em); 
     tx.commit(); 
    } catch (SQLException | RuntimeException e) { 
     u = handleError(e); 
     if (tx.isActive()) 
      tx.rollback(); 
    } finally { 
     em.close(); 
    } 

當我測試的性能用JMeter我發現這個架構處理每秒約200請求 - 我想讓它變得更快。 我想到了一些方向:

  1. 插入多個記錄在一個事務中能夠提高性能,但我怎麼可以插入多個記錄更在一個單一的交易? (它們都來自不同的HTTP請求)
  2. 也許不同配置的SQL服務器可以提升性能?
  3. 也許SQL服務器機器需要更多的CPU /內存 - 我怎麼知道這是不是bottelneck?
  4. 從業務邏輯的角度來看,事務可以寫成並列 - 我如何驗證te服務器配置沒有設置爲逐一模式?

有人可以考慮在其他方向改善嗎?

有人可以推薦一些方法來找到瓶頸嗎?

謝謝!

回答

0

最好的方法是: 1)監視數據庫並查看其負載(它是有限的,中間可以縮放不是數據庫)。 2)使用jstack獲取一些線程堆棧或在服務器上殺掉-3來查看會發生什麼。如果沒有足夠的分析可以幫助,但我懷疑它會在這裏有用