`

磁盘I/O也能够让程序不正确

阅读更多
       HSQLDB数据库执行SHUTDOWN命令,如果系统磁盘I/O性能不是很好的话,也能够造成程序的错误。
      
       该BUG是因为HSQLDB 数据库执行ShutDown命令之后,由于客户端正在运行BT, Emule这样的程序,使得客户端的磁盘一直都处于I/O状态。因此,在程序调用shutdown命令之后,文件系统并没有在非常短的时间内完成文件操作。

       因此,在程序执行到后面,需要对已经生成的文件进行访问的时候,出现了错误。而出现的错误也是比较怪异。一会儿出现文件不存在;一会儿又出现有其他的进程正在对文件进行访问;一会儿还出现客户端无法加载CLASSES;有些时候又可以正常了。

       通过分析,我断定是因为程序在调用shutdown的时候,文件系统执行shutdown较慢的缘故。
        出现文件不存在,是说:在程序执行的哪一点,hsqldb还没有执行完shutdown命令,也就是说在文件系统中还根本没有这个文件;
        有其他的进程正在访问,也就是说,程序在执行的哪一点,还有HSQLDB的Connection还连接在数据库上,可见数据库要执行shutdown命令还是相当耗时的;
        另外,客户端无法加载Classes,因为我们的applet需要访问的classes都是通过jar文件传输过去的,出现这个问题,明显是由于系统I/O比较异常,系统无法在要求的时间加载到APPLET所需要的JAR包。
      
       可见,程序确实还不是很Strong。我以前还从来没有遇到这个问题。

        判定到这个问题之后,我肯定这个错误在于客户端的磁盘I/O系统。因此,我调查了一些客户端测试的环境。原来,客户端的机器一直都在使用emule和bt软件,这两个软件对系统磁盘I/O的性能影响还是比较大。将客户端的bt和emule关掉之后,发现程序正常:)

       可见,磁盘的I/O也能够让程序运行不正确,不要以为调用了statment.execute("shutdown"); 文件系统中立马就会有hsqldb的.script文件了:)这个是不成立的。另外,我们在调用statment.execute("shutdown")之后,系统并不会等到文件操作完成,该语句才返回。从这个道理来讲,程序和文件系统不是同步的,而是消息的。程序给文件系统发送命令,文件系统响应,返回。但是,文件真正存储到磁盘中,可不是程序可以预知的。

       为了增强程序的健壮性,只好在程序执行的下一点,先Thread.sleep(1000),然后去判断文件是否存在。如果文件不存在,那么报错。

       但是,有多少机会,文件I/O操作是在1s之内完成的呢?只要客户端系统不使用耗I/O的程序,应该都是没有问题的。如果使用了,那多半还是会有问题。不过,sleep 1s也就算了。
分享到:
评论
8 楼 歆渊 2007-04-15  
hiwzg 写道
不是很清楚你说的嵌入模式是什么,看了SCRIPT的说明,不知道是否会,感觉也不太会等待执行完了才返回。




歆渊 写道
不知道用嵌入模式运行, 不用SHUTDOWN, 而是用 SCRIPT TO 如何. 感觉SCRIPT TO 也许会等执行完了再返回.


好像是叫 In-Memory 模式还是什么来的, 就是运行时不写任何磁盘文件, 进程关闭数据就没了那种.
这样就在原本 SHUTDOWN 的地方 SCRIPT 一下, 下次启动的时候再从保存的文件恢复. 不过我也没这么做过, 只是一个想法.
7 楼 hiwzg 2007-04-14  
不是很清楚你说的嵌入模式是什么,看了SCRIPT的说明,不知道是否会,感觉也不太会等待执行完了才返回。




歆渊 写道
不知道用嵌入模式运行, 不用SHUTDOWN, 而是用 SCRIPT TO 如何. 感觉SCRIPT TO 也许会等执行完了再返回.
6 楼 歆渊 2007-04-13  
不知道用嵌入模式运行, 不用SHUTDOWN, 而是用 SCRIPT TO 如何. 感觉SCRIPT TO 也许会等执行完了再返回.
5 楼 hiwzg 2007-04-13  
我也正愁苦呢,没有很好的解决方案。我上面的给出的方法只是简单的再等一段时间,万一在这段时间内不完成的话,还是会出现错误。

有没有更好的解决方案?

rainlife 写道
我也奇怪呢,如果是有时间范围,报异常的话,那也应该是SQLException。 看来应该是I/O一直占用着,造成了一些不确定错误。
4 楼 rainlife 2007-04-13  
我也奇怪呢,如果是有时间范围,报异常的话,那也应该是SQLException。 看来应该是I/O一直占用着,造成了一些不确定错误。
3 楼 Godlikeme 2007-04-13  
写I/O 相关 处理等待、超时这种问题比较多。
2 楼 hiwzg 2007-04-13  
这个命令没有时间片吧。不报异常。如果数据库执行命令,肯定会报SQLException。
这里的问题是数据库执行了shutdown命令,但真正shutdown完却发了很长时间。程序不会等到文件系统把文件I/O操作完才返回。

rainlife 写道
引用
该BUG是因为HSQLDB 数据库执行ShutDown命令之后,由于客户端正在运行BT, Emule这样的程序,使得客户端的磁盘一直都处于I/O状态。因此,在程序调用shutdown命令之后,文件系统并没有在非常短的时间内完成文件操作。

这个命令有一个时间片,如果超出这个时间的话,就报异常?
1 楼 rainlife 2007-04-13  
引用
该BUG是因为HSQLDB 数据库执行ShutDown命令之后,由于客户端正在运行BT, Emule这样的程序,使得客户端的磁盘一直都处于I/O状态。因此,在程序调用shutdown命令之后,文件系统并没有在非常短的时间内完成文件操作。

这个命令有一个时间片,如果超出这个时间的话,就报异常?

相关推荐

    单片机课件 I/O口的扩展部分

    ### 单片机I/O接口的扩展及其应用 #### 一、I/O接口技术概述 在单片机系统中,I/O接口起着至关重要的作用,它负责协调单片机与外部设备之间的数据交换。本章节将详细介绍I/O接口的必要性、基本电路以及I/O数据的几...

    linux 文件I/O编程

    在Linux系统中,文件I/O(输入/输出)编程是操作系统与应用程序交互的重要部分,它涉及到数据在程序和磁盘之间的传输。以下是对标题和描述中提到的知识点的详细解释: 1. **open()**: `open`函数是用于打开一个文件...

    Performing I/O-Bound Asynchronous Operations

    在现代软件开发中,特别是在构建响应迅速且可扩展的应用程序时,理解并正确实施I/O密集型异步操作至关重要。这种技术不仅可以显著提高应用程序的性能,还可以确保用户体验更加流畅。本文将基于Jeffrey Richter的分享...

    模拟磁盘调度算法操作系统课程设计

    磁盘调度算法是操作系统中的一种算法,用于管理磁盘I/O操作,以提高磁盘的读写效率。本设计主要介绍了磁盘调度算法的基本概念、设计思想、数据结构、模块调用关系图、子模块程序流程图等内容。 需求分析 在操作...

    I/O常见的有关移动硬盘的问题

    如果驱动程序过时、损坏或未正确安装,可能会出现I/O错误。确保驱动程序是最新的,并且与移动硬盘型号兼容至关重要。 5. **USB连接问题**:移动硬盘通常通过USB接口连接到计算机。USB线材损坏、接口松动、USB端口...

    AIX 5L 磁盘性能优化

    磁盘I/O性能优化不仅涉及硬件配置,还包括软件层面的策略调整。本系列教程由Ken Milberg提供,旨在深入探讨AIX 5L中的磁盘性能优化,特别是针对直接I/O、并发I/O和异步I/O的最佳实践。 首先,了解磁盘I/O的基本概念...

    计算机组原理 实验报告 并行接口电路I O实验

    实验报告的主题围绕着“计算机组原理”,具体是关于...总的来说,这个实验让学习者能够实际操作并行接口电路,理解I/O系统的结构和操作,以及中断处理和通道控制在数据传输中的作用,从而加深对计算机组原理的理解。

    linux direct io 技术应用

    Linux Direct I/O(直接I/O)技术是一种优化数据读写性能的方法,特别是在处理大数据和存储系统时非常有用。它允许应用程序绕过操作系统内核的...正确理解和配置Direct I/O,可以为特定的应用场景带来显著的性能提升。

    《数据存储 文件I/O》后续资料包.zip

    在IT行业中,数据存储和文件I/O(Input/Output)是至...此外,数据采集的相关知识也能够提升用户在大数据处理和数据分析领域的技能。通过深入学习这些内容,IT专业人士可以更好地设计和实现高效、可靠的数据处理系统。

    test_V1.0_RW_物理磁盘读写_

    5. **缓冲区管理**:在读写操作中,使用缓冲区可以减少对物理磁盘的直接访问,从而降低磁盘I/O次数,提高效率。缓冲区还可以帮助合并小I/O请求,使其更高效。 6. **I/O调度算法**:操作系统采用I/O调度算法来决定...

    虚拟磁盘万能本地回写程序

    2. **并发处理**:在多虚拟机环境中,程序需要处理多个并发的I/O请求,确保数据的一致性和正确性。 3. **错误恢复**:当网络中断或服务器故障时,程序需要有能力恢复未完成的写操作,保证数据完整性。 4. **性能监控...

    Visual C++中对象的序列化与文件I/O研究

    在Visual C++中,对象的序列化与文件I/O是程序持久性和数据记录的重要技术。对象序列化的目的是保存和加载对象的状态数据,使得程序能够在终止后再恢复到之前的状态。这一过程在MFC(Microsoft Foundation Classes)...

    Java文件输入输出(I/O)流.pdf

    Java I/O系统是基于流(Stream)的概念构建的,流可以被视为数据的有序序列,既可以是从内存到硬盘的写入,也可以是从硬盘到内存的读取。在Java中,文件被看作是字节流,这意味着文件中的数据以字节为单位进行传输。...

    android direct IO.rar

    在Android系统中,直接I/O(Direct IO)是一种优化数据传输效率的技术,它允许应用程序绕过操作系统的缓冲区,直接与磁盘设备进行交互。这种技术对于需要高性能、低延迟的场景,如数据库、文件系统或者媒体处理等,...

    io请求包IRP微软内部文档(中英文双版)

    **IO请求包(I/O Request Packet,IRP)**是Windows操作系统内核中用于设备驱动程序之间通信的重要机制。在Windows驱动程序开发中,IRP是处理I/O操作的核心组件,它承载了从用户模式到内核模式的请求信息。IRP不仅...

    磁盘过滤驱动完整工程

    磁盘过滤驱动是一种在操作系统与硬件之间插入的软件层,用于拦截、修改或增强磁盘I/O请求。这种驱动程序通常被用在数据安全、数据保护、存储虚拟化以及性能优化等场景。在这个名为"VolumeFilter"的压缩包中,我们...

    ioapi-3.2-master.tar.gz

    - 缓冲I/O:系统通过缓冲区对I/O操作进行优化,减少磁盘I/O次数,提高效率。ioapi支持缓冲I/O,通过缓冲层来提高性能。 - 直接I/O:绕过内核缓冲区,直接将数据从用户空间传输到硬件,适用于需要最小化数据复制和...

    windows虚拟磁盘c++代码

    总之,“windows虚拟磁盘c++代码”项目涉及到多个复杂的知识点,包括虚拟磁盘技术、C++编程、驱动程序开发以及操作系统I/O机制。理解并掌握这些概念对于实现这样的功能至关重要。通过使用WDK,开发者可以创建出高效...

    案例22磁盘文件的读写.rar_案例磁盘文_磁盘读_读写磁盘

    缓存可以显著提高性能,减少磁盘I/O次数,但同时也增加了数据一致性管理的复杂性。 总的来说,磁盘文件的读写是计算机系统中的基础操作,理解其工作原理和最佳实践对于优化程序性能和确保数据安全至关重要。在实际...

Global site tag (gtag.js) - Google Analytics