美文网首页
mysql并发查询怎么避免文件指针混乱?

mysql并发查询怎么避免文件指针混乱?

作者: 屎倒淋头还嚼便 | 来源:发表于2024-02-01 15:46 被阅读0次

    应该是一个文件流对应一个文件指针,不是一个文件一个指针。指针属于文件流。
    一个线程对应一个文件流不会读错,
    多个线程对应一个文件流就会读错,多个线程共用一个文件指针会出错

    mysql应该是一个连接对应一个线程,同一个连接中多个查询语句应该只能同步运行。

    // RandomAccessFile详解,出自:
    https://blog.csdn.net/qq_40100414/article/details/120179117

    测试1:每一个线程new一个RandomAccessFile对象,文件指针没有出错

    public class Raf {
        static int count = 0;
        public static void main(String[] args) throws IOException, InterruptedException {
            File file = new File("C:\\Users\\lz\\Desktop\\rwd.txt");
            while(true) {
                new Thread(()->{ t(0,file); }).start(); 
                new Thread(()->{ t(1,file); }).start(); 
                new Thread(()->{ t(2,file); }).start(); 
                new Thread(()->{ t(3,file); }).start(); 
                new Thread(()->{ t(4,file); }).start(); 
                new Thread(()->{ t(5,file); }).start(); 
                new Thread(()->{ t(6,file); }).start(); 
                new Thread(()->{ t(7,file); }).start(); 
                new Thread(()->{ t(8,file); }).start(); 
                Thread.sleep(10);
            }
        }
        public static void t(int pointer,File file) {
            // 文件内容(文件指针设置为0,readByte()结果为文件第一个字符1,以此类推):123456789abcdefg
            try {
                RandomAccessFile raf = new RandomAccessFile(file, "rws");
                raf.seek(pointer); // 定位文件指针
                byte byte1;
                byte1 = raf.readByte(); // 读取指针后面的一个字节
                byte[] bs = new byte[1];
                bs[0] = byte1;
                pointer++;
    //          System.out.println(pointer+":"+new String(bs));
                if(pointer != Integer.parseInt(new String(bs))) { // 如果不相等就表明出现了指针错误
                    System.exit(0); // 实测没有出错
                }
                count++;
                if(count%100 == 0) {
                    System.out.println("计数:"+count);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    测试2:多个线程公用一个RandomAccessFile对象,文件指针混乱出错

    public class Raf {
        static int count = 0;
        static int cuowu = 0;
        public static void main(String[] args) throws IOException, InterruptedException {
            File file = new File("C:\\Users\\lz\\Desktop\\rwd.txt");
            RandomAccessFile raf = new RandomAccessFile(file, "rws");
            while(true) {
                new Thread(()->{ t(0,raf); }).start(); 
                new Thread(()->{ t(1,raf); }).start(); 
                new Thread(()->{ t(2,raf); }).start(); 
                new Thread(()->{ t(3,raf); }).start(); 
                new Thread(()->{ t(4,raf); }).start(); 
                new Thread(()->{ t(5,raf); }).start(); 
                new Thread(()->{ t(6,raf); }).start(); 
                new Thread(()->{ t(7,raf); }).start(); 
                new Thread(()->{ t(8,raf); }).start(); 
                Thread.sleep(1000);
            }
        }
        public static void t(int pointer,RandomAccessFile raf) {
            // 文件内容(文件指针设置为0,readByte()结果为文件第一个字符1,以此类推):123456789abcdefg
            try {
                raf.seek(pointer); // 定位文件指针
                byte byte1;
                byte1 = raf.readByte(); // 读取指针后面的一个字节
                byte[] bs = new byte[1];
                bs[0] = byte1;
                pointer++;
    //          System.out.println(pointer+":"+new String(bs));
                if(pointer != Integer.parseInt(new String(bs))) { // 如果不相等就表明出现了指针错误
                    cuowu++;
                    System.out.println("cuowu:"+cuowu); // 实测会出错
                    //System.exit(0);
                }
                count++;
                if(count%100 == 0) {
                    System.out.println("计数:"+count);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:mysql并发查询怎么避免文件指针混乱?

          本文链接:https://www.haomeiwen.com/subject/yqlzodtx.html