首页
JAVA笔记
数据库笔记
混乱记忆
小站记
您现在的位置
网站静态化之--文件锁
简介: 在采用nginx反向代理,定时静态化架构设计中,多线程程序设计中,针对文件操作锁问题。

        今天在研究网站静态化时忽然想到定时静态化策略下可能会出现瞬间文件内容变化问题。

这个问题可能出现在高并发环境中。

 举例说:在高并发请求情况下,如果定时静态化可能出现静态化文件写到一半时就被客户端读取到了。导致客户端显示问题。

        通过研究发现可能可以通过在静态化操作时给静态化页面加锁来解决这个问题,经过测试确定对文件加锁后,其他java进程或者java线程都不能再继续对该文件进行读写操作,读取被锁文件的程序会出现异常,但是非java程序还是可以进行读操作(也就是说文件锁不能解决我们的页面静态化到一半时就被读取的问题)。

目前采取的策略是一次性写入的方法来写静态化文件也可以大大降低发生概率。

测试代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;


public class Main {

 /**
  * @param args
  */
  /**
   * @param args
   */
  public static void main(String[] args) {
 
   File file = new File("c://aa.txt");
   ByteBuffer buf = ByteBuffer.wrap("0987654321".getBytes());
     try {
      FileOutputStream output = new FileOutputStream(file);

      FileChannel channel = output.getChannel();
      FileLock fl = channel.lock();
      channel.write(buf);
      try {
       Thread.sleep(20000);
      } catch (InterruptedException e) {
       e.printStackTrace();
      }
      fl.release();
      channel.close();
     } catch (FileNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
  
  }
}
因为对nginx不熟悉所以大家有好的解决方啊请告诉我:admin@xiaoyunduo.org

 

最近更新