你如何在Erlang中刷新io缓冲区?
对于实例:
io:format("hello") 要么
io:format(user, "hello")
这篇文章似乎表明没有干净的解决方案.
有没有比那篇文章更好的解决方案?
我试图将NHibernate与未与NHibernate映射的遗留实体一起使用.有时这意味着我需要手动将NHibernate数据刷新到数据库,这样当我尝试将遗留实体与NHibernate映射实体连接时,我不会收到外键异常.
当这发生在需要回滚的事务中时会发生问题.从NHibernate刷新的数据不会回滚.
我能做些什么吗?
UPDATE
仍然很好奇如何做到这一点 - 我不相信给出的任何答案都解决了这个问题.我需要调用Flush().问题是,如何回滚已刷新的数据?
有没有得到需要的一些神奇的“zlib的同步刷新”使用时boost::iostreams::zlib_compressor?只需调用flush过滤器上,或strict_sync在filtering_ostream包含它没有看到做的工作(即我想压缩机冲刷足够的解压缩器可以恢复所有字节压缩机消耗到目前为止,没有关闭流)。
查看标头,似乎定义了一些“冲洗代码”(特别是a sync_flush),但我不清楚应如何使用它们(请注意,我的压缩器只是添加到了filtering_ostream)。
我发现自己一次又一次地遇到类似的问题:有一些代码处理来自用户/网络/某种类型的产品的数据.出于效率原因,我不想打电话flush()或打电话给commit()我收到的每一条数据,但只是偶尔打电话.
我通常会想出这样的代码:
class Processor {
private final static MAX_SAVE_PERIOD = 60000;
private final static MIN_SAVE_PERIOD = 20000;
private final static int MAX_BUFFER = 10000;
Arraylist<Data> dataBuffer = new Arraylist<Data>();
private long lastSave = 0;
public Saver() {
new Timer().schedule(new TimerTask() {
periodicSave();
}, MAX_SAVE_PERIOD, MAX_SAVE_PERIOD);
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
periodicSave();
}
}));
}
public synchronized void processData(Data data) {
dataBuffer.add(data);
if(dataBuffer.size() >= MAX_BUFFER) {
saveData();
}
}
private synchronzied void periodicSave() { …Run Code Online (Sandbox Code Playgroud) 这种行为背后的理由是什么?
如果由于某种原因我在事务之外执行两个合适的操作(不推荐,我知道!)并且我已经将Hibernate配置为自动刷新,如果第二个操作是应该触发自动的操作,我希望它会自动刷新-flush(如list,iterate或executeUpdate).
如果没有对autoFlushIfRequried方法的第二行进行显式检查,那正是会发生什么:
protected boolean autoFlushIfRequired(Set querySpaces) throws HibernateException {
errorIfClosed();
if ( ! isTransactionInProgress() ) {
// do not auto-flush while outside a transaction
return false;
}
AutoFlushEvent event = new AutoFlushEvent(querySpaces, this);
AutoFlushEventListener[] autoFlushEventListener = listeners.getAutoFlushEventListeners();
for ( int i = 0; i < autoFlushEventListener.length; i++ ) {
autoFlushEventListener[i].onAutoFlush(event);
}
return event.isFlushRequired();
}
Run Code Online (Sandbox Code Playgroud)
更新:感谢axtavt找到导致此更改的Hibernate问题(在3.2中):FlushMode.AUTO - >在事务外部时执行COMMIT.
一个相关的问题仍然存在:在FlushMode.MANUAL/NEVER的情况下延迟IDENTITY插入,但两个讨论都没有说明"当在事务外操作时,FlushMode.AUTO是一件坏事".
我理解背后的理论BufferedOutputStream.字节被写入缓冲区数组直到它已满,然后写入(刷新)到底层流 - 这个想法是它比逐字节写入更快,因为OS调用更少.
但是,通过查看BufferedOutputStream类和方法(BufferedOutputStream.java)的实现,似乎最终,缓冲区中的字节只是逐字节写入.
我认为情况是这样的,因为:
在BufferedOutputStream.write(byte b [],int off,int len)中,它有行out.write(b,off,len).由于out是OutputStream的实例,而不是BufferedOutputStream,因此它调用OutputStream.write(byte [],int,int).这又使用for循环逐字节写入
请有人澄清实际发生了什么,以及它如何更快?
我正在寻找一个"技巧"或"黑客"来确定文件是否已经保存在远程磁盘上,通过vmware缓存,NAS缓存等.
刷新和关闭FileOutputStream是不够的.我认为Channel.force(true)既不是.
我正在考虑这样的事情:
也许有人有同样的问题,并找到了解决方案.
我的要求是不要丢失数据.java应用程序以这种方式工作:
今晚我们遇到了崩溃,并且在第5步之后但是在将数据实际刷新到远程存储之前有三次交易失败.所以数据库说一切都很好,远程端被告知相同,但15秒的签名数据丢失了.这不好.
正确的解决方案可能是对远程文件系统进行"同步安装".但这不会在短时间内发生.即使在这种情况下,鉴于应用程序在VMWare服务器上运行,我也不完全信任这种情况.
因此,我希望有一个"尽力而为"的黑客来防止(缓解)像这样的事件.
我在一个小文件(3-4 MB)上执行一个map任务,但是map输出相对较大(150 MB).显示地图100%后,需要很长时间才能完成泄漏.请建议我如何缩短这段时间.以下是一些示例日志......
13/07/10 17:45:31 INFO mapred.MapTask: Starting flush of map output
13/07/10 17:45:32 INFO mapred.JobClient: map 98% reduce 0%
13/07/10 17:45:34 INFO mapred.LocalJobRunner:
13/07/10 17:45:35 INFO mapred.JobClient: map 100% reduce 0%
13/07/10 17:45:37 INFO mapred.LocalJobRunner:
13/07/10 17:45:40 INFO mapred.LocalJobRunner:
13/07/10 17:45:43 INFO mapred.LocalJobRunner:
13/07/10 17:45:46 INFO mapred.LocalJobRunner:
13/07/10 17:45:49 INFO mapred.LocalJobRunner:
13/07/10 17:45:52 INFO mapred.LocalJobRunner:
13/07/10 17:45:55 INFO mapred.LocalJobRunner:
13/07/10 17:45:58 INFO mapred.LocalJobRunner:
13/07/10 17:46:01 INFO mapred.LocalJobRunner:
13/07/10 17:46:04 INFO mapred.LocalJobRunner:
13/07/10 17:46:07 INFO mapred.LocalJobRunner:
13/07/10 17:46:10 INFO mapred.LocalJobRunner: …Run Code Online (Sandbox Code Playgroud) 我有一个Spring MVC Web应用程序,它使用freemarker作为模板语言.我目前正在进行更改以刷新html头部分而不是缓冲整个html并在最后进行刷新.我尝试将auto_flush freemarker设置为false并使用freemarker的内置<#flush>指令,如下所示,但这似乎不起作用.
common-header.ftl
<head>
.......
</head>
<#flush>
page.ftl
<#include "common-header.ftl" />
<body>
.......
</body>
Run Code Online (Sandbox Code Playgroud)
我很感激你的帮助.此外,根据API文档,autoFlush()似乎仅适用于不是由#include语句组成并需要多个Template.process()方法的页面.如果这是正确的,我应该编写一个自定义模板处理器来处理页面中的头部和身体部分吗?任何指针都会有所帮助.
更新:
尝试使用FreeMarkerView.java作为视图类,因为它使用HttpServletResponse的默认编写器(PrinterWriter)来处理编写器.虽然PrinterWriter支持flush()并且我的模板中的<#flush> freemarker指令似乎没有调用它,但这不起作用.
尝试扩展FreeMarkerView类以将PrinterWriter包装在BufferedWriter中,但这也不起作用.
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="suffix"><value>.ftl</value></property>
<property name="contentType"><value>text/html; charset=utf-8</value></property>
<property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
<property name="exposeSpringMacroHelpers"><value>true</value></property>
</bean>
Run Code Online (Sandbox Code Playgroud)
我很感激任何帮助.
我正在开发一个JPA应用程序(使用hibernate),我正在使用AutoFlush功能.
默认情况下,每当我们处理任何实体的查询时,都会刷新完整的EntityManager.在大多数情况下这是可以的:我们希望JPA处理针对最新数据库的查询.
但是,我们还在DB中存储了一些功能参数.这与我们的核心业务模型完全分离,我们不希望选择我们刷新EM的参数:参数的获取可能在过程中发生得非常深,当我们知道它时我们就失去了冲洗EM的控制;好的.
实际上,这会导致一些DB约束异常:数据模型尚未一致(在进程的中间),并且选择参数会强制刷新此数据模型.
我正在考虑添加第二个entityManager,只是参数,但我发现它有点矫枉过正.
可以更轻松地解决吗?使用参数DAO上的隔离级别,以便在单独的事务中处理参数?
flush ×10
java ×3
transactions ×3
buffer ×2
hibernate ×2
boost ×1
c++ ×1
erlang ×1
freemarker ×1
hadoop ×1
html ×1
input ×1
jpa ×1
map ×1
nas ×1
nhibernate ×1
spring-mvc ×1
vmware ×1
zlib ×1