首页 网站首页 商业信息 方案 查看内容

面试官:百万数据的导入导出解决方案,怎么设计?

运营营销 2023-3-11 21:29 6629人围观 方案

远景

在项目开辟中常常需要利用到数据的导入和导出,导入就是从Excel中导入到DB中,而导出就是从DB中查询数据然后利用POI写到Excel上。


写本文的布景是由于在工作中碰到了大数据的导入和导出,题目既然来了逃窜不如干掉它!!!


只要这一次处理了,前期碰到一样的题目就好处理了。


空话不多说,起头撸起来!!!


1. 传统POI的版本优弱点

实在想到数据的导入导出,理所固然的会想到apache的poi技术,以及Excel的版本题目。

既然要做导入导出,那末我们就先来大致看一下传统poi技术的版本以及优弱点对照吧!

首先我们晓得POI中我们最熟悉的莫过于WorkBook这样一个接口,我们的POI版本也在更新的同时对这个几口的实现类做了更新:

  • HSSFWorkbook:

这个实现类是我们早期利用最多的工具,它可以操纵Excel2003之前(包括2003)的一切Excel版本。在2003之前Excel的版本后缀还是.xls

  • XSSFWorkbook:

这个实现类现在在很多公司都可以发现还在利用,它是操纵的Excel2003--Excel2007之间的版本,Excel的扩大名是.xlsx

  • SXSSFWorkbook:

这个实现类是POI3.8以后的版本才有的,它可以操纵Excel2007今后的一切版本Excel,扩大名是.xlsx

大致晓得了我们在导入导出操纵的时辰会用到这样三个实现类以及他们可以操纵的Excel版本和后缀以后,我们就要从优弱点分析他们了。

HSSFWorkbook

它是POI版本中最常用的方式,不外:

  • 它的弱点是 最多只能导出 65535行,也就是导出的数据函数跨越这个数据就会报错;

  • 它的优点是 不会报内存溢出。(由于数据量还不到7w所之内存一般都够用,首先你得明白晓得这类方式是将数据先读取到内存中,然后再操纵)

XSSFWorkbook

  • 优点:这类形式的出现是为了冲破HSSFWorkbook的65535行范围,是为了针对Excel2007版本的1048576行,16384列,最多可以导出104w条数据;

  • 弱点:陪伴的题目来了,虽然导出数据行数增加了好多倍,可是随之而来的内存溢出题目也成了噩梦。由于你所建立的book,Sheet,row,cell等在写入到Excel之前,都是寄存在内存中的(这还没有算Excel的一些款式格式等等),不可思议,内存不溢出就有点不科学了!!!

SXSSFWorkbook

从POI 3.8版本起头,供给了一种基于XSSF的低内存占用的SXSSF方式:

优点:

  • 这类方式不会一般不会出现内存溢出(它利用了硬盘来调换内存空间,

  • 也就是当内存中数据到达一定水平这些数据会被持久化到硬盘中存储起来,而内存中存的都是最新的数据),

  • 而且支持大型Excel文件的建立(存储百万条数据绰绰不足)。

弱点:

  • 既然一部分数据持久化到了硬盘中,且不能被检察和拜候那末就会致使,

  • 在同一时候点我们只能拜候一定数目的数据,也就是内存中存储的数据;

  • sheet.clone()方式将不再支持,还是由于持久化的缘由;

  • 不再支持对公式的求值,还是由于持久化的缘由,在硬盘中的数据没法读取到内存中停止计较;

  • 在利用模板方式下载数据的时辰,不能修改表头,还是由于持久化的题目,写到了硬盘里就不能改变了;

2. 利用方式

经过领会也晓得了这三种Workbook的优点和弱点,那末具体利用哪类方式还是需要看情况的:

我一般会按照这样几种情况做分析挑选:

1、当我们经常导入导出的数据不跨越7w的情况下,可以利用 HSSFWorkbook 大概 XSSFWorkbook都行;

