java大并发数据保存方案
2017-01-06 15:12
246 查看
做了几年.net,如今终于要做java了。
需求:
线下终端会定时上传gps位置到服务端,服务端收到数据保存到mysql数据库,当线下终端过多时,问题出现了,首当其冲的是数据库连接池经常会崩溃,单个tomcat到100并发就会抛出异常。
解决思路:
原来是收到一条数据就保存一条数据,现在改为将收到的数据暂存到一个数据池,当满100条数据时再用saveBatch一次性保存,这样终端上传100次其实只建立了一次数据库连接,减轻数据库压力。如果只是这样还有一个不足,就是当数据池的数据一直都不满100条时,永远都不会保存到数据库,所以再加一个守护线程,每2分钟检查一次,如果数据池有数据,就全部保存到数据库。
守护线程代码
抛砖引玉
目前这个方案有点问题,就是并发过千时,cpu会达到100%,期待有更好的方案。
需求:
线下终端会定时上传gps位置到服务端,服务端收到数据保存到mysql数据库,当线下终端过多时,问题出现了,首当其冲的是数据库连接池经常会崩溃,单个tomcat到100并发就会抛出异常。
解决思路:
原来是收到一条数据就保存一条数据,现在改为将收到的数据暂存到一个数据池,当满100条数据时再用saveBatch一次性保存,这样终端上传100次其实只建立了一次数据库连接,减轻数据库压力。如果只是这样还有一个不足,就是当数据池的数据一直都不满100条时,永远都不会保存到数据库,所以再加一个守护线程,每2分钟检查一次,如果数据池有数据,就全部保存到数据库。
public class GpsTask implements Runnable{ private static final Logger log = Logger.getLogger(GpsTask.class.getName()); ClientGPSService gpsService; @Override public void run() { gpsService=ServiceLocator.getBean(ClientGPSService.class); while (true) { try { Thread.sleep(1000*60*2);//2分钟检查一次 List<ClientGPS> gpss= GpsPool.poll100(); GpsPool.queGps.clear(); if(gpss.size()>0){ try { gpsService.saveBatch(gpss.toArray(),gpss.size()); } catch (Exception e) { saveError(e); } } } catch (InterruptedException e) { saveError(e); }catch(Exception e){ saveError(e); } } } }
守护线程代码
抛砖引玉
目前这个方案有点问题,就是并发过千时,cpu会达到100%,期待有更好的方案。
相关文章推荐
- Java版SLG游戏开发入门[2]--数据的读取及保存
- Java版SLG游戏开发入门[2]--数据的读取及保存
- Python编程语言中调用Matlab绘制保存数据的方案
- java高并发-静态页面生成方案(3)
- java高并发-静态页面生成方案(1)
- DELPHI与Java Web读取TABLE数据最简捷的方案:TkbmMemTable+java数据Format器
- Java高并发:静态页面生成方案
- Spring+dwr在保存数据时报错ERROR [DefaultConverterManager][convertOutbound] No converter found for 'java.lang
- java 保存unsigned 数据方法
- Java高并发:静态页面生成方案
- Java 小例子:数据持久化(保存数据到文件)
- Java用JDBC保存读取二进制数据
- java基础--程序中数据的保存
- jsp页面导出用jxl方式导出数据到excel表格并下载保存(第二种直接用java类实现)
- java中将数据对象序列化后保存到数据库中,并反序列化取出显示
- Java版SLG游戏开发入门[2]--数据的读取及保存
- 海量文件或数据 导致高并发,高流量处理方案
- java 保存unsigned 数据方法
- java高并发-静态页面生成方案
- 在android中使用java 的preferences来保存数据