Задержка записи в спящем режиме - PullRequest
4 голосов
/ 13 января 2012

Мне интересно, есть ли возможность спящего режима, откладывающего запись в БД.У меня есть Hibernate настроен для MySQL.Сценарии, которые я надеюсь поддержать, это 80% чтение и 20% запись.Так что я не хочу оптимизировать свои записи, я предпочитаю, чтобы клиент дождался записи в БД, а не вернулся немного раньше.Мои тесты в настоящее время имеют 100 клиентов параллельно, иногда процессор работает на максимуме.Мне нужен этот метод сброса для немедленной записи в БД и возврата только при записи данных.

На моей клиентской стороне я отправляю запрос на запись, а затем запрос на чтение, но запрос на чтение иногда возвращает ноль.Я подозреваю, что hibernate не записывает в БД сразу.

public final ThreadLocal    session = new ThreadLocal();

public Session currentSession() {
    Session s = (Session) session.get();
    // Open a new Session, if this thread has none yet
    if (s == null || !s.isOpen()) {
        s = sessionFactory.openSession();
        // Store it in the ThreadLocal variable
        session.set(s);
    }
    return s;
}
public synchronized void flush(Object dataStore) throws DidNotSaveRequestSomeRandomError {
    Transaction txD;
    Session session;
    session = currentSession();
    txD = session.beginTransaction();
    session.save(dataStore);
    try {
        txD.commit();
    } catch (ConstraintViolationException e) {
        e.printStackTrace();
        throw new DidNotSaveRequestSomeRandomError(dataStore, feedbackManager);
    } catch (TransactionException e) {
        log.debug("txD state isActive" + txD.isActive() + " txD is participating" + txD.isParticipating());
        log.debug(e);
    } finally {
        // session.flush();
        txD = null;
        session.close();
    }
    // mySession.clear();
}

Ответы [ 2 ]

2 голосов
/ 16 января 2012

Спасибо за подсказку.Мне потребовалось некоторое время для отладки.Логи Mysql удивительны.Это то, что я запускаю, чтобы проверить отметку времени на моих вставках и записи в MySQL.mysql записывает все операции базы данных в binlog.Чтобы прочитать его, нам нужно использовать инструмент под названием mysqlbinlog.my.cnf тоже должен иметь значение http://publib.boulder.ibm.com/infocenter/tpfhelp/current/index.jsp?topic=%2Fcom.ibm.ztpf-ztpfdf.doc_put.cur%2Fgtpm7%2Fm7enablelogs.html

. Я проверяю, какой из файлов журнала mysql является последним, и запускаю его для grep на 1 строку над журналом, чтобы получить метку времени.Затем в Java я вызываю Calendar.getInstance (). GetTimeInMilli () для сравнения с отметкой времени.sudo mysqlbinlog mysql / mysql-bin.000004 |grep "mystring" -1

Итак, я отладил свою проблему.Это была проблема с отложенной записью.Таким образом, я реализовал запись синхронизации тоже вместо всех асинхронных.Другими словами, вызов сервера не вернется, пока для этого объекта не будет сброшена база данных.

2 голосов
/ 13 января 2012

@ Siddharth Hibernate на самом деле не откладывает написание ответа, и ваш код также не говорит то же самое. Я также сталкивался с подобной проблемой ранее, и сомневаюсь, что вы можете столкнуться с той же проблемой, то есть, когда существует множество запросов на запись в hibernate, если многие потоки совместно используют один и тот же экземпляр вашей БД, и даже при наличии последовательных коммитов в hibernate вы действительно не видите никаких изменений , Вы также можете поймать это, просто посмотрев журналы MySQL во время транзакции и посмотреть, что именно пошло не так!

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