2、当数据量查过7w而且导出的Excel中不牵扯对Excel的款式,公式,格式等操纵的情况下,保举利用SXSSFWorkbook;

3、当数据量查过7w,而且我们需要操做Excel中的表头,款式,公式等,这时辰我们可以利用 XSSFWorkbook 配合停止分批查询,分批写入Excel的方式来做;

3. 百万数据导入导出(正菜)

铺垫也做了很多,那末现在起头讲讲我在工作中碰到的超百万数据的导入导出处理计划

想要处理题目我们首先要大白自己碰到的题目是什么?

1、 我碰到的数据量超级大,利用传统的POI方式来完成导入导出很明显会内存溢出,而且效力会很是低;

2、 数据量大间接利用select * from tableName必定不可,一会儿查出来300w条数据必定会很慢;

3、 300w 数据导出到Excel时必定不能都写在一个Sheet中,这样效力会很是低;估量翻开都得几分钟;

4、 300w数据导出到Excel中必定不能一行一行的导出到Excel中。频仍IO操纵绝对不可;

5、 导入时300万数据存储到DB假如循环一条条插入也必定不可;

6、导入时300w数据假如利用Mybatis的批量插入必定不可,由于Mybatis的批量插入实在就是SQL的循环;一样很慢。

处理思绪:

针对1 :

实在题目地点就是内存溢出,我们只要利用对上面先容的POI方式即可,首要题目就是原生的POI处理起来相当麻烦。

经过查阅材料翻看到阿里的一款POI封装工具EasyExcel,上面题目等到处理;

针对2:

不能一次性查询出全数数据,我们可以分批停止查询,只不外期多查询几次的题目,况且市道上分页插件很多。此题目好处理。

针对3:

可以将300w条数据写到分歧的Sheet中,每一个Sheet写一百万即可。别的,保举公众 号Java精选,答复java口试,获得口试材料,支持在线刷题。

针对4:

不能一行一行的写入到Excel上,我们可以将分批查询的数据分批写入到Excel中。

针对5:

导入到DB时我们可以将Excel中读取的数据存储到调集合,到了一定数目,间接批量插入到DB中。

针对6:

不能利用Mybatis的批量插入,我们可以利用JDBC的批量插入,配合事务来完成批量插入到DB。即 Excel读取分批+JDBC分批插入+事务。

3.1 EasyExcel 简介

附上GitHub地址:

https://github.com/alibaba/easyexcel

GitHub地址上教程和说明很具体,而且附带有读和写的demo代码,这里对它的先容我就不再具体说了。

至于EasyExcel底层怎样实现的这个还有待研讨。

3.2 300w数据导出

EasyExcel完成300w数据的导出。技术难点已经晓得了,接下来就是针对这一难点供给自己的处理思绪即可。

300w数据的导出处理思绪:

  • 首先在查询数据库层面,需要分批停止查询(我利用的是每次查询20w)

  • 每查询一次竣事,就利用EasyExcel工具将这些数据写入一次;

  • 当一个Sheet写满了100w条数据,起头将查询的数据写入到另一个Sheet中;

  • 如此循环直到数据全数导出到Excel终了。

留意:

1、我们需要计较Sheet个数,以及循环写入次数。出格是最初一个Sheet的写入次数

由于你不晓得最初一个Sheet选哟写入几大都据,能够是100w,也能够是25w由于我们这里的300w只是模拟数据,有能够导出的数据比300w多也能够少

2、我们需要计较写入次数,由于我们利用的分页查询,所以需要留意写入的次数。

实在查询数据库几多次就是写入几多次

//导出逻辑代码publicvoiddataExport300w(HttpServletResponseresponse){{OutputStreamoutputStream=null;try{longstartTime=System.currentTimeMillis();System.out.println("导出起头时候:"+startTime);outputStream=response.getOutputStream();ExcelWriterwriter=newExcelWriter(outputStream,ExcelTypeEnum.XLSX);StringfileName=newString(("excel100w").getBytes(),"UTF-8");//titleTabletable=newTable(1);List<List<String>>titles=newArrayList<List<String>>();titles.add(Arrays.asList("onlineseqid"));titles.add(Arrays.asList("businessid"));titles.add(Arrays.asList("becifno"));titles.add(Arrays.asList("ivisresult"));titles.add(Arrays.asList("createdby"));titles.add(Arrays.asList("createddate"));titles.add(Arrays.asList("updateby"));titles.add(Arrays.asList("updateddate"));titles.add(Arrays.asList("risklevel"));table.setHead(titles);//模拟统计查询的数据数目这里模拟100wintcount=3000001;//记录总数:现实中需要按照查询条件停止统计即可IntegertotalCount=actResultLogMAPPer.findActResultLogByCondations(count);//每一个Sheet寄存100w条数据IntegersheetDataRows=ExcelConstants.PER_SHEET_ROW_COUNT;//每次写入的数据量20wIntegerwriteDataRows=ExcelConstants.PER_WRITE_ROW_COUNT;//计较需要的Sheet数目IntegersheetNum=totalCount%sheetDataRows==0?(totalCount/sheetDataRows):(totalCount/sheetDataRows+1);//计较一般情况下每一个Sheet需要写入的次数(一般情况不包括最初一个sheet,由于最初一个sheet不肯定会写入几多条数据)IntegeroneSheetWriteCount=sheetDataRows/writeDataRows;//计较最初一个sheet需要写入的次数IntegerlastSheetWriteCount=totalCount%sheetDataRows==0?oneSheetWriteCount:(totalCount%sheetDataRows%writeDataRows==0?(totalCount/sheetDataRows/writeDataRows):(totalCount/sheetDataRows/writeDataRows+1));//起头分批查询分次写入//留意此次的循环就需要停止嵌套循环了,外层循环是Sheet数目,内层循环是写入次数List<List<String>>dataList=newArrayList<>();for(inti=0;i<sheetNum;i++){//建立SheetSheetsheet=newSheet(i,0);sheet.setSheetName("测试Sheet1"+i);//循环写入次数:j的自增条件是当不是最初一个Sheet的时辰写入次数为一般的每个Sheet写入的次数,假如是最初一个就需要利用计较的次数lastSheetWriteCountfor(intj=0;j<(i!=sheetNum-1?oneSheetWriteCount:lastSheetWriteCount);j++){//调集复用,便于GC清算dataList.clear();//分页查询一次20wPageHelper.startPage(j+1+oneSheetWriteCount*i,writeDataRows);List<ActResultLog>reslultList=actResultLogMapper.findByPage100w();if(!CollectionUtils.isEmpty(reslultList)){reslultList.forEach(item->{dataList.add(Arrays.asList(item.getOnlineseqid(),item.getBusinessid(),item.getBecifno(),item.getIvisresult(),item.getCreatedby(),Calendar.getInstance().getTime().toString(),item.getUpdateby(),Calendar.getInstance().getTime().toString(),item.getRisklevel()));});}//写数据writer.write0(dataList,sheet,table);}}//下载EXCELresponse.setHeader("Content-Disposition","attachment;filename="+newString((fileName).getBytes("gb2312"),"ISO-8859-1")+".xlsx");response.setContentType("multipart/form-data");response.setCharacterEncoding("utf-8");writer.finish();outputStream.flush();//导出时候竣事longendTime=System.currentTimeMillis();System.out.println("导出竣事时候:"+endTime+"ms");System.out.println("导出所用时候:"+(endTime-startTime)/1000+"秒");}catch(FileNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}finally{if(outputStream!=null){try{outputStream.close();}catch(Exceptione){e.printStackTrace();}}}}}3.2.1 测试机状态

