导入大文件,至少上万行到十几万行数据,然后每行插入数据库(mysql),现在的程序瓶颈在于插入mysql的过程,并且当一个用户在导入文件时候,其他用户再导入将等待很长时间,直到前一个用户的任务做完为止改进的思路:1.讲每个文件的数据分成好几块,每块包含几百行数据,然后这个块作为一个消息存入到jms队列里2.jms在取消息的时候讲做一个判断,比如如果发现其他用户的消息数据,就同时处理新用户的数据,而不是像之前的只能等到前一个用户的数据全部导入后再下一个问题:应采用如何的策略和逻辑来实现这个需求?比如用户A正在导入1w行数据的时候,用户B也开始导入1w行,这时候用户C也开始导入1w行,然后系统同时开始处理A、B、C的数据,这样子的结果是,尽管和原来的逻辑相比用户A的速度慢了很多,但用户C的速度要快一点,因为不用等待A和B完成了他才能继续。。
解决方案 »
- 菜鸟求大神笼罩
- struts2.0标签迭代器的使用 请指教!急!急!
- javabean连接数据库?
- 使用SSH框架中遇到的问题,请教各位了
- 我要设计一个用户表,基本资料已经设计出来
- 我想请问一下各位大哥,我应该怎样学java?
- 看看是什么错误!昨天刚看soap和tomcat出现下面的错误!
- 请问在java中怎么读取ini文件。
- 问题1: JBoss怎样打印出cmp的findXxxx方法对应的ebj QL所执行的sql语句?
- 关于apache mina的messageRecieved的问题
- (iphone,android) VS J2EE 畅想?
- 自定义xml标签,eclipse如何 规则校验 并 提示错误
2个技术关键点
1) insert values (),(),() 这种insert你要注意使用,每个单独的insert 性能是很差的。
2)不要每个insert都提交,可以100个提交一次
正常思路的确是这样子,但现在其实要做到多用户支持比如用户A上有1个10万行数据,分成100块,正在做,用户B进来带了100行数据,用户B肯定不能等用户A的10万行全部做完才轮到他做。。如果单纯的把文件分块放到jms的队列里,对于多用户就需要等待的。。
你不是将这些数据插入到数据库的表中了吗?为什么A、B、C用户不去读取表中的数据呢?
不是A、B、C去读文件。。是A B C分别导入自己的文件,因为数据量大,所以如果按线性顺序的话,B要等A做完才导入。。C要等B做完。。如此类推
同步的话是request-respone模式,这样请求就会等待
异步的话是receive-send模式,请求不用等待
读文件这个过程是很快的。。慢的是插入数据库的操作现在多线程的就是插入数据库。。比如一个文件10万行,分成100块,每块也就是1000行数据,然后作为一个jms消息存到队列里,然后很多个监听器去拿这些消息插入数据库去问题我前面也说了,用户A传了一个20万的数据,分成100个jms消息,然后监听器去接收去插入数据库了,这个过程里用户B也传了一个100行的数据,因为数据量少只分成1个消息,但这时候监听器正在接收A的消息,所以要等A的100个全部才可以,这样子是不行的需要用户B的消息能和用户A的消息交错被监听器接收,这样子B就不用等很长时间了
如果是这样,你可以让监听器把消息都送到一个队列,用个线程池执行队列中的任务,这个队列是可以插队的,如果有B任务来了,可以把B任务插队。
还有一种就是用多个队列,线程池依次从多个队列中取任务执行,对个队列分别对应多个客户的消息,即A消息发送到A队列,B消息发送到B队列,C消息发送到C队列,用个计数器,线程池第一次从A取任务,第二次从B取任务,第三次从C取任务,如果取不到任务,则依次再取下一个队列的任务。
多个队列不现实,如果一个用户一个队列,那么上百个上千个用户就太多了。。问题也基本解决。。把用户A、B、C等的消息拿出来后按照round robin算法调度,每次只拿一个用户的消息,详见看这里 http://topic.csdn.net/u/20110621/12/7918440e-c718-4721-8df8-5c839c00d1c4.html感谢以上各位