COMMIT WRITE BATCH NOWAIT в Hibernate - PullRequest
       11

COMMIT WRITE BATCH NOWAIT в Hibernate

8 голосов
/ 06 октября 2010

Возможно ли выполнить COMMIT WRITE BATCH NOWAIT в Hibernate?

Ответы [ 2 ]

2 голосов
/ 07 октября 2010

Я не осуществлял расширенный поиск, но не смог найти никаких доказательств того, что вы можете получить доступ к этой функции на уровне драйвера JDBC.

И это оставляет вам возможность указать параметр COMMIT_WRITE на уровне экземпляра или сеанса, если это имеет смысл для вас.

На всякий случай позвольте мне процитировать это сообщение в блоге (я вставляю содержимое для справки, поскольку исходный сайт либо недоступен, либо мертв, и мне пришлось использовать Google Cache):

Использование "Commit Write Batch Nowait" из JDBC

Тот, кто использовал новый особенность асинхронной фиксации Oracle 10.2 будет знать, что это очень полезно для обработки транзакций системы, которые традиционно были бы связаны log_file_sync событиями ожидания.

COMMIT WRITE BATCH NOWAIT быстрее потому что он не ждет сообщения заверяя, что сделка безопасно в журнале повторов - вместо этого предполагает, что это сделает это. Это почти устраняет log_file_sync событий. Это также возможно подрывает весь цель совершения, но есть много ситуации, когда потеря конкретная транзакция (скажем, чтобы удалить завершенный сеанс) отлично выживаемый и гораздо более предпочтительный чем не в состоянии обслуживать входящие запросы, потому что все ваши соединения заняты log_file_sync ожидания события.

Проблема любого, кто использует Oracle JDBC Водитель в том, что ни 10.2, ни 11.1 драйверы имеют любые расширения, которые позволяют вам получить доступ к этой функции легко - в то время как Oracle имеет много специальные расширения для всех поддержка асинхронных операций коммит отсутствует.

Это означает, что вы можете:

Включить асинхронную фиксацию на уровне экземпляра, связавшись с COMMIT_WRITE init.ora параметр. Там действительно хороший шанс, что это будет уволить тебя, как и на протяжении вся система COMMIT будет асинхронный. Хотя мы думаем, что это безумный для производственных систем там времена, когда установка его на коробка разработки имеет смысл, как будто вы 80% привязки к файлу синхронизации COMMIT_WRITE НАПРАВИТЬ ЗАПИСЬ NOWAIT позволит вам увидеть, что проблемы, с которыми вы сталкиваетесь, если можете как-то исправьте свои текущие.

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

Подготовьте и используйте блок PL / SQL с надписью "НАЧАЛО ЗАПИСИ НА ПЕРВУЮ КОМИТУ; END ". Это безопаснее, чем первый две идеи, но все еще включает в себя сеть туда и обратно.

Оберните ваше утверждение в анонимный блок с асинхронной фиксацией. Это лучший подход, который мы видели. Ваш код будет выглядеть примерно так это:

BEGIN

--

insert into generic_table

(a_col, another_col, yet_another_col)

values

(?,?,?);

--

COMMIT WRITE BATCH NOWAIT;

--

END;
0 голосов
/ 03 марта 2011

Я искал способ сделать это, но не смог заставить его работать в тесте.Причиной моей задержки было то, что я ожидал неправильных результатов от своего теста.Я тестировал, вручную получая блокировку общей таблицы, чтобы имитировать добавление индекса, но в этом случае запрос insert получает блокировку, а не commit.Так что это на самом деле не решает проблему, которую я хотел решить.Я решил эту проблему, переместив эти вставки в фоновую очередь, чтобы они не задерживали основной веб-запрос.По сути, вы можете использовать метод Session.doWork(), чтобы получить доступ к собственному объекту Connection (или в более старых версиях Hibernate, метод Session.connection()).Я также переместил коммит SQL в интерфейс стратегии, чтобы мы могли запускать наши тесты на основе HSQLDB, которые не понимают специфический для Oracle SQL.дать это SQL, избегая необходимости непосредственно использовать Connection.Попробуйте и посмотрите, как это работает.

private NativeStrategy nativeStrategy = new OracleStrategy();

interface NativeStrategy {
    String commit();
}

public static final class OracleStrategy implements NativeStrategy {
    public String commit() {
        return "COMMIT WRITE BATCH NOWAIT";
    }
}

public void saveAsynchronously(MyItem item) {
    session.save(item);
    session.flush();

    // Try to issue an asynchronous commit where supported.
    session.doWork(new Work() {
        public void execute(Connection connection) throws SQLException {
            Statement commit = connection.createStatement();
            try {
                commit.execute( nativeStrategy.commit() );
            } finally {
                commit.close();
            }
        }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...