下面是测试机设置











3.2.2 利用数据库版本

数据库我利用的是Oracle19C在网上查阅实在在数据量不跨越1亿的情况下,Mysql和Oracle的性能实在相差不大,跨越1亿,Oracle的各方面上风才会明显。

所以这里可以疏忽利用数据库对时候酿成的影响,利用mysql一样可以完成测试,不需要零丁安装Oracle。

此次测试在查询方面我利用的是rownum停止的模拟查询300w条数据,这类查询效力实在并不高,现实还有很多优化空间来加速查询速度,

如:明白查询具体字段,不要用星号,经常查询字段增加索引等尽能够进步查询效力,用时能够会更短。

<selectid="findByPage300w"resultType="show.mrkay.pojo.ActResultLog">select*fromACT_RESULT_LOGwhererownum<![CDATA[<]]>3000001</select>--建表语句:可以参考一下--CreatetablecreatetableACT_RESULT_LOG(onlineseqidVARCHAR2(32),businessidVARCHAR2(32),becifnoVARCHAR2(32),ivisresultVARCHAR2(32),createdbyVARCHAR2(32),createddateDATE,updatebyVARCHAR2(32),updateddateDATE,risklevelVARCHAR2(32))tablespaceSTUDY_KAYpctfree10initrans1maxtrans255storage(initial64Knext1Mminextents1maxextentsunlimited);3.2.3 测试成果

下面是300w数据从DB导出到Excel所用时候

从上面成果可以看出,300w的数据导出时候用时2分15秒,而且这是在不适用实体作为映照的情况下,假如利用实体映照不适用循环封装的话速度会更快(固然这也是在没有设备表甲等其他表格款式的情况下)

综合来说速度还算可以。

在网上查了很多材料有一个博主测试利用EasyExcel导出102w数据用时105秒,具体可以看一下链接:

https://blog.csdn.net/u014299266/article/details/107790561

看一下导出结果:文件还是挺大的163M






3.2.4 导出小结

经过测试EasyExcel还是挺快的,而且利用起来相当方便,作者还专门供给了关流方式,不需要我们手动去关流了,也避免了我们经常忘记关流致使的一系列题目。

导出测试就到这里,对于数据量小于300W的数据可以利用在一个Sheet中停止导出。这里就不再演示。

3.3 300w数据导入

代码不重要首先还是思绪

300W数据的导入处理思绪

1、首先是分批读取读取Excel中的300w数据,这一点EasyExcel有自己的处理计划,我们可以参考Demo即可,只需要把它分批的参数3000调大即可。我是用的20w;(一会儿代码一看就能大白)

2、其次就是往DB里插入,怎样去插入这20w条数据,固然不能一条一条的循环,应当批量插入这20w条数据,一样也不能利用Mybatis的批量插入语,由于效力也低。可以参考下面链接【Myabtis批量插入和JDBC批量插入性能对照】

3、利用JDBC+事务的批量操纵将数据插入到数据库。(分批读取+JDBC分批插入+手动事务控制)

https://www.cnblogs.com/wxw7blog/p/8706797.html

3.3.1 数据库数据(导入前)

如图



3.3.2 焦点营业代码//EasyExcel的读取Excel数据的API@Testpublicvoidimport2DBFromExcel10wTest(){StringfileName="D:\\StudyWorkspace\\JavaWorkspace\\java_project_workspace\\idea_projects\\SpringBootProjects\\easyexcel\\exportFile\\excel300w.xlsx";//记录起头读取Excel时候,也是导入法式起头时候longstartReadTime=System.currentTimeMillis();System.out.println("------起头读取Excel的Sheet时候(包括导入数据进程):"+startReadTime+"ms------");//读取一切Sheet的数据.每次读完一个Sheet就会挪用这个方式EasyExcel.read(fileName,newEasyExceGeneralDatalListener(actResultLogService2)).doReadAll();longendReadTime=System.currentTimeMillis();System.out.println("------竣事读取Excel的Sheet时候(包括导入数据进程):"+endReadTime+"ms------");}//事务监听publicclassEasyExceGeneralDatalListenerextendsAnalysisEventListener<Map<Integer,String>>{/***处置营业逻辑的Service,也可以是Mapper*/privateActResultLogService2actResultLogService2;/***用于存储读取的数据*/privateList<Map<Integer,String>>dataList=newArrayList<Map<Integer,String>>();publicEasyExceGeneralDatalListener(){}publicEasyExceGeneralDatalListener(ActResultLogService2actResultLogService2){this.actResultLogService2=actResultLogService2;}@Overridepublicvoidinvoke(Map<Integer,String>data,AnalysisContextcontext){//数据add进入调集dataList.add(data);//size能否为100000条:这里实在就是分批.当数据即是10w的时辰履行一次插入if(dataList.size()>=ExcelConstants.GENERAL_ONCE_SAVE_TO_DB_ROWS){//存入数据库:数据小于1w条利用Mybatis的批量插入即可;saveData();//清算调集便于GC接管dataList.clear();}}/***保存数据到DB**@param*@MethodName:saveData*@return:void*/privatevoidsaveData(){actResultLogService2.import2DBFromExcel10w(dataList);dataList.clear();}/***Excel中所稀有据剖析终了会挪用此方式**@param:context*@MethodName:doAfterAllAnalysed*@return:void*/@OverridepublicvoiddoAfterAllAnalysed(AnalysisContextcontext){saveData();dataList.clear();}}//JDBC工具类publicclassJDBCDruidUtils{privatestaticDataSourcedataSource;/*建立数据Properties调集工具加载加载设置文件*/static{Propertiespro=newProperties();//加载数据库毗连池工具try{//获得数据库毗连池工具pro.load(JDBCDruidUtils.class.getClassLoader().getResourceAsStream("druid.properties"));dataSource=DruidDataSourceFactory.createDataSource(pro);}catch(Exceptione){e.printStackTrace();}}/*获得毗连*/publicstaticConnectiongetConnection()throwsSQLException{returndataSource.getConnection();}/***封闭conn,和statement独工具资本**@paramconnection*@paramstatement*@MethodName:close*@return:void*/publicstaticvoidclose(Connectionconnection,Statementstatement){if(connection!=null){try{connection.close();}catch(SQLExceptione){e.printStackTrace();}}if(statement!=null){try{statement.close();}catch(SQLExceptione){e.printStackTrace();}}}/***封闭conn,statement和resultset三个工具资本**@paramconnection*@paramstatement*@paramresultSet*@MethodName:close*@return:void*/publicstaticvoidclose(Connectionconnection,Statementstatement,ResultSetresultSet){close(connection,statement);if(resultSet!=null){try{resultSet.close();}catch(SQLExceptione){e.printStackTrace();}}}/*获得毗连池工具,口试宝典:https://www.yoodb.com*/publicstaticDataSourcegetDataSource(){returndataSource;}}#druid.properties设置driverClassName=oracle.jdbc.driver.OracleDriverurl=jdbc:oracle:thin:@localhost:1521:ORCLusername=mrkaypassword=******initialSize=10maxActive=50maxWait=60000//Service中具体营业逻辑/***测试用Excel导入跨越10w条数据,经过测试发现,利用Mybatis的批量插入速度很是慢,所以这里可以利用数据分批+JDBC分批插入+事务来继续插入速度会很是快**@param*@MethodName:import2DBFromExcel10w*@return:java.util.Map<java.lang.String,java.lang.Object>*/@OverridepublicMap<String,Object>import2DBFromExcel10w(List<Map<Integer,String>>dataList){HashMap<String,Object>result=newHashMap<>();//成果集合数据为0时,竣事方式.停止下一次挪用if(dataList.size()==0){result.put("empty","0000");returnresult;}//JDBC分批插入+事务操纵完成对10w数据的插入Connectionconn=null;PreparedStatementps=null;try{longstartTime=System.currentTimeMillis();System.out.println(dataList.size()+"条,起头导入到数据库时候:"+startTime+"ms");conn=JDBCDruidUtils.getConnection();//控制事务:默许不提交conn.setAutoCommit(false);Stringsql="insertintoACT_RESULT_LOG(onlineseqid,businessid,becifno,ivisresult,createdby,createddate,updateby,updateddate,risklevel)values";sql+="(?,?,?,?,?,?,?,?,?)";ps=conn.prepareStatement(sql);//循环成果集:这里循环不支持"烂布袋"表达式for(inti=0;i<dataList.size();i++){Map<Integer,String>item=dataList.get(i);ps.setString(1,item.get(0));ps.setString(2,item.get(1));ps.setString(3,item.get(2));ps.setString(4,item.get(3));ps.setString(5,item.get(4));ps.setTimestamp(6,newTimestamp(System.currentTimeMillis()));ps.setString(7,item.get(6));ps.setTimestamp(8,newTimestamp(System.currentTimeMillis()));ps.setString(9,item.get(8));//将一组参数增加到此 PreparedStatement 工具的批处置号令中。ps.addBatch();}//履行批处置ps.executeBatch();//手动提交事务conn.commit();longendTime=System.currentTimeMillis();System.out.println(dataList.size()+"条,竣事导入到数据库时候:"+endTime+"ms");System.out.println(dataList.size()+"条,导入用时:"+(endTime-startTime)+"ms");result.put("success","1111");}catch(Exceptione){result.put("exception","0000");e.printStackTrace();}finally{//关毗连JDBCDruidUtils.close(conn,ps);}returnresult;}3.3.3 测试成果

下面是300w数据边读边写用时候:

大致计较一下:

从起头读取到中心分批导入再到法式竣事总共用时: (1623127964725-1623127873630)/1000=91.095

300w数据恰好是分15次插入综适用时:8209毫秒 也就是 8.209秒

计较可得300w数据读取时候为:91.095-8.209=82.886

成果不言而喻:

EasyExcel分批读取300W数据只用了 82.886秒


利用JDBC分批+事务操纵插入300w条数据综合只用时 8.209秒

------起头读取Excel的Sheet时候(包括导入数据进程):1623127873630ms------200000条,起头导入到数据库时候:1623127880632ms200000条,竣事导入到数据库时候:1623127881513ms200000条,导入用时:881ms200000条,起头导入到数据库时候:1623127886945ms200000条,竣事导入到数据库时候:1623127887429ms200000条,导入用时:484ms200000条,起头导入到数据库时候:1623127892894ms200000条,竣事导入到数据库时候:1623127893397ms200000条,导入用时:503ms200000条,起头导入到数据库时候:1623127898607ms200000条,竣事导入到数据库时候:1623127899066ms200000条,导入用时:459ms200000条,起头导入到数据库时候:1623127904379ms200000条,竣事导入到数据库时候:1623127904855ms200000条,导入用时:476ms200000条,起头导入到数据库时候:1623127910495ms200000条,竣事导入到数据库时候:1623127910939ms200000条,导入用时:444ms200000条,起头导入到数据库时候:1623127916271ms200000条,竣事导入到数据库时候:1623127916744ms200000条,导入用时:473ms200000条,起头导入到数据库时候:1623127922465ms200000条,竣事导入到数据库时候:1623127922947ms200000条,导入用时:482ms200000条,起头导入到数据库时候:1623127928260ms200000条,竣事导入到数据库时候:1623127928727ms200000条,导入用时:467ms200000条,起头导入到数据库时候:1623127934374ms200000条,竣事导入到数据库时候:1623127934891ms200000条,导入用时:517ms200000条,起头导入到数据库时候:1623127940189ms200000条,竣事导入到数据库时候:1623127940677ms200000条,导入用时:488ms200000条,起头导入到数据库时候:1623127946402ms200000条,竣事导入到数据库时候:1623127946925ms200000条,导入用时:523ms200000条,起头导入到数据库时候:1623127952158ms200000条,竣事导入到数据库时候:1623127952639ms200000条,导入用时:481ms200000条,起头导入到数据库时候:1623127957880ms200000条,竣事导入到数据库时候:1623127958925ms200000条,导入用时:1045ms200000条,起头导入到数据库时候:1623127964239ms200000条,竣事导入到数据库时候:1623127964725ms200000条,导入用时:486ms------竣事读取Excel的Sheet时候(包括导入数据进程):1623127964725ms------

看一下数据库的数据能否是真的存进去了300w

可以看到数据比导入前多了300W,测试很成功



3.3.4 导入小结

具体我没有看网上其他人的测试情况,这工具一般也很少有人愿意测试,不外这个速度对于我那时处理公司大数据的导入和导出已经充足,固然公司的营业逻辑很复杂,数据量也比力多,表的字段也比力多,导入和导出的速度会比现在测试的要慢一点,可是也在人类能接管的范围之内。

4. 总结

此次工作中碰到的题目也给我留下了深入印象,同时也是我职业生活添彩的一笔。

最最少简历上可以写上你处置过上百万条数据的导入导出。

最初说一下公司之前怎样做的,公司之前做法是

限制了用户的下载数目每次最多只能有四小我同时下载,而且控制每个用户最大的导出数据最多只能是20w,与此同时他们也是利用的JDBC分批导入,可是并没有手动控制事务。

控制同时下载人数我可以了解,可是控制下载数据最多为20w就显得有点鸡肋了。

这也是我前期要处理的题目。

好了到此竣事,相信大神有比我做的更好的,对于EasyExcel内部究竟是怎样实现的还有待讲求(有空我再研讨研讨)。

作者:liu.kai

https://blog.csdn.net/weixin_44848900/article/details/117701981

