簡體   English   中英

提高數據庫訪問性能

[英]Improve performance of database access

我有一個在端口上偵聽UDP數據報的應用程序。 我使用UDP入站通道適配器來偵聽此端口。 我的UDP通道適配器配置為使用ThreadPoolTask​​Executor調度傳入的UDP數據報。 在UDP通道適配器之后,我使用直接通道。 我的頻道只有一個訂戶,即一個服務激活器。

該服務將傳入消息添加到存儲在內存中的同步列表中。 然后,我有一個單線程,每5秒檢索一次列表的內容,並批量更新到MySQL數據庫。

我的問題:

  1. 第一批郵件到達。 我的ThreadPoolExecutor的線程從UDP通道適配器獲取傳入消息,並將其添加到同步列表中。 假設已經收到並插入了10000條消息。
  2. 后台線程檢索10000條消息並進行批量更新(JdbcTemplate.update(String [])。
  3. 此時,后台線程等待數據庫的響應。 但是,現在,由於數據庫需要花費一些時間來執行10000 INSERT,因此已接收到20000條消息,並且這些消息出現在列表中。
  4. 后台線程從數據庫接收響應。 然后,它檢索20000消息並進行批量更新(JdbcTemplate.update(String [])。
  5. 數據庫執行插入需要花費更多時間,在此期間,已接收到35000條消息並將其存儲在列表中。

堆大小不斷增長,並在一定時間后導致執行內存。

我正在嘗試尋找解決方案以提高應用程序的性能。

謝謝

每5秒存儲10,000條記錄對於任何數據庫而言都是相當可觀的。

您需要考慮其他選擇

  • 使用其他數據存儲,例如NoSQL數據存儲或平面文件。
  • 確保您在磁盤上具有良好的寫入性能,例如使用寫入緩存。
  • 將磁盤子系統與多個磁盤或SSD驅動器一起使用。

意見建議

一種。 您真的需要一個同步列表嗎? 您是否不能有一組列表,比如說在這些列表之間划分工作,比如說對某個鍵的數據運行hashCode呢?

b。 您是否可以使用從列表中讀取信息的線程線程池(順便說一下,我將在此處使用隊列),這樣,當一個線程由於批量插入而被“卡住”時,其他線程仍可以讀取“作業”從隊列中執行它們?

C。 您的數據庫是否與應用程序共托管在同一台計算機上? 這樣可以提高性能

d。 您可以發布插入查詢嗎? 也許有人可以為您提供優化方法?

使用數據庫連接池,這樣您就不必等待任何一個線程上的提交。 只需抓住下一個可用的連接並進行並行插入即可。

我每秒在SQLServer表上獲得5.000次插入,但這需要進行很多優化。 沒有使用下面的所有提示,可能對您有用。

  • 查看http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html中的MySQL Insert Speed文檔提示
  • 並行插入過程
  • 如果可能,匯總消息。 而不是存儲所有消息,而是在某一時間范圍內插入一行,其中包含有關某種類型的時間段內收到的消息的信息。
  • 將表更改為除主鍵外沒有索引或外鍵
  • 切換為寫入文本文件(如果您確實希望將其在夜間導入到loaddata批量文件中,則將其導入數據庫中)
  • 使用單獨的數據庫實例僅服務於您的表
  • ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM