Сбор данных в кеше и запись в базу данных - PullRequest
0 голосов
/ 03 октября 2011

Мне нужна помощь в кэшировании.

Вот мое требование:

У меня есть приложение, у которого миллионы обращений в день. В настоящее время я регистрирую информацию, такую ​​как журналы сеансов и транзакций, в таблицах журналов, используя прямые вставки в БД, что снижает производительность приложения.

Я хочу что-то вроде: я использую некоторый механизм кэширования, который должен собирать данные за удар. Я запишу его в файл, и как только файл будет содержать, скажем, 1000 записей, эти записи из кэша должны отправляться в базу данных в виде одного пакета. (Писать было бы хорошо).

Может кто-нибудь помочь решить эту проблему?

Ответы [ 2 ]

3 голосов
/ 03 октября 2011

Решение: использование log4j с AsynAppender и JDBCAppender.

Вы можете настроить размер буфера вашего AsynAppender в файле log4j.xml. Затем, когда буфер заполнен, он будет использовать 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>

Таким образом, он делает то, что вы описываете, и вам даже не нужно писать строку кода ;-) ну почти ...

Подробнее:

Вы можете сохранить данные, используя MDC log4J. MDC - это в основном хэш-карта, в которой вы можете хранить данные, которые вы хотите записать (ключ, значение). Затем в файле log4j.xml вы можете получить доступ к данным в MDC с помощью% X.

например:

<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 голосов
/ 03 октября 2011

В memcached наверняка найдется Java-интерфейс, который решит эту проблему.В своем коде регистрации просто добавьте элемент для регистрации в memcached, а затем каждые X записей запишут их все за один раз.

Фактически, вы можете выполнить пакетную запись в отдельном процессе, так чтопопадание в кеш, запись не испытывает дополнительной задержки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...