错误:Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL)..

 

使用Spring提供的Open Session In View而引起Write operations are not allowed in read-only mode (FlushMode.NEVER) 错误解决:

       在没有使用Spring提供的Open Session In View情况下,因需要在service(or Dao)层里把session关闭,所以lazy loading 为true的话,要在应用层内把关系集合都初始化,如 company.getEmployees(),否则Hibernate抛session already closed Exception;    Open Session In View提供了一种简便的方法,较好地解决了lazy loading问题.

它有两种配置方式OpenSessionInViewInterceptor和OpenSessionInViewFilter(具体参看SpringSide),功能相同,只是一个在web.xml配置,另一个在application.xml配置而已。

Open Session In View在request把session绑定到当前thread期间一直保持hibernate session在open状态,使session在request的整个期间都可以使用,如在View层里PO也可以lazy loading数据,如 ${ company.employees }。当View 层逻辑完成后,才会通过Filter的doFilter方法或Interceptor的postHandle方法自动关闭session。

 

解决方案:

《一》我实践过,这个filter写在最前面 保险

在 web.xml配置里添加
<filter>
   <filter-name>OpenSessionInViewFilter</filter-name>
   <filter-class>
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
   </filter-class>
   <init-param>
    <param-name>sessionFactoryBeanName</param-name>
    <param-value>sessionFactory</param-value>
   </init-param>
   <init-param>
            <param-name>singleSession</param-name>
            <param-value>true</param-value>           
        </init-param>
        <init-param>
        <param-name> flushMode </param-name>
   <param-value>AUTO </param-value>        
        </init-param>
</filter>
     。。。。


<filter-mapping>
   <filter-name>OpenSessionInViewFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

 

《二》

般这个错误是事务引起的,如果确定事务没有问题,还是有这个错,可以重写OpenSessionInViewFilter的2个方法

在myfaces的wiki里提供了OpenSessionInViewFilter的一个子类如下:
public class OpenSessionInViewFilter extends org.springframework.orm.hibernate3.support.OpenSessionInViewFilter {
      
        /**
         * we do a different flushmode than in the codebase
         * here
         */
        protected Session getSession(SessionFactory sessionFactory) throws DataAccessResourceFailureException {
                Session session = SessionFactoryUtils.getSession(sessionFactory, true);
                session.setFlushMode(FlushMode.COMMIT);
                return session;
        }
        /**
         * we do an explicit flush here just in case
         * we do not have an automated flush
         */
        protected void closeSession(Session session, SessionFactory factory) {
                session.flush();
                super.closeSession(session, factory);
        }
}


 

<think>好的,我现在要解决用户在GRUB加载环境中遇到的“sparse file not allowed错误。首先,我需要了解这个错误的具体原因和可能的解决方法。根据用户提供的引用[1],这个错误通常发生在GRUB引导加载程序尝试加载稀疏文件时,而当前环境可能不支持这种类型的文件。 首先,稀疏文件(sparse file)是一种在文件系统中优化存储空间的文件类型,它允许文件中的空白部分不被实际占用磁盘空间。常见的例子包括虚拟机磁盘镜像或某些数据库文件。然而,并非所有系统或工具都能正确处理这类文件,尤其是在引导加载阶段,GRUB可能无法加载稀疏文件,导致错误。 接下来,我需要考虑用户可能遇到的具体情况。用户提到的是在PXE引导过程中使用GRUB2和UEFI时出现错误,但当前的问题是关于“loadenv”时的稀疏文件问题。可能的情况是用户的环境文件(如grubenv)被保存为稀疏文件,而GRUB在加载时无法处理这种情况。 根据引用[1]中的信息,当GRUB找不到指定的内核或initramfs文件路径时,会报错。但这里的错误是关于稀疏文件不被允许,因此需要检查相关的环境文件是否以稀疏方式存储。解决这个问题的方法可能包括重建环境文件,确保其不是稀疏格式,或者更新GRUB版本以支持处理稀疏文件。 另外,可能需要检查文件系统是否正确挂载,以及GRUB配置文件中指向的文件路径是否正确无误。如果环境文件存储在网络位置,如TFTP服务器,还需要确认服务器是否支持传输非稀疏文件,或者是否有配置限制了文件类型。 可能的解决步骤包括: 1. 检查grubenv文件是否为稀疏文件,使用工具如`filefrag`或`du`与`ls`对比文件大小。 2. 如果是稀疏文件,将其转换为非稀疏格式,例如使用`cp --sparse=never`命令。 3. 确保GRUB和相关组件(如UEFI固件)的版本是最新的,以支持可能的稀疏文件处理。 4. 检查文件系统的配置,确保没有启用可能导致文件稀疏化的选项。 5. 在重建环境文件后,重新生成GRUB配置并更新引导加载程序。 还需要考虑用户的具体操作环境,例如使用的Linux发行版、GRUB版本、文件系统类型(如ext4、XFS等),以及是否涉及网络引导等。不同的环境可能需要不同的处理方式。例如,某些发行版的工具在生成grubenv时可能会默认创建稀疏文件,这时需要调整生成参数。 此外,查阅GRUB的官方文档和社区讨论可能会有帮助,确认是否有已知的问题或补丁。如果问题依然存在,可能需要提交错误报告或寻求进一步的社区支持。 总结起来,解决这个错误的关键在于识别并处理环境中的稀疏文件,确保GRUB能够正确加载所需的文件。通过检查和转换文件格式,更新软件版本,以及验证配置文件的正确性,应该能够解决这一问题。</think>要解决GRUB加载环境中出现的“sparse file not allowed错误,需针对稀疏文件的特性进行调整。以下是具体步骤: ### 错误原因 该错误表明GRUB在加载环境文件(如`grubenv`)时检测到文件为**稀疏文件**,但当前环境不支持此类格式[^1]。稀疏文件通过跳过空白数据段节省存储空间,但部分引导加载工具无法解析其结构。 --- ### 解决步骤 1. **检查文件是否为稀疏文件** 使用命令对比文件逻辑大小与实际占用空间: ```bash ls -l /boot/grub/grubenv # 查看逻辑大小 du -h /boot/grub/grubenv # 查看实际占用空间 ``` 若`ls`显示的大小显著大于`du`的结果,则为稀疏文件。 2. **转换稀疏文件为普通文件** 通过复制并禁用稀疏属性: ```bash cp --sparse=never /boot/grub/grubenv /boot/grub/grubenv.new mv /boot/grub/grubenv.new /boot/grub/grubenv ``` 3. **重建GRUB环境块** 部分系统通过`grub-editenv`工具生成环境文件,强制重建非稀疏格式: ```bash grub-editenv /boot/grub/grubenv create ``` 4. **更新GRUB配置** 重新生成配置文件并安装到目标设备: ```bash sudo update-grub sudo grub-install /dev/sdX # 替换为实际磁盘设备 ``` 5. **验证文件系统属性** 若文件位于网络存储(如TFTP服务器),需确保传输前文件已去稀疏化。可使用`fallocate`填充空白: ```bash fallocate -l 1M grubenv # 扩展文件并填充零 ``` --- ### 扩展建议 - **GRUB版本兼容性**:升级至最新GRUB版本(如2.06+),部分更新已优化稀疏文件处理逻辑。 - **文件系统检查**:若使用ZFS/Btrfs等高级文件系统,确认其稀疏文件处理机制是否与GRUB兼容。 - **内核参数调整**:在`grub.cfg`中尝试添加`grub_no_sparse`参数(视具体版本支持情况)。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值