2011-10-03 142 views
0

我需要緩存方面的幫助。在緩存中收集數據並寫入數據庫

這裏是我的要求:

我有擁有每天數百萬點擊率的應用。目前,我正在使用直接數據庫插入將會話和事務日誌等信息記錄在日誌表中,這會降低應用程序的性能。

我想要的東西是這樣的:我使用一些緩存機制,應該每次點擊收集數據。我將它寫入一個文件,一旦文件包含1000條記錄,緩存中的這些條目應該作爲一個批處理進入數據庫(寫入後面會很好)。

有些人可以幫忙解決這個問題嗎?

+0

這是[你以前的問題]的副本(http://stackoverflow.com/questions/7609840/ehcache-not-resume-db-writing-after-server-restart)? Stackoverflow協議不是重新提出問題,而是編輯它們以使它們更好。 –

+0

這個問題與Ehcache有關。但我認爲可能是我的要求無法用該框架實現,所以我將其作爲新問題發佈以獲得更多想法和建議。 – Yahiya

回答

3

解決方案:將log4j與AsynAppender和JDBCAppender配合使用。

您可以在log4j.xml中配置AsynAppender的緩衝區大小。然後,當緩衝區已滿時,它將使用JDBCAppender刷新數據庫中的所有內容。

例如:

<appender name="DB" class="org.apache.log4j.jdbc.JDBCAppender"> 
    .... 
    your DB CONFIG 


    <appender name="PerfAppender" class="org.apache.log4j.AsyncAppender"> 
    <param name="BufferSize" value="5000" /> 
    <appender-ref ref="DB" /> 
</appender> 

這樣,就做你的描述,你甚至不用寫一行代碼;-)以及幾乎...

更多細節:

您可以使用log4J的MDC保存數據。 MDC基本上是一個散列圖,您可以在其中存儲要記錄的數據(鍵,值)。然後在您的log4j.xml中,您可以使用%X訪問MDC中的數據。

例如:

<appender name="DB" class="org.apache.log4j.jdbc.JDBCAppender"> 
<param name="URL" value="yoururlconnection" /> 

<param name="Driver" value="com.ibm.db2.jcc.DB2Driver" /> 
<param name="User" value="myuser" /> 

<param name="Password" value="mypassord" /> 
<layout class="org.apache.log4j.PatternLayout"> 
    <param name="ConversionPattern"   
     value="INSERT INTO mytable (field1, field2, etc) VALUES 
        ('%X{value1}', '%X{value2}', etc)" /> 
     </layout> 
</appender> 
+0

這種方法是否有助於解決JVM崩潰問題?我如何堅持這種方法的數據? – Yahiya

+0

在我的回覆中添加了詳細信息。我不知道JVM崩潰!但是使用asynAppender-> JDBCAppender持久保存使用log4j收集的數據。 AsyncAppender不會影響性能,因爲它是Async。 – Cygnusx1

+0

這種方法在日誌關閉的生產環境中無法幫助我。有沒有其他的緩存機制來實現這一點? – Yahiya

0

有肯定是一個Java接口的memcached,將解決這個問題。在您的日誌記錄代碼中,只需添加項目以記錄到memcached,然後每個X記錄都將它們全部寫入。

實際上,您可以在單獨的進程中執行批處理寫入,因此包含緩存寫入的用戶不會遇到額外的延遲。