1. 运行时间:Java程序的运行时间取决于它的编译器,虚拟机和硬件环境。如果编译器和虚拟机的性能较低,则Java程序的运行时间也会受到影响。
2. 计算能力:Java的计算能力受到硬件环境的限制,如果硬件资源不足,则Java程序的计算能力也会受到影响。
3. 内存使用:Java程序的内存使用受到硬件环境的限制,如果硬件资源不足,则Java程序的内存使用也会受到影响。
4. 编程语言:Java程序的编程语言受到程序员的技术水平和编程经验的限制,如果程序员的技术水平和编程经验不足,则Java程序的编程语言也会受到影响。
文件读取:首先是一个文件上传,数据入库,10-200万条不等,这里主要考虑到一次性读取,JVM分配出来的栈内存不一定会够(个人对内存这一块还是处于一知半解的状态,所以比较谨慎,若诸位大神有好的认知,希望评论留下地址分享一下),是依行读取数据,设定一个批量值,当读取的数据达到一定量之后,执行批量入库操作,清空集合,再接着读取。//读取文件内容
while((s = br.readLine())!=null){
//判断是否达到单次处理量
if(num%leadingNum==0&&num!=0){
int a = stencDao.insertBatch(listBean)
if(a!=leadingNum){
flag = false
}
//清空集合
listBean.clear()
}
String value = s.trim()
//将读取到的内容放入集合中
if(!value.equals("")){
StencilCustomer bean = new StencilCustomer()
bean.setCustomerPhone(value)
bean.setLinkStencilId(id)
listBean.add(bean)
num ++
}
}
数据处理:这里的思路也是将数据小化然后处理,这里使用了多线程,设定单个线程处理量,然后开启多个线程处理,这里需要考虑你的服务器的承载能力,如果线程开得太多了,处理不过来,会出现蹦死的情况。例如200万数据,我开了20个线程,单个线程处理600条。
//建立一个线程池 ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
minTaskNumber, maxTaskNumber, 3L, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(minTaskNumber),
new ThreadPoolExecutor.DiscardOldestPolicy())
//当正在执行的线程数达到最大执行线程数的时候等待
boolean flag = true
while(flag){
Thread.sleep(1000)//休眠2ms查询一次
int c = threadPool.getActiveCount()//线程池中活动中的线程数量
if(c<maxTaskNumber){
flag = false
}
}
上面的代码是我对线程池的一个控制,控制服务器一直最大线程执行,Thread.sleep(1000)用while的时候,这个休眠最好不要去掉,去掉之后很影响执行效率
这是正常的,异步处理都是这有问题。特别是数据库开启事务的时候,上一个线程还没有提交的话,其他事务是看不到数据的。解决的办法就是要么采用同步的机制,在同一个线程中处理数据,自然就不会存在这种问题。如果一定要用异步的话,可以加入等待机制,就是判断数据是否入库,没有点话就等待一会儿,然后在判断,直到入库才进行后续的处理