-
求职训练营·Java实践排位赛来啦华为专家手把手教你企业级Java编程规范迈出入职名企第一步 现在起加入训练营,听课完成作业,就有机会获得多重学习激励你学习,我发奖,赶紧来呀!一、中奖名单公布1、学习激励奖中奖名单*抽奖公示视频请见本帖下方2、电子证书名单3、奖品领取请12月期的获奖学员在1月10日前扫描下方二维码,用报名训练营的华为云账号登录,(1)学习激励奖中奖学员请填写奖品邮寄信息,(2)电子证书学员请填**实姓名及邮箱。未在限定时间内反馈视为放弃。二、学习激励奖规则活动时间:即日起到2020年12月31日1. 训练营作业分值统计:共26个作业题,分为选择题和实践题两类。每题分值100分,总分值为2600分。2. 获得【学习激励奖】条件:自9月10日起,报名训练营,加入课堂并完成作业的选手,都有机会获得学习激励奖品,数量有限,先完成先得。3. 抽奖频次:大赛累积100人完成作业之后,开始抽奖。之后每2周抽奖并公示1次。4. 奖品:在原有结业证书、华为蓝牙音箱的奖励基础上,新增了华为10000mAh移动电源SuperCharge快充版(Max 22.5W)和AM115半入耳式耳机。5. 注意事项:(1)作业分数为0分的选手无抽奖资格。(2)需26个题目全部完成才有抽奖资格。每人限中奖1次。(3)答题截止时间前可以多次修改(最多5次),系统以最后一次答题成绩为准。6. 名单公布:大赛官方会在本帖及官方QQ群内进行公示,请大家现在入群,第一时间收到中奖名单提醒。7. 领奖方式:请获奖学员在名单公布后的【5个工作日内】扫描下方二维码,用报名大赛的华为云账号登录,完成信息核对和邮寄信息填写,未在限定时间内反馈视为放弃。8. 结业证书颁布规则:(1)作业累积分值在1600分以上(包含1600分)的选手,将获得电子结业证书1张。(2)证书将统一在12月31日后公布并颁发。最终解释权归华为所有。三、学习激励奖参与方式 1. 点击右侧蓝字:加入课堂,或者进入大赛官网平台,页面左侧【训练营入口】加入课堂。 2. 进入课堂后,点击【作业】进入答题页面,完成所有26个作业。 3. 进入答题页面,完成题目内容,点击“提交作业”即完成一题。26个作业均完成后,算最终完成作业。在答题截止时间前可以多次修改(最多5次),系统以最后一次答题成绩为准。 【友情链接】学霸奖名单公布https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=76258&page=1&extra=#pid340680心得分享幸运奖名单公布https://bbs.huaweicloud.com/forum/thread-76417-1-1.html四、抽奖视频公示处:【12月学习激励奖抽奖视频】
-
五、使用数据库连接池 1、原因 1.传统连接方法缺点:用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。2.数据库连接池 2、开源连接池 1.DBCP 数据库连接池 工具类如下:JdbcUtils_DBCPimport java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSourceFactory; public class JdbcUtils_DBCP { private static DataSource ds = null; static{ try{ InputStream in = JdbcUtils_DBCP.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"); Properties prop = new Properties(); prop.load(in); BasicDataSourceFactory factory = new BasicDataSourceFactory(); ds = factory.createDataSource(prop); System.out.println(ds); }catch (Exception e) { throw new ExceptionInInitializerError(e); } } public static Connection getConnection() throws SQLException{ return ds.getConnection(); } public static void release(Connection conn,Statement st,ResultSet rs){ if(rs!=null){ try{ rs.close(); }catch (Exception e) { e.printStackTrace(); } rs = null; } if(st!=null){ try{ st.close(); }catch (Exception e) { e.printStackTrace(); } } if(conn!=null){ try{ conn.close(); }catch (Exception e) { e.printStackTrace(); } } } } 2.C3P0 数据库连接池连接工具类:JdbcUtils_C3p0(自己在这里更改)import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSourceFactory; import com.mchange.v2.c3p0.ComboPooledDataSource; public class JdbcUtils_C3P0 { private static ComboPooledDataSource ds = null; static{ try{ ds = new ComboPooledDataSource(); ds.setDriverClass("com.mysql.jdbc.Driver"); ds.setJdbcUrl("jdbc:mysql://localhost:3306/day16"); ds.setUser("root"); ds.setPassword("root"); ds.setInitialPoolSize(10);//最初连接数 ds.setMinPoolSize(5);//最小连接数 ds.setMaxPoolSize(20);//最大连接数 }catch (Exception e) { throw new ExceptionInInitializerError(e); } } public static Connection getConnection() throws SQLException{ return ds.getConnection(); } public static void release(Connection conn,Statement st,ResultSet rs){ if(rs!=null){ try{ rs.close(); }catch (Exception e) { e.printStackTrace(); } rs = null; } if(st!=null){ try{ st.close(); }catch (Exception e) { e.printStackTrace(); } } if(conn!=null){ try{ conn.close(); }catch (Exception e) { e.printStackTrace(); } } } }也可以将配置信息放在xml文件中(src下):c3p0-config.xml<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/day16</property> <property name="user">root</property> <property name="password">root</property> <property name="acquireIncrement">5</property> <property name="initialPoolSize">10</property> <property name="minPoolSize">5</property> <property name="maxPoolSize">20</property> </default-config> <named-config name="mysql"> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/day16</property> <property name="user">root</property> <property name="password">root</property> <property name="acquireIncrement">5</property> <property name="initialPoolSize">10</property> <property name="minPoolSize">5</property> <property name="maxPoolSize">20</property> </named-config> <named-config name="oracle"> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/day16</property> <property name="user">root</property> <property name="password">root</property> <property name="acquireIncrement">5</property> <property name="initialPoolSize">10</property> <property name="minPoolSize">5</property> <property name="maxPoolSize">20</property> </named-config> </c3p0-config>这样JdbcUtils_C3p0可以改为: /* ds = new ComboPooledDataSource(); ds.setDriverClass("com.mysql.jdbc.Driver"); ds.setJdbcUrl("jdbc:mysql://localhost:3306/day16"); ds.setUser("root"); ds.setPassword("root"); ds.setInitialPoolSize(10);//最初连接数 ds.setMinPoolSize(5);//最小连接数 ds.setMaxPoolSize(20);//最大连接数 */ ds = new ComboPooledDataSource(""mysql"");//如果默认()
-
接着上面的说:4、获取结果 Jdbc程序中的ResultSet用于代表Sql语句的执行结果。 Resultset封装执行结果时,采用的类似于表格的方式, ResultSet 对象维护了一个指向表格数据行的游标,初始的时候, 游标在第一行之前,调用ResultSet.next() 方法,可以使游标指向具体的数据行, 进行调用方法获取该行的数据。1、获取行ResultSet提供了对结果集进行滚动的方法:next():移动到下一行Previous():移动到前一行absolute(int row):移动到指定行beforeFirst():移动resultSet的最前面。afterLast() :移动到resultSet的最后面。2、获取值ResultSet既然用于封装执行结果的,所以该对象提供的都是用于获取数据的get方法: 获取任意类型的数据 getObject(int index) getObject(string columnName) 获取指定类型的数据,例如 getString(int index) getString(String columnName) 常用数据类型转换: SQL类型Jdbc对应方法返回类型tinyintgetByte()getByte()getByte()getShort()Short()intgetintintbigintbigintLongchar,varchar,longvarchargetStringStringtext(clob) blobgetClob()Clob bolbdategetDatajava.sql.DatetimegetTimejava.sql.TimetimestampgetTimestampjava.sql.TimestampResultSet rs = null; //4.向数据库发sql,并获取代表结果集的resultset String sql = "select id,name,password,email,birthday from users"; rs = st.executeQuery(sql); //5.取出结果集的数据 rs.afterLast(); rs.previous(); System.out.println("id=" + rs.getObject("id")); System.out.println("name=" + rs.getObject("name")); System.out.println("password=" + rs.getObject("password")); System.out.println("email=" + rs.getObject("email")); System.out.println("birthday=" + rs.getObject("birthday"));或者://循环取出(id) while(rs.next()) { String id=rs.getString(1);//1代表数据库中表的列数,id在第一列也可以("id")!!! System.out.println(id+" "); }5、释放资源 Jdbc程序运行完后,切记要释放程序在运行过程中,创建的那些与数据库进行交互的对象, 这些对象通常是ResultSet, Statement和Connection对象。注意:为确保资源释放代码能运行,资源释放代码也一定要放在finally语句中。//6.关闭链接,释放资源 if(rs!=null){ try{ rs.close(); }catch (Exception e) { e.printStackTrace(); } rs = null; } if(st!=null){ try{ st.close(); }catch (Exception e) { e.printStackTrace(); } } if(conn!=null){ try{ conn.close(); }catch (Exception e) { e.printStackTrace(); } }
-
一、环境介绍mysql中创建一个库shen,并创建user表和插入表的数据。新建一个Java工程jdbc,并导入数据驱动。二、详细步骤 1、加载数据库驱动//1.加载驱动(开发推荐的方式) Class.forName("com.mysql.jdbc.Driver");注意:如果连接的是SQL server//1.加载驱动 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");2、建立连接 1、数据库URL URL用于标识数据库的位置,程序员通过URL地址告诉JDBC程序连接哪个数据库,URL的写法为: jdbc:mysql:[]//localhost:3306/shen ?参数名:参数值 常用数据库URL地址的写法: Oracle:jdbc:oracle:thin:@localhost:1521:shen SqlServer:jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=shen MySql:jdbc:mysql://localhost:3306/shen注意:如果是localhost:3306,mysql可以简写为jdbc:mysql:///sid(尽量不这样)2、Connection Jdbc程序中的Connection,它用于代表数据库的链接,Collection是数据库编程中最重要的一个对象,客户端与数据库所有交互都是通过connection对象完成的,创建方法为:Connection conn = DriverManager.getConnection(url,user,pass); 这个对象的常用方法:String url = "jdbc:mysql://localhost:3306/shen"; String username = "shen"; String password = "Anxin062039"; Connection conn = null; //2.获取与数据库的链接 conn = DriverManager.getConnection(url, username, password);3、执行SQL语句1、Statement Jdbc程序中的Statement对象用于向数据库发送SQL语句,创建方法为: Statement st = conn.createStatement();Statement对象常用方法:Statement st = null; //3.获取用于向数据库发送sql语句的statement st = conn.createStatement(); //4.向数据库发sql String sql = "select id,name,password,email,birthday from users"; st.executeQuery(sql);2、PreperedStatement PreperedStatement是Statement的孩子,它的实例对象可以通过调用: PreperedStatement st = conn.preparedStatement()PreperedStatement st = null; String sql = "select * from users where name=? and password=?"; //3.获取用于向数据库发送sql语句的Preperedstatement st = conn.preparedStatement(sql);//在此次传入,进行预编译 st.setString(1, username); st.setString(2, password); //4.向数据库发sql st.executeQuery();//在这里不需要传入sql比较:相对于Statement对象而言PreperedStatement可以避免SQL注入的问题如:String sql="select * from admin where loginname='"+loginName+"' and loginpwd='"+loginPwd+"'"; 在应用中: -》请输入账号: 333 -》请输入密码: wer'or'1'='1 实际上发送:select * from admin where loginname='333' and loginpwd='wer'or'1'='1',登录成功! Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。PreparedStatement 可对SQL进行预编译,从而提高数据库的执行效率。并且PreperedStatement对于sql中的参数,允许使用占位符的形式进行替换,简化sql语句的编写。
-
一、_id 索引我们介绍过,我们往集合中添加文档时,默认情况下MongoDB都会帮助我们创建一个名为_id的字段,这个字段就是一个索引。默认情况下,一般的集合都会帮我们创建这个字段作为索引,但也有一些集合不会将_id默认作为索引,比如固定集合,这个我们后面会详细说到这个问题。二、复合索引如果我们的查询条件有多个的话,我们可以对这多个查询条件都建立索引,比如我们可以对文档中的x和y字段都建立索引,如下:db.sang_collect.ensureIndex({x:1,y:-1})1此时执行如下查询语句时就会用到这个复合索引:db.sang_collect.find({x:1,y:999})1小伙伴们也可以通过查看查询计划来确定确实使用到了上文创建好的索引。三、过期索引顾名思义,过期索引就是一种会过期的索引,在索引过期之后,索引对应的数据会被删除,创建方式如下:db.sang_collect.ensureIndex({time:1},{expireAfterSeconds:30})1expireAfterSeconds表示索引的过期时间,单位为秒。time表示索引的字段,time的数据类型必须是ISODate或者ISODate数组,否则的话,当索引过期之后,time的数据就不会被删除。四、全文索引全文索引虽然好用,可惜不支持中文,我们这里就先做一个简单的了解。比如,我的数据集如下:{ "_id" : ObjectId("59f5a3da1f9e8e181ffc3189"), "x" : "Java C# Python PHP"}{ "_id" : ObjectId("59f5a3da1f9e8e181ffc318a"), "x" : "Java C#"}{ "_id" : ObjectId("59f5a3da1f9e8e181ffc318b"), "x" : "Java Python"}{ "_id" : ObjectId("59f5a3da1f9e8e181ffc318c"), "x" : "PHP Python"}{ "_id" : ObjectId("59f5a4541f9e8e181ffc318d"), "x" : "C C++"}1234567891011121314151617181920我们可以给x字段建立一个全文索引,创建方式如下:db.sang_collect.ensureIndex({x:"text"})1MongoDB会自动对x字段的数据进行分词,然后我们就可以通过如下语句进行查询:db.sang_collect.find({$text:{$search:"Java"}})1此时x中包含Java的文档都会被查询出来。如果想查询既包含Java又包含C#的文档,操作如下:db.sang_collect.find({$text:{$search:"\"Java C#\""}})1用一对双引号将查询条件括起来,如果想查询包含PHP或者Python的文档,操作如下:db.sang_collect.find({$text:{$search:"PHP Python"}})1如果想查询既有PHP,又有Python,但是又不包括Java的文档,如下:db.sang_collect.find({$text:{$search:"PHP Python -Java"}})1建立了全文索引之后,我们也可以查看查询结果的相似度,使用$meta,如下:db.sang_collect.find({$text:{$search:"PHP Python"}},{score:{$meta:"textScore"}})1此时查询结果中会多出一个score字段,该字段的值越大,表示相似度越高,我们可以根据score利用sort来对其进行排序,如下:db.sang_collect.find({$text:{$search:"PHP Python"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}})1全文索引目前看起来功能还是很强大,可惜暂时不支持中文,不过网上对此也有很多解决方案,小伙伴们可以自行搜索查看。五、地理空间索引1. 2d 索引2d索引,可以用来存储和查找平面上的点。,2d索引一般我们可以用在游戏地图中向集合中插入一条记录点的数据:db.sang_collect.insert({x:[90,0]})1插入数据的格式为[经度,纬度],取值范围,经度[-180,180],纬度[-90,90]。数据插入成功之后,我们先通过如下命令创建索引:db.sang_collect.ensureIndex({x:"2d"})1然后通过$near我们可以查询某一个点附近的点,如下:db.sang_collect.find({x:{$near:[90,0]}})1默认情况下返回该点附近100个点,我们可以通过$maxDistance来设置返回的最远距离:db.sang_collect.find({x:{$near:[90,0],$maxDistance:99}})1我们也可以通过$geoWithin查询某个形状内的点,比如查询矩形中的点:db.sang_collect.find({x:{$geoWithin:{$box:[[0,0],[91,1]]}}})1两个坐标点用来确定矩形的位置。查询圆中的点:db.sang_collect.find({x:{$geoWithin:{$center:[[0,0],90]}}})1参数分别表示圆的圆心和半径。查询多边形中的点:db.sang_collect.find({x:{$geoWithin:{$polygon:[[0,0],[100,0],[100,1],[0,1]]}}})1这里可以填入任意多个点,表示多边形中的各个点。2. 2d sphere 索引2dsphere适用于球面类型的地图,它的数据类型是GeoJSON格式的,我们可以在http://geojson.org/地址上查看GeoJSON格式的样式,比如我们描述一个点,GeoJSON如下:{ "_id" : ObjectId("59f5e0571f9e8e181ffc3196"), "name" : "shenzhen", "location" : { "type" : "Point", "coordinates" : [ 90.0, 0.0 ] }}1234567891011描述线,GeoJSON格式如下:{ "_id" : ObjectId("59f5e0d01f9e8e181ffc3199"), "name" : "shenzhen", "location" : { "type" : "LineString", "coordinates" : [ [ 90.0, 0.0 ], [ 90.0, 1.0 ], [ 90.0, 2.0 ] ] }}123456789101112131415161718192021描述多边形,GeoJSON格式如下:{ "_id" : ObjectId("59f5e3f91f9e8e181ffc31d0"), "name" : "beijing", "location" : { "type" : "Polygon", "coordinates" : [ [ [ 0.0, 1.0 ], [ 0.0, 2.0 ], [ 1.0, 2.0 ], [ 0.0, 1.0 ] ] ] }}123456789101112131415161718192021222324252627还有其他的类型,具体小伙伴们可以参考http://geojson.org/。有了数据之后,我们可以通过如下操作来创建地理空间索引了:db.sang_collect.ensureIndex({location:"2dsphere"})1比如我想查询和深圳这个区域有交集的文档,如下:var shenzhen = db.sang_collect.findOne({name:"shenzhen"})db.sang_collect.find({location:{$geoIntersects:{$geometry:shenzhen.location}}})12这里的查询结果是和深圳这个区域有交集的都会查到(比如经过深圳的高速公路、铁路等),我们也可以只查询深圳市内的区域(比如深圳市内所有的学校),如下:var shenzhen = db.sang_collect.findOne({name:"shenzhen"})db.sang_collect.find({location:{$within:{$geometry:shenzhen.location}}})12也可以查询腾讯附近的其他位置,如下:var QQ = db.sang_collect.findOne({name:"QQ"})db.sang_collect.find({location:{$near:{$geometry:QQ.location}}})12六、复合地理空间索引位置往往只是我们查询的一个条件,比如我要查询深圳市内所有的学校,那我得再增加一个查询条件,如下:var shenzhen = db.sang_collect.findOne({name:"shenzhen"})db.sang_collect.find({location:{$within:{$geometry:shenzhen.location}},name:"QQ"})12其他的查询条件跟在后面就行了。
-
关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式。数据库的设计范式是数据库设计所需要满足的规范。只有理解数据库的设计范式,才能设计出高效率、优雅的数据库,否则可能会设计出错误的数据库. 目前,主要有六种范式:第一范式、第二范式、第三范式、BC范式、第四范式和第五范式。满足最低要求的叫第一范式,简称1NF。在第一范式基础上进一步满足一些要求的为第二范式,简称2NF。其余依此类推。 范式可以避免数据冗余,减少数据库的空间,减轻维护数据完整性的麻烦,但是操作困难,因为需要联系多个表才能得到所需要数据,而且范式越高性能就会越差。要权衡是否使用更高范式是比较麻烦的,一般在项目中,用得最多的也就是第三范式,我认为使用到第三范式也就足够了,性能好而且方便管理数据。 函数依赖,如果一个表中某一个字段Y的值是由另外一个字段或一组字段X的值来确定的,就称为Y函数依赖于X。 第一范式(1NF) 定义:如果关系模式R的每个关系r的属性都是不可分的数据项,那么就称R是第一范式的模式。 简单的说,每一个属性都是原子项,不可分割。 1NF是关系模式应具备的最起码的条件,如果数据库设计不能满足第一范式,就不称为关系型数据库。关系数据库设计研究的关系规范化是在1NF之上 进行的。 例如(学生信息表): 学生编号 姓名 性别 联系方式 20080901 张三 男 email:zs@126.com,phone:88886666 20080902 李四 女 email:ls@126.com,phone:66668888 以上的表就不符合,第一范式:联系方式字段可以再分,所以变更为正确的是: 学生编号 姓名 性别 电子邮件 电话 20080901 张三 男 zs@126.com 88886666 20080902 李四 女 ls@126.com 66668888 第二范式(2NF) 定义:如果关系模式R是1NF,且每个非主属性完全函数依赖于候选键,那么就称R是第二范式。简单的说,第二范式要满足以下的条件:首先要满足第一范式,其次每个非主属性要完全函数依赖与候选键,或者是主键。也就是说,每个非主属性是由整个主键函数决定的,而不能由主键的一部分来决定。 例如(学生选课表): 学生 课程 教师 教师职称 教材 教室 上课时间 李四 Spring 张老师 java讲师 《Spring深入浅出》 301 08:00 张三 Struts 杨老师 java讲师 《Struts in Action》 302 13:30 这里通过(学生,课程)可以确定教师、教师职称,教材,教室和上课时间,所以可以把(学生,课程)作为主键。但是,教材并不完全依赖于(学生,课程),只拿出课程就可以确定教材,因为一个课程,一定指定了某个教材。这就叫不完全依赖,或者部分依赖。出现这种情况,就不满足第二范式。 修改后,选课表: 学生 课程 教师 教师职称 教室 上课时间 李四 Spring 张老师 java讲师 301 08:00 张三 Struts 杨老师 java讲师 302 13:30 课程表: 课程 教材 Spring 《Spring深入浅出》 Struts 《Struts in Action》 所以,第二范式可以说是消除部分依赖。第二范式可以减少插入异常,删除异常和修改异常。 第三范式(3NF) 定义:如果关系模式R是2NF,且关系模式R(U,F)中的所有非主属性对任何候选关键字都不存在传递依赖,则称关系R是属于第三范式。 简单的说,第三范式要满足以下的条件:首先要满足第二范式,其次非主属性之间不存在函数依赖。由于满足了第二范式,表示每个非主属性都函数依 赖于主键。如果非主属性之间存在了函数依赖,就会存在传递依赖,这样就不满足第三范式。 上例中修改后的选课表中,一个教师能确定一个教师职称。这样,教师依赖于(学生,课程),而教师职称又依赖于教师,这叫传递依赖。第三范式就是要消除传递依赖。 修改后,选课表: 学生 课程 教师 教室 上课时间 李四 Spring 张老师 301 08:00 张三 Struts 杨老师 302 13:30 教师表: 教师 教师职称 张老师 java讲师 杨老师 java讲师 这样,新教师的职称在没被选课的时候也有地方存了,没人选这个教师的课的时候教师的职称也不至于被删除,修改教师职称时只修改教师表就可以了。 简单的说, 第一范式就是原子性,字段不可再分割; 第二范式就是完全依赖,没有部分依赖; 第三范式就是没有传递依赖。
-
华为云ID:hw67578428 姓名:刘晓冬
-
为啥echo $JAVA_HOME命令显示空白的一行?Tuning Kit的系统性能优化工具第一次安装在鲲鹏服务器上,鲲鹏服务器安装的centos7.6系统,鲲鹏服务器上暂时还未安装其它软件系统。
-
摘要:各种新需求新应用层出不尽,各路新生代编程语言异军突起等等,Java未来会不会继续受欢迎?曾经备受关注的Java是否能紧跟时代步伐?新基建时代破茧重生引领云端未来潮流?1995年第一个Java版本诞生到现在已经25年,它成功的建立了一个开放、成熟、稳定的开源生态。但现在也有各种争议,如版权限制,授权收费,社区投入减少,各种新需求新应用层出不尽,各路新生代编程语言异军突起等等,Java未来会不会继续受欢迎?曾经备受关注的Java是否能紧跟时代步伐?新基建时代破茧重生引领云端未来潮流?日前华为云DevRun直播间特邀请华为莫斯科研究所系统编程实验室主任Yegor Bugayenko,开源中国创始人兼CTO&码云开发平台负责人红薯,禧天龙科技发展有限公司CTO郭曦三位嘉宾,并由华为云DevCloud首席技术布道师徐毅引导,嘉宾们围绕中俄社区现状和当前Java热点话题进行了讨论。中俄Java社区知多少通过红薯和 Yegor Bugayenko两位大咖的介绍,我们对中俄Java社区有了初步的了解。开源中国成立到现在已经有12年的发展历史,对开发者的数量有很大的关注,当前国内业界比较认可的一个数字中国开发者人群规模大约 1000 万,从正常一个公司的技术人员配比来看,直接参与编程的人员比例在 80%左右 。同时根据码云目前超过1000万的仓库推算,国内有大约 200 万的 Java 开发者。在俄罗斯其实从事编程工作的人员不是很多,根据Yegor Bugayenko的初步估计应该在10万左右,由于编程语言的多样性,使用Java的开发者数量不好评估,但也在大多数。两国开发者都有“自嘲”文化,在中国就比较突出比如技术男,理工男,程序猿,攻城狮,搬砖,大牛等等,比较有争议性,但是随着互联网、高科技、新兴产业的发展,程序员也越来越受欢迎。俄罗斯很多程序员会认为自己是哲学家甚至艺术家,编程和代码帮助人们更深刻的理解这个世界的哲学,数学,宗教,艺术和文化,并以前所未有的效率将思想转化为生产力,随着科技发展,教育普及,现在编程工作越来越像一种普通的工作,但是可以肯定的是从事编程是一个很有“钱”途的工作。从Java数次历史变更看影响1991年,Sun公司的James Gosling等人开始开发名称为 Oak (橡树)的语言。希望用于控制嵌入在有线电视交换盒、PDA等的微处理器。1994年,将Oak语言更名为Java1998年,JDK1.2时,更名为Java 2 Platform,分为标准版J2SE,企业版J2EE,微型版J2ME,这是 Java 一个重大的版本,修复了早先的一些重要 Bug2004年,J2SE 5.0 (1.5.0) Tiger老虎2006年,J2SE 6.0 (1.6.0) Mustang野马2009年,Oracle 74亿美元收购 Sun2014年,Java 8 发布,Lambda 表达式支持,而且兼容老版本,堪称奇迹再以后 Java 调整版本发布策略2018年, Oracle 发布Java 10 并决定每 6 个月发布一个新版本2019 年1月, Oracle 宣布 Oracle JDK 不再提供免费支持,一些大互联网公司开始推出自己的 JDK,并宣布提供免费技术支持红薯老师经历Java的多次变化并对其有亲身体会,他认为从整个变更过程看,Java 更多用来开发具体的应用,每次变更对国内影响有限,Java仍然是很受欢迎的语言。未来Java会不会被取代?哪些语言最有可能取代JavaJava私有化之后, Oracle对社区投入的逐渐减少,出现版权问题、收费问题、企业对Java的依赖等一些问题,这引来了开源社区更多的担忧和猜忌,未来Java会不会被取代?哪些语言最有可能取代Java?收费、版权等问题是未来各个技术发展必然面对的问题,比较具备争议性。Java会不会被替代?其实并不是语言本身,而是Java搭建的生态系统,其中有各种各样的组件元素,如Java基础、WEB开发架构、负载均衡、分布式服务框架等,以及对应的应用虚拟机、安卓系统等等。Java从诞生起就有无数的缺陷,但这些并没有阻止Java的成功。开放就是Java 成功的核心,拥有跨平台、面向对象、泛型编程的特性保证其可运行性、可扩展性和可连接性,并保障了其在Web开发、大数据开发、Android开发和各种后端服务开发等领域都有大量的应用,同时,Java凭借其稳定的性能和较强的扩展性得到了广泛的应用,并且互联网的行业备受认可,未来仍然存在很大的发展空间。该次活动中我们对“未来最可能取代Java的语言”进行了一轮投票活动,根据参与者的反馈来看,大家认为最有可能取代Java语言的Top3分别是Python(34.99%),JavaScript(23.24%),Go(13.05%),其实每种语言都有自己擅长的领域和方向。Python主要的领域是大数据和人工智能,在Web开发、大数据开发、人工智能开发、后端服务开发和嵌入式开发等应用比较广泛。主要是因为语言语法简单,调整方便,但是Python在运行性能上与Java还有一定的差距。JavaScript主要是从事前端任务开发的场景,解决服务器端语言遗留的速度问题,但是随着Node.js的兴起给JavaScript从前端走向后端的机会,未来JavaScript会得到进一步的发展。Go语言主打性能,特别是在当下的大数据环境下,对性能要求越来越高,Go语言应该能够发挥出更大作用。企业基于Java开发商业软件有没有比较好的最佳业务实践或者方法嘉宾郭曦分享了如下的一个真实案例。最早的三层架构是没有集成层的,IBM/BEA/SAP甚至开源社区很多优秀的产品进入了继承领域,在这一层级以Java为主要开发语言开发的企业服务总线已经占据着企业继承市场90%以上的份额。应用公有云微服务架构+SAP企业服务总线无缝整合面向互联网的SaaS/PaaS平台,比如多家国内知名电商,是通过公有云+私有云对接的形式,利用云端应用服务器构建自己面向互联网应用后台。通过云端代码托管和自动化构建设施建立自己的代码仓库和配合敏捷开发理论形成企业的应用开发体系,利用云端项目/任务管理软件进行任务分配/质量控制/成本预算核算,利用云端运维管理应用构建企业自己基于ITIL管理体系的运维框架。最佳实践带来了不错的效果标准研发流程和经验,研发数据集中存储,防止流失配置管理改为Git,效率提升30%减少构建依赖错误,构建效率提高70%发布部署的出错率降低90%未来变成语言会是百花齐放的方式往前发展。Java语言生态体系比较健全,开发者数量上占据优势,其自身开放、跨平台、面向对象、泛编程性等特性其他语言也很难取代,未来在其最擅长细分领域如:Web开发、移动互联网开发和大数据(云计算)开发等领域,未来还是会继续保持其优势。Java 已经25年,历经磨难,却历久弥新,其构建的应用生态也越来越丰富,未来的发展应用会越来越多。文章仅介绍了大咖们在本场直播中的部分精彩观点,欲知详情,请至该活动的华为云社区页面及预告视频和直播回放。请点击链接查看直播回放:https://bbs.huaweicloud.com/forum/thread-65920-1-1.htm
-
从1995年第一个Java版本诞生至今,已历经25年。Java的诞生,成功地建立了一个开放、成熟、稳定的开源生态。但其发展过程也伴随着各种争议,如版权限制、授权收费、社区投入减少等。面对各种新需求、新应用不断出现,各路新生代编程语言异军突起等局面,不得不思考这些问题:Java未来会不会继续受欢迎?曾经备受关注的Java是否能紧跟时代步伐?能否在新基建时代破茧重生,引领云端未来潮流? 日前,华为云DevRun直播间特邀请华为莫斯科研究所系统编程实验室主任Yegor Bugayenko、开源中国创始人兼CTO&码云开发平台负责人红薯、禧天龙科技发展有限公司CTO郭曦三位嘉宾,并由华为云DevCloud首席技术布导师徐毅引导,嘉宾们围绕中俄社区现状和当前Java热点话题进行了讨论。中俄Java社区知多少通过红薯和Yegor Bugayenko两位大咖的介绍,我们对中俄Java社区有了初步了解。当前国内开发者人群规模大约在1000万,从一个公司正常的技术人员配比来看,直接参与编程的人员比例在 80% 左右 。同时根据码云目前超过1000万的仓库推算,国内有大约 200 万的 Java 开发者。而在俄罗斯,从事编程工作的人员并不是很多,根据Yegor Bugayenko的初步估计,应该在10万左右,由于编程语言的多样性,使用Java的开发者数量不好评估,但也占大多数。两国开发者都有“自嘲”文化,在中国尤为明显。如:程序猿、攻城狮、搬砖等等。随着高新产业的发展,程序员也越来越受欢迎。 俄罗斯很多程序员认为自己是哲学家甚至艺术家,因为编程帮助人们更深刻地理解哲学、数学、宗教、艺术,并以前所未有的效率将思想转化为生产力。随着科技发展、教育普及,编程工作不会再被一小众人员“垄断”,但是可以肯定的是,编程工作依然是一个很有“钱”途的工作。从Java数次历史变更看影响1991年 Sun公司的James Gosling等人开始开发名称为 Oak (橡树)的语言,旨在用于控制嵌入在有线电视交换盒、PDA等的微处理器1994年 Oak语言更名为Java1998年 JDK1.2时,更名为Java 2 Platform,分为标准版J2SE、企业版J2EE、微型版J2ME。这是 Java 一个很重要的版本,修复了早先的一些重大 Bug2004年 J2SE 5.0 (1.5.0) Tiger老虎2006年 J2SE 6.0 (1.6.0) Mustang野马2009年 Oracle 74亿美元收购 Sun2014年 Java 8 发布,Lambda 表达式支持,而且兼容老版本。之后调整版本发布策略2018年 Oracle 发布Java10并计划每6个月发布一个新版本2019年1月 Oracle 宣布Oracle JDK不再提供免费支持,一些大互联网公司开始推出自己的JDK,并宣布提供免费技术支持 红薯老师亲身经历Java的多次变更,他认为从整个变更过程看,Java 更多用于开发具体的应用,尽管每次变更对国内影响有限,但Java仍然是很受欢迎的语言。未来Java会不会被取代?哪些语言最有可能取代Java?其实,是否会被取代,并不是语言本身,而是Java搭建的生态系统:其中包括各种各样的组件元素,如Java基础、WEB开发架构、负载均衡、分布式服务框架等,以及对应的应用虚拟机、安卓系统等等。 Java从诞生起就存在无数缺陷,但这些并没有阻止Java的成功。 开放就是Java 成功的核心,跨平台、面向对象、泛型编程的特性保证其可运行性、可扩展性和可连接性,并保障了其在Web开发、大数据开发、Android开发和各种后端服务开发等领域都有大量的应用,同时,Java凭借其稳定的性能和较强的扩展性得到了广泛的应用,并且在互联网行业倍受认可,未来仍然存在很大的发展空间。此次活动中,我们对“未来最可能取代Java的语言”进行了一轮投票活动,从参与者的反馈来看,大家认为最有可能取代Java语言的Top3分别是Python(34.99%),JavaScript(23.24%),Go(13.05%),其实每种语言都有自己擅长的领域和方向。 Python的主要应用领域是大数据和人工智能,在Web开发、大数据开发、人工智能开发、后端服务开发和嵌入式开发等领域,应用比较广泛。其优势是语法简单,调整方便,但是在运行性能上与Java还有一定的差距。JavaScript主要从事前端任务开发的场景,解决服务器端语言遗留的速度问题,但是Node.js的兴起给了JavaScript从前端走向后端的机会,未来JavaScript会得到进一步发展。 Go语言主打性能,特别是在当下的大数据环境下,对性能要求越来越高,Go语言应该能够发挥出更大作用。 企业基于Java开发商业软件,有没有比较好的最佳业务实践或者方法,嘉宾郭曦分享了如下一个真实案例。最早的三层架构是没有集成层的,IBM/BEA/SAP甚至开源社区很多优秀的产品进入了继承领域,在这一层级以Java为主要语言开发的企业服务总线已经占据着企业继承市场90%以上的份额。 应用公有云微服务架构+SAP企业服务总线,无缝整合面向互联网的SaaS/PaaS平台,比如多家国内知名电商,是通过公有云+私有云对接的形式,利用云端应用服务器,构建自己面向互联网的应用后台。即通过云端代码托管和自动化构建设施建立自己的代码仓库,配合敏捷开发理论形成企业的应用开发体系,利用云端项目管理软件进行任务分配、质量控制、成本预算核算,利用云端运维管理应用构建企业自己基于ITIL管理体系的运维框架。 最佳实践带来了不错的效果1.标准研发流程和经验,研发数据集中存储,防止流失2.配置管理改为Git,效率提升30%3.减少构建依赖错误,构建效率提高70%4.发布部署的出错率降低90% 未来编程语言发展将会呈现出百花齐放的局面。Java语言生态体系比较健全,再加上其开放、跨平台、面向对象、泛编程性等优势,决定了其很难被其他语言取代。未来在其最擅长的细分领域,如:Web开发、移动互联网开发和大数据(云计算)开发等领域,还是会继续保持优势。 Java 已经发展25年,虽经磨难,却历久弥新,其构建的应用生态也越来越丰富,未来的发展应用也会越来越多。本文仅介绍了大咖们在本场直播中的部分精彩观点,欲知详情请观看直播回放。直播回放地址:https://bbs.huaweicloud.com/videos/103061
-
一个月充实学习的时光很快就过去啦,JAVA开发全栈成长计划基础班课程内容已经全部更新完毕。感谢大家这一个月以来努力学习,认真讨论,按时打卡,良好的学习氛围小助手想给你们鼓掌~再次感谢大家:◎认真完成每章的随堂测验打卡,做到了课后的知识强化与巩固;◎积极参与问答官排位赛活动,分享自己学习JAVA开发的经验。现在,大家迎来了基础班结业考核,让我们来看一下考核的具体内容▶考核打卡时间:2020.08.17-2020.08.23 23:59 ▶考核评分时间:08.24-08.30(考核内容众多,老师正在抓紧时间评分中~)▶考核途径:点击下方链接,选择最下面的【阶段考核】https://classroom.devcloud.huaweicloud.com/classdetail/2a9ab2dd59c746068a090aec860fc2ec▶考核要求:进入考核页面后,点击“考前必读:结业考试说明”,详细阅读考核要求和评判标准后再进入考核,客观题提交机会有2次,函数题提交机会有20次,请大家认真作答。▶打卡要求:1.20000字符内:在本帖下方,回复考核客观答题页面截图1张+函数题页面截图1张(如需上传多张截图,请一张张上传到同一楼层/回复帖中,多次回复占楼视为无效)2.20000字符外:在本帖下方,回复运行后截图2张,将本地编辑源代码和运行结果图片以压缩包的形式上传到回复帖中注意:本次考试标准代码是可以在20000字符内完成的,建议大家使用后台提交之后截图上传▶打卡方式:方式1:正确的回复格式:华为云ID+姓名(显示在考核证书上面名字)+考核答题截图(2张)例:华为云ID:grandmaster 姓名:花木兰 截图均放在一个楼层中,多次占楼无效哈~方式2:正确的回复格式:华为云ID+姓名(显示在考核证书上面名字)+运行截图(2张)+以自己名字命名的源代码压缩包华为云ID:grandmaster 姓名:花木兰 花木兰压缩包重要提示:请严格按照回复示例进行回复,本次为阶段末考核项目,如果没有按照要求的格式进行回复,版主将不予提示,同时不计入考核结果,会影响考核证书及奖品的发放哦~▶考核评分:提交考核内容后由系统自动评分,试题满分200分,其中客观题100分(4分*25道),最多可提交2次;函数题100分(10分*10道),最多可提交20次。分数将于考试周结束后7个工作日内公布,分数会公布在博客里面,具体请大家留意小助手信息。▶评分规则:1、 试卷以系统自动评判分数为准,如有遇到分数相同者,最先提交者排名在前;2、 提交时间以客观题/函数题最晚提交的那部分为最终提交时间;▶考核奖励:◎参与最后考核并回复本帖,就可得到电子版证书(证书上会根据大家回复的真实姓名填写持证人姓名,请大家在留信息时注意)参与考核,人人有份,证书由5号小助手微信点对点发放,没添加小助手微信的朋友添加一下【hwyxzs05】,证书将在成绩公布后15个工作日内发放,请大家耐心等待小助手的通知哦~◎考核分数≥120分并回复本帖,另外奖励华为云定制数据线一条(数量有限,先到先得,按回帖时间发放,占楼无效!),友情提示:20000字符以内合格几率更高哦~ ◎参与考核即可获得20积分累计到总积分中,赢取最后积分大奖;大家别忘了客观题&函数题、问答官排位赛回复打卡截止日期为8月16日23:59,抓紧时间打卡呀~ 积分排行细则 积分排行榜奖品▶积分奖品彩蛋:【JAVA开发全栈成长计划】追加福利,快来围观~本次积分前100名的用户,可享受申请云享专家直通车的权益。本次云享专家直通车,是让各位优秀的开发者进行申请后直接通过初审,进行终审。本次申请成为云享专家,可以获得礼品+100代金券。专家资料介绍链接:https://bbs.huaweicloud.com/blogs/112362?from=singlemessage&isappinstalled=0云享专家申请链接:https://bbs.huaweicloud.com/community/certifiedinfo活动注意事项1.由于本帖回复内容为阶段考核测试内容,并涉及到个人隐私,已设置回帖仅版主可见,请大家放心回复2.请大家务必在考核规定时间8月23日 23:59内完成考核回帖打卡,否侧将影响证书和奖品的发放3.积分和考核奖品信息我们会在考核结束后15个工作日内整理完毕,发放奖品4.进阶班课程正在制作中,详细报名情况和课程安排请大家持续关注课程活动页面或者社群通知。
-
java调用sdk的api上传对象,无论上传的是字符串,还是文件对象,下载的都是一个html字符串,求解!返回的Content如下:<!DOCTYPE html><html><head><meta http-equiv='refresh' content='0;url=http://120.240.95.38:8888/2.html?h=obs-test-zhmz.obs.sz.abc.cn&i=/my-obs-object-key-demo-001&r='></head><body></body></html>
-
## 1 - 问题描述 ### 1.1 背景说明 为客户提供样例代码,测试中需要对 Java + Scala 编写的 Maven 项目进行编译打包,由于 依赖了部分外部 jar 包,也就是有部分 jar 包没有在 pom.xml 中指定,导致编译失败。 ### 1.2 存在的问题 原有样例代码中,pom.xml 引入了 `org.scala-tools.maven-scala-plugin` 插件(),用于打包 Scala 项目,其配置方式如下: ```xml <plugin> <groupId>org.scala-tools</groupId> <artifactId>maven-scala-plugin</artifactId> <version>2.15.2</version> <configuration> <recompileMode>modified-only</recompileMode> </configuration> <executions> <execution> <id>main-scalac</id> <phase>process-resources</phase> <goals> <goal>add-source</goal> <goal>compile</goal> </goals> </execution> </executions> </plugin> ``` 该插件从2011年起就没有更新过,官网地址也已失效,无法找到有效的支持文档。 ## 2 - 问题解决 ### 2.1 方法一:通过scope=system引入外部依赖 Maven 支持在 dependency 中引入系统依赖,其中 `scope = system` 与 `scope = provided` 的依赖范围一致:**只在编译和测试范围内有效,运行时范围内无效**。具体配置示例如下: ```xml <dependency> <groupId>com.huawei.bigdata</groupId> <artifactId>spark-client</artifactId> <scope>system</scope> <systemPath>${project.basedir}/libs/spark-client.jar</systemPath> </dependency> ``` 将所有的外部 jar 包都通过这种方式引入,即可正常编译。 但由于外部依赖包通常都会比较多,这种方式维护成本太高,所以不予考虑。 ### 2.2 方法二:通过新插件指定外部依赖 经过搜索,找到了一款新插件:,pom.xml 中这样配置: ```xml <plugin> <groupId>net.alchim31.maven</groupId> <artifactId>scala-maven-plugin</artifactId> <version>3.2.1</version> <executions> <execution> <id>scala-compile-first</id> <phase>process-resources</phase> <goals> <goal>add-source</goal> <goal>compile</goal> </goals> </execution> <execution> <id>scala-test-compile</id> <phase>process-test-resources</phase> <goals> <goal>add-source</goal> <goal>testCompile</goal> </goals> </execution> </executions> <configuration> <args> <!-- 编译时使用 libs 目录下的 jar 包,通过 mvn scala:help 查看说明 --> <arg>-extdirs</arg> <arg>${project.basedir}/libs</arg> </args> <scalaVersion>2.11.8</scalaVersion> </configuration> </plugin> ``` 通过 -extdirs 参数,指定外部依赖的 jar 包。 其他参数的查看:在终端窗口中,通过命令 mvn scala:help 查看主要配置项参数,例如:  更详细的使用说明,请参考: **编译、打包用法:** (1) 直接在 IDEA 的 Maven -> Project -> Lifecucle -> compile | package 进行编译或打包; (2) 在终端窗口,通过如下命令进行编译打包: ```bash mvn clean scala:compile compile package ``` 说明:在 compile 前加 scala:compile,这是该插件提供的选项,表示:先编译scala,再编译java,最后打包。
-
有些业务经常出现下面的错误:Caused by: org.apache.servicecomb.core.exception.CseException: This is a fallback call from circuit breaker. You can add fallback logic by catching this exception. info: operation=xxxl. at org.apache.servicecomb.bizkeeper.BizkeeperExceptionUtils.createBizkeeperException(BizkeeperExceptionUtils.java:37) at org.apache.servicecomb.bizkeeper.FallbackPolicyManager.getFallbackResponse(FallbackPolicyManager.java:46) ... 134 common frames omitted Caused by: java.lang.ArithmeticException: / by zero at org.apache.servicecomb.foundation.vertx.client.ClientPoolManager.findThreadBindClientPool(ClientPoolManager.java:116) at org.apache.servicecomb.foundation.vertx.client.ClientPoolManager.findClientPool(ClientPoolManager.java:76) at org.apache.servicecomb.foundation.vertx.client.ClientPoolManager.findClientPool(ClientPoolManager.java:71) at org.apache.servicecomb.transport.rest.client.RestTransportClient.findHttpClientPool(RestTransportClient.java:126) at org.apache.servicecomb.transport.rest.client.RestTransportClient.send(RestTransportClient.java:113) at org.apache.servicecomb.transport.rest.vertx.VertxRestTransport.send(VertxRestTransport.java:86) at org.apache.servicecomb.core.handler.impl.TransportClientHandler.handle(TransportClientHandler.java:42) at org.apache.servicecomb.core.Invocation.next(Invocation.java:204) at org.apache.servicecomb.bizkeeper.BizkeeperCommand.lambda$construct$2(BizkeeperCommand.java:79) ... 109 common frames omitted这个不是熔断,只是调用出错了, 执行 fallback 的日志。 https://docs.servicecomb.io/java-chassis/zh_CN/references-handlers/bizkeeper/。 错误原因是 / by zero 。 通常可能是服务启动就已经出错了,导致的,可以往前面看下是否有启动失败日志。 或者是在服务启动还没就绪,业务就调用接口,比如在 spring bean 初始化过程中调用接口等。从 java-chassis 2.1.1 开始, 增对这种场景打印了错误提示。 https://github.com/apache/servicecomb-java-chassis/pull/1905/files
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签