在Hibernate中提交WRIT BATCH NOWAIT

use*_*581 8 oracle hibernate

是否可以在Hibernate中执行COMMIT WRITE BATCH NOWAIT?

Pas*_*ent 2

我没有广泛搜索,但找不到任何证据表明您可以在 JDBC 驱动程序级别访问此功能。

COMMIT_WRITE如果这对您有意义,您可以选择在实例或会话级别指定参数。

为了以防万一,让我引用这篇博文(我粘贴内容以供参考,因为原始网站要么不可用,要么已失效,我不得不使用 Google 缓存):

在 JDBC 中使用“Commit Write Batch Nowait”

任何使用过 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为 COMMIT WRITE BATCH NOWAIT 将允许您查看所面临的问题(如果可以的话)以某种方式修复你当前的问题。

COMMIT_WRITE在会话级别进行更改。这并不像在系统范围内进行那样危险,但很难看到它对于人们关心的交易的现实世界系统是可行的。

准备并使用“BEGIN COMMIT WRITE BATCH NOWAIT; END”的 PL/SQL 块。这比前两个想法更安全,但仍然涉及网络往返。

使用异步提交将语句包装在匿名块中。 这是我们见过的最好的方法。您的代码将如下所示:

BEGIN

--

insert into generic_table

(a_col, another_col, yet_another_col)

values

(?,?,?);

--

COMMIT WRITE BATCH NOWAIT;

--

END;
Run Code Online (Sandbox Code Playgroud)