公众号“Java精选”所颁发内容说明来历的,版权归原出地方有(没法查证版权的大概未说明出处的均来自收集,系转载,转载的目标在于传递更多信息,版权属于原作者。若有侵权,请联系,笔者会第一时候删除处置!比来有很多人问,有没有读者交换群!加入方式很简单,公众号Java精选,答复“加群”,即可入群!Java精选口试题(微信小法式):3000+道口试题,包括Java根本、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设想等,在线随时刷题!------ 出格保举 ------出格保举:专注分享最前沿的技术与资讯,为弯道超车做好预备及各类开源项目与高效力软件的公众号,「大咖笔记」,专注挖掘好工具,很是值得大师关注。点击下方公众号卡片关注。点击“阅读原文”,领会更多出色内容!文章有帮助的话,点在看,转发吧!

高端人脉微信群

高端人脉微信群

人脉=钱脉,我们相信天下没有聚不拢的人脉,扫码进群找到你所需的人脉,对接你所需的资源。

商业合作微信

商业合作微信

本站创始人微信,13年互联网营销经验,擅长引流裂变、商业模式、私域流量,高端人脉资源丰富。

精彩点评

相关推荐

怎样写好项目方案(专业项目方案写作定制)

怎样写好项目方案(专业项目方案写作定制)

在工作中,除了技术工作之外,我们也经常需要写一些项目的方案,当然如果公司比较大,

再谈“断直连”——政策、方案与不确定问题

再谈“断直连”——政策、方案与不确定问题

尽管“断直连”的基本方向已确定,但受各参与方合作意愿、政策理解角度、科技/服务能

运营方案怎么写(专业运营方案写作)

运营方案怎么写(专业运营方案写作)

作为运营人,写方案是必不可少的,而要想写一份优秀的运营方案,掌握框架、抓准方案的

产品方案怎么写(专业撰写产品方案)

产品方案怎么写(专业撰写产品方案)

想要做一名合格的产品经理,首先要能写好一份好的产品方案。一份好的产品方案,会在产

一个恐怕难以推广的自制CR-BOX方案

一个恐怕难以推广的自制CR-BOX方案

可能不需要再更新了,所以放在开头。因为对我这个方案不满意,所以试了其它的方案,用

小白进阶:一份模板,套用所有运营策划方案

小白进阶:一份模板,套用所有运营策划方案

2019.09.26更新:文章内容较多,前半部分主要阐述完成一份方案所需的运营思维,建议刚

论建筑设计方案如今有多卷?

论建筑设计方案如今有多卷?

这是一个故事。请各位看官老爷酌情相信。方案一方案一方案二方案二方案三方案三方案四

策划方案,不以页数论英雄

策划方案,不以页数论英雄

编辑导语:有些人在写策划方案时,总觉得页数越多,感觉准备得越充分,对策划案页数迷

一份完整的方案报告应该包括哪些方面?

一份完整的方案报告应该包括哪些方面?

听周边的同事和学员的反馈说,每次一到写方案的时候,经常会陷入一种非常焦虑的状态:

经国务院同意,八部门联合印发重磅改革方案!(全文)

经国务院同意,八部门联合印发重磅改革方案!(全文)

11月21日,据中国人民银行网站消息,为深入贯彻党中央、国务院决策部署,按照《长江三

一图速览!党和国家机构改革方案

一图速览!党和国家机构改革方案

制作:刘珂君、岳小乔、皇甫凌雨、冯慧文、安博文

延迟退休试点传来“好方案”:这3类人偷偷笑了,希望也有你

延迟退休试点传来“好方案”:这3类人偷偷笑了,希望也有你

我国正在加速进入老龄化,这是不争的事实。专家早在几年前就提出了延迟退休的方案,当

中共中央办公厅 国务院办公厅印发《粮食节约行动方案》

中共中央办公厅 国务院办公厅印发《粮食节约行动方案》

近日,中共中央办公厅、国务院办公厅印发了《粮食节约行动方案》,并发出通知,要求各

解决方案如何写:7个技巧,5个通病,项目总监给出的建议

解决方案如何写:7个技巧,5个通病,项目总监给出的建议

日常工作问题剖析实际的工作中,不管是项目经理还是售前工程师,给客户提供的大部分解

济南重磅方案公布

济南重磅方案公布

近日,济南市政府印发《济南市数字人民币试点工作实施方案》(以下简称《实施方案》)

干货!如何写出一份优秀完整的方案(专业写作方案)

干货!如何写出一份优秀完整的方案(专业写作方案)

无论是从事运营、策划或其他需要制定方案的岗位,写方案、改方案、执行方案都将成为你

项目管理 | 如何编写项目实施解决方案 | 推荐收藏

项目管理 | 如何编写项目实施解决方案 | 推荐收藏

如何保证项目实施成功?项目设计?需求报告?调研记录?项目培训?项目策划?上述提到

权威快报|坚持第九版防控方案和二十条措施不动摇、不走样

权威快报|坚持第九版防控方案和二十条措施不动摇、不走样

国务院联防联控机制11月22日举行新闻发布会表示当前,随着奥密克戎变异株快速传播我国

超硬干货:如何把需求变成产品方案?

超硬干货:如何把需求变成产品方案?

编辑导语:在产品经理的日常工作中,往往需要了解和收集许多的用户需求,那么,如何将

叮!送你一份“开挂式”写方案攻略

叮!送你一份“开挂式”写方案攻略

以下文章来源于泡泡Ter ,作者老1泡听身边不少朋友同事聊到他们写方案时的状态,经常

商业洽谈 文章投递 寻求报道
电话咨询: 15924191378
关注微信