大家好,我的程序需要不停的解析一个目录下的文件,然后把解析的内容组织成SQL语句,用jdbc的方式插入到MySQL数据库中,由于该目录下的文件不停的在生成,每个文件也很大,这就造成了每秒钟都会执行很多INSERT和SELECT(insert前可能需要select一下)最终导致整个server的cpu利用率一直处在99.9%,,请问有出率过类似问题的朋友么,有什么好的解决方案??

解决方案 »

  1.   

    主要是mysqld的cpu占用了99.9%
      

  2.   

    查找占用CPU高的SQL语句,如果是在select情况下的,那检查下有没有建立索引
      

  3.   

    可以用一条 INSERT 语句插入多条记录(比如上百条),能提高一些效率。不过,最烦的还是“INSERT 前可能需要 SELECT 一下”这种情况。这得根据你的应用背景考虑优化。
      

  4.   

    1、sql语句能否优化一下
    2、是否加索引
    3、select和年insert的时间间隔能否再延长点
      

  5.   

    1、sql语句能否优化一下 
    2、是否加索引 
    3、select和年insert的时间间隔能否再延长点
    4.采用缓存机制吧,不要直接操作数据库,先把数据放入缓存,再有缓存入库,这样会好些
      

  6.   

    楼上几位所说的缓存,到底用到哪些东西呢?我目前用的是jdbc,怎么加缓存??
      

  7.   

    索引是双刃剑,对 SELECT 有好处,对 INSERT 的影响是负面的。对于你现在面临的情形,加索引不一定有用,还可能有害。我觉得,还是要重点考虑两个问题:1. 批量插入
    2. 慎用 SELECT
      

  8.   

    是的1: 如何使用cache机制,用什么框架吗?2:批量插入?有demo不
      

  9.   

    你要是可以快速接手的话,那我建议你去用hibernate操作啦,要比jdbc好呀,维护方便啦,可是如果你没有
    接手,而项目又急的话,那还是继续找一方面吧!
      

  10.   

    每秒钟都会执行很多INSERT和SELECT(insert前可能需要select一下) 这样CPU当然被占用完了修改读文件和存表的节奏(加长检查新文件的时间间隔,新信息只到一定的大小 才开始数据库操作)
    优化SQL的方式(INSERT前要SELECT 如果 只有你这个线程在 INSERT SELECT应该可以只使用一次)操作中间 增加 线程等待 
      

  11.   


    INSERT INTO test (id, name) VALUES(1, 'a'),(2, 'b'),(3, 'c')
      

  12.   

    1、sql语句能否优化一下  
    2、是否加索引  
    3、select和年insert的时间间隔能否再延长点 
    4.采用缓存机制吧,不要直接操作数据库,先把数据放入缓存,再有缓存入库,这样会好些
      

  13.   

    我考虑过用hibernate,问题是我用的是N个不同单独的进程,我称之为Spider,类似搜索引擎的蜘蛛,呵呵5-6个Spider同时启动,也就是5-6个进程,它们不是在一个进程中,我不清楚这样可不可以用Hibernate,我之前只是在一个进程中用Hibernate,对于多个进程同时操作一个库,会不会导致Hibernate同步有问题
      

  14.   

    感觉你的这个业务逻辑是否能优化一下
    insert之前的select是否能用其他方式取代
      

  15.   


    这个是第一个关键,我们是先讨论为什么要select?而且是可能要select需要一个已经存在的以前插入数据,不过既然不是每个数据都需要,所以不是
    还有什么可能呢?那只有防止重复了。 不过既然你的业务逻辑都不能保证是否重复,我想你的设计有问题。第二,批量insert的语句是
    pstmt=conn.preparedStatement("insert into test_table(......) values(....?)");  
    pstmt.setString(1,"aaa");  
    pstmt.addBatch();  
    pstmt.setString(1,"bbb");  
    pstmt.addBatch();  
    .....  
    pstmt.executeBatch();  
      

  16.   

    如果你觉得业务逻辑没有问题
    非要在insert之前加select的话
    那你应该分析一下是insert慢还是色了传统慢
    具体问题具体分析 不能一概而论
      

  17.   

    另外如果你Select的目是想避免具有相同内容的文件信息重复存入数据库,可以使用文件的MD5或SHA1码做主键。
      

  18.   

    select全部可能符合的记录然后循环
      

  19.   

    java里有批处理啊,addBatch。
    或者你在mysql里建个store procedure.参数是数组。
    批量的数据组成数组丢进procedure里,让它做好了。
      

  20.   

    谢谢楼上的几位:我首先加了索引,效果很明显,速度加快了不少。理论上加了索引,插入的速度会变慢,但是由于select所占的比例挺大的(30%)左右,我加了index,整体速度反而变快了。有些忙,还没来得及用addBatch();的方式,多谢各位了。
      

  21.   

    由于数据量比较大,有可能会考虑用MySQL 的cluster