首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Log4j 多線程寫入數據庫並發衝突:利用數據庫事務而非應用層鎖

     編輯:程式設計綜合問答

問題場景

  • Mina 框架多線程接收數據。
  • 使用 Log4j MDC 存儲會話信息(創建時間、上下文、斷開時間)。
  • 線程結束時寫入數據庫,但多線程並發導致 MDC 數據相互覆蓋。

錯誤做法

在應用層用 ConcurrentHashMap 存儲待寫入數據,試圖加鎖同步 → 複雜且性能差。

正確架構:JDBC Appender + 連接池

<!-- log4j.properties -->
log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DB.driver=com.mysql.jdbc.Driver
log4j.appender.DB.url=jdbc:mysql://localhost:3306/logdb
log4j.appender.DB.user=root
log4j.appender.DB.password=123456
log4j.appender.DB.sql=INSERT INTO logs (session_id, create_time, context, close_time) VALUES ('%X{sessionId}', '%X{createTime}', '%X{context}', '%X{closeTime}')
log4j.appender.DB.layout=org.apache.log4j.PatternLayout

關鍵點

  1. 每個線程獨立擁有 MDC 上下文,互不干擾。
  2. JDBCAppender 內部使用連接池(如 DBCP、HikariCP),數據庫層面處理並發寫入。
  3. 無需應用層鎖,數據庫事務保證原子性。

若需批量寫入

可自定義 Appender 繼承 AppenderSkeleton,緩衝一定條數後批量 executeBatch,但單條寫入通常已足夠高效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved