美文网首页
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数据库怎么加快查询速度,优化查询效率,主要原则就是应尽量避免全表扫描,应该考虑在where及order...

  • MySQL优化

    MySQL优化 1. 避免使用 select * 你需要什么信息,就查询什么信息,查询的多了,查询的速度肯定就...

  • MySql Innodb存储引擎--文件和索引(转)

    MySql架构图 MySql文件类型 参数文件,启动时候需要的参数 日志文件,二进制文件(bin log),慢查询...

  • MySQL--2.1MySQL的六种日志文件

    大家好,我们来说一下MySQL的6中日志文件。 1.查询日志 查询日志主要记录mysql的select查询的,改配...

  • 41-MySQL的数据目录

    一、MySQL8的主要目录结构 1、查询与 MySQL 相关的目录 查询结果 2、数据库文件的存放路径 查询min...

  • MySQL 将查询结果导出到文件(续)

    书接上文,将查询结果导出到文件,遇到文件已存在的情况,怎么办?MySQL 又不能覆盖或者说替换掉原来的文件,在吃饭...

  • 高并发下的mysql问题

    高并发下的mysql问题 mysql 重复插入问题 业务需要先根据where条件查询,如有数据命中对其进行修改否则...

  • MySQL 分页查询优化和分析

    1. 先关闭mysql缓存,避免影响sql真实查询效果 query_cache_size 为缓存查询结果分配的内存...

  • 面试BAT前先搞定这些常问的MySQL面试题

    1、事物的并发?事物隔离级别,每个级别会引发什么问题?MySQL默认是哪个级别? 事物应该彼此完全隔离,以避免并发...

  • 63 MySQL实战性能优化-optimizer_trace

    1,mysql索引性能优化最佳实战 2, 使用索引查询如何避免回表查询 3,为什么查询有时候加了索引也会失效? 4...

网友评论

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

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