Java熟练学习的8项技能学生必看
Java8种值得学习优秀技能
1 Git
Git 是 Java 开发人员需要掌握的基础工具之一,每一位 Java 从业者都应该学会用它。Git 使用一套版本控制系统来管理各种项目集合。这是一个完全免费的开源系统,专注干非线性工作流、完整性和速度。分布式扩展:存储库可用来创建开发历史的副本。链接方法: Git 具有基于工具箱的设计,可提供定义明确的模型。
基干工具箱的设计:基于工具箱的设计可减少复合组件。
分布式扩展: 存储库可用来创建开发历史的副本。链接方法:Git 具有基于工具箱的设计,可提供定义明确的模型。
基干工具箱的设计:基于工具箱的设计可减少复合组件。
2Selenium
Java 中的 Selenium Web 驱动程序是 Java 开发人员在 2021 年应该了解的重要技术之一。
Selenium 提供了使用测试框架测试 Web 应用程序的一组工具; Selenium Web 驱动提供了一个开源API。它包括了用于 Web 应用程序的一些自动化特性。Selenium 的关键元素包括:
IDE(集成开发环境)
远程控制 /Selenium10
Web 控制器 /Selenium20/30
Selenium网格
3Jenkins
Jenkins 是源自 JAVA 编程的技术,其开源自动化的持续交付和集成可以自动化软件开发流程,支持多种版本控制工具。
Jenkins的插件可与另一种语言编写的代码集成。以下是你应该选择 Jenkins 的三大原因: 它提供了比其他软件更好的质量;其自动化系统可以管理集成;Jenkins的开发速度要快得多。
4用户友好的 Web 服务
REST 的全称是Representative Translation ofState(表述性状态转移),它代表了一种架构风格,是Java 开发人员必须掌握的知识。它提升了 Web 服务性能,还定义了可伸缩性和性能约束。这是 2022年Java 开发人员最理想的选项之一。
它的可重建 API用于 Web 服务开发中的通信需求。如果你了解 HTML、CSS 等,那么你将从RESTfulWeb 服务中获益匪浅。以下是 RESTful 服务的特性:
基干客户端 - 服务器的架构提供了服务器的管理、部署和托管等特性,还可以帮助用户使用服务和资源。它本质上是一种共享资源的共享计算模型。
5 Spring security
它的主要功能是应用程序身份验证。其 J2EE servlet规范和 EJB规范是JAVA 开发人员常用的两个关键安全特性。
Spring Security 支持多种身份验证模型,并与HTTP、Kerberos、JOSSO、CAS、LDAP 等技术集成。Spring Security 与 Java 深度关联,强烈建议Java 开发人员学习它。
6SpringBoot2
Spring Boot 发布了一个名为 Spring Boot 2的新版本。其中 Spring 框架负责控制,Spring Boot 负责生成具有常规配置的独立解决方案。
它主要依赖JAVA Baseline、BOM 材质和 cradle插件,其自动配置可提供安全性和响应性。它还提供了技术支持并改善了开发体验。它是 JAVA 程序员应了解的基本工具之一,其关键特性包括:
直接部署 Undertow、Jetty 或 Tomcat
减少构建配置,提供依赖项
在 Spring 中创建独立的应用程序
7Angular 或响应式 JS
ReactJS 是一个专门用于 UI开发的 JavaScript库,而 Angular 是一个框架。JAVA 开发人员应该很熟悉这两大关键技术了。微信搜索readdot,关注后回复编程资源,领取各种经典学习资料
Angular 2是开源 We 应用程序框架,Angular 的主要特性包括指令、范围、模板、注解、高级依赖项注入和子路由器: ReactJS 用于开发移动应用程序。ReactJS的主要特性包括与服务器的免费开源侧通信功能等。
8ApacheSpark 和 Kafka
Apache Spark 和 Kafka 是2021年Java开发人员一定要掌握的两项技术;它们在 2018 年底已发布稳定版本。Apache Spark 是用于集群计算的框架已开源。
Spark 提供了用于执行基本 1/0、调度和分派等任务的应用程序接口,并提供了同样开源的流处理平台。特别要提的是 Apache Kafka 代码是 Java 和 Scala 编写的。
Kafka 可以使用一些基本 API,例如 Producer APIConsumer APl、Connector API 和 Stream APl。
Caused by: orgspringframeworkdataredisRedisConnectionFailureException: Could not get a resource from the pool; nested exception is redisclientsjedisexceptionsJedisConnectionException: Could not get a resource from the pool
at orgspringframeworkdataredisconnectionjedisJedisExceptionConverterconvert(JedisExceptionConverterjava:67)
at orgspringframeworkdataredisconnectionjedisJedisExceptionConverterconvert(JedisExceptionConverterjava:41)
at orgspringframeworkdataredisPassThroughExceptionTranslationStrategytranslate(PassThroughExceptionTranslationStrategyjava:37)
at orgspringframeworkdataredisconnectionjedisJedisClusterConnectionconvertJedisAccessException(JedisClusterConnectionjava:3999)
at orgspringframeworkdataredisconnectionjedisJedisClusterConnectionsetEx(JedisClusterConnectionjava:717)
at orgspringframeworkdatarediscoreDefaultValueOperations 11doInRedis(DefaultValueOperationsjava:186)
at orgspringframeworkdatarediscoreRedisTemplateexecute(RedisTemplatejava:207)
at orgspringframeworkdatarediscoreRedisTemplateexecute(RedisTemplatejava:169)
at orgspringframeworkdatarediscoreAbstractOperationsexecute(AbstractOperationsjava:91)
at orgspringframeworkdatarediscoreDefaultValueOperationsset(DefaultValueOperationsjava:182)
at iorenrencommonutilsSuppleDataUtilsprovideIcc(SuppleDataUtilsjava:107)
at iorenrenmodulesjobtaskTaskIcctaskFour(TaskIccjava:242)
10 common frames omitted
Caused by: redisclientsjedisexceptionsJedisConnectionException: Could not get a resource from the pool
at redisclientsutilPoolgetResource(Pooljava:53)
at redisclientsjedisJedisPoolgetResource(JedisPooljava:226)
at redisclientsjedisJedisSlotBasedConnectionHandlergetConnectionFromSlot(JedisSlotBasedConnectionHandlerjava:66)
at redisclientsjedisJedisClusterCommandrunWithRetries(JedisClusterCommandjava:116)
at redisclientsjedisJedisClusterCommandrunWithRetries(JedisClusterCommandjava:141)
at redisclientsjedisJedisClusterCommandrunWithRetries(JedisClusterCommandjava:141)
at redisclientsjedisJedisClusterCommandrunWithRetries(JedisClusterCommandjava:141)
at redisclientsjedisJedisClusterCommandrunWithRetries(JedisClusterCommandjava:141)
at redisclientsjedisJedisClusterCommandrunBinary(JedisClusterCommandjava:60)
at redisclientsjedisBinaryJedisClustersetex(BinaryJedisClusterjava:268)
at orgspringframeworkdataredisconnectionjedisJedisClusterConnectionsetEx(JedisClusterConnectionjava:715)
18 common frames omitted
Caused by: redisclientsjedisexceptionsJedisConnectionException: javanetSocketTimeoutException: connect timed out
at redisclientsjedisConnectionconnect(Connectionjava:207)
at redisclientsjedisBinaryClientconnect(BinaryClientjava:93)
at redisclientsjedisBinaryJedisconnect(BinaryJedisjava:1767)
at redisclientsjedisJedisFactorymakeObject(JedisFactoryjava:106)
at orgapachecommonspool2implGenericObjectPoolcreate(GenericObjectPooljava:868)
at orgapachecommonspool2implGenericObjectPoolborrowObject(GenericObjectPooljava:435)
at orgapachecommonspool2implGenericObjectPoolborrowObject(GenericObjectPooljava:363)
at redisclientsutilPoolgetResource(Pooljava:49)
28 common frames omitted
Caused by: javanetSocketTimeoutException: connect timed out
at javanetDualStackPlainSocketImplwaitForConnect(Native Method)
at javanetDualStackPlainSocketImplsocketConnect(DualStackPlainSocketImpljava:85)
at javanetAbstractPlainSocketImpldoConnect(AbstractPlainSocketImpljava:350)
at javanetAbstractPlainSocketImplconnectToAddress(AbstractPlainSocketImpljava:206)
at javanetAbstractPlainSocketImplconnect(AbstractPlainSocketImpljava:188)
at javanetPlainSocketImplconnect(PlainSocketImpljava:172)
at javanetSocksSocketImplconnect(SocksSocketImpljava:392)
at javanetSocketconnect(Socketjava:589)
at redisclientsjedisConnectionconnect(Connectionjava:184)
35 common frames omitted
最近在本地测试通过springboot基础redis的方式连接redis集群,启动的时候没有报错。
到时当执行保存,查询到redis的操作的时候,报上面的错误。
首先看到错误信息,先是connect timed out后,再出现的Could not get a resource from the pool错误。一开始排查这个错误,由于使用的是默认连接池,debug的时候,也看到有装载连接池,为啥报错呢。本地通过redis-manger工具,连接集群地址也可以连接访问。从日志也看不出还有其他的错误信息。
于是自己写了main方法直接操作JedisCluster的方式来测试,出现的错误跟上面全文一样。用抓包工具wireshark过滤集群的地址,查看连接的消息也是正常的。
另外一个项目使用的reddison客户端,于是测试了deamo用reddison来连接集群地址,启动的时候,发现报如下错误
乖乖,恍然大悟;102871731地址是服务器的内网地址,本机是连不上内网地址的,只有通过外网地址连接。而我配置的是外网地址。然而,客户端在集群同步和心跳检查的时候,是拉取的集群信息,redis集群信息里面的节点的信息
配置的是内网地址。客户端就通过这个内网地址来同步信息了。
再次同wireshark过滤集群102871731,发现有大量的超时重传的包,也没有响应。
可能是使用程序中的redis代码执行了更换数据库的操作,而不是使用默认的0号数据库使用monitor命令监听程序执行的redis操作,找到使用的数据库序号,再使用select命令切换去相应数据库,使用keys命令就可以查看到程序插入的key
Java提高千倍效率小技巧
1、尽量指定类、方法的final修饰符
带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如javalangString,整个类都是final的。为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写。如果指定了一个类为final,则该类所有的方法都是final的。Java编译器会寻找机会内联所有的final方法内联对于提升Java运行效率作用重大,具体参见Java运行期优化。此举能够使性能平均提高50%。
2、尽量重用对象。
特别是String对象的使用,出现字符串连接时应该使用StringBuilder/StringBuffer代替。由于Java虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理,因此,生成过多的对象将会给程序的性能带来很大的影响。
3、尽可能使用局部变量。
调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中速度较快,其他变量,如静态变量、实例变量等,都在堆中创建,速度较慢。另外,栈中创建的变量,随着方法的运行结束,这些内容就没了,不需要额外的垃圾回收。
4、及时关闭流。
Java编程过程中,进行数据库连接、I/0流操作时务必小心,在使用完毕后,及时关闭以释放资源。因为对这些大对象的操作会造成系统大的开销,稍有不慎,将会导致严重的后果。
5、慎用异常。
异常对性能不利。抛出异常首先要创建一个新的对象Throwable接口的构造函数调用名为filllnStackTrace(的本地同步方法,filllnStackTrace()方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,Java虚拟机就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。异常只能用于错误处理,不应该用来控制程序流程。
6、不要在循环中使用try··catch·,应该把其放在最外层
除非不得已。如果毫无理由地这么写了,只要你的领导资深一点、有强迫症一点,八成就要骂你为什么写出这种垃圾代码来了。
7、不要将数组声明为public static final。
因为这毫无意义,这样只是定义了引用为static final数组的内容还是可以随意改变的,将数组声明为public更是一个安全漏洞,这意味着这个数组可以被外部类所改变。
8、尽量在合适的场合使用单例。
使用单例可以减轻加载的负担、缩短加载的时间、提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面
(1)控制资源的使用,通这线程同步来控制资源的并发访问;
(2)控制实例的产生,以达到节约资源的目的;
(3)控制数据的共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信
9、及时清除不再需要的会话。
为了清除不再活动的会话,许多应用服务器都有默认的会话超时时间,一般为30分钟。当应用服务器需要保存更多的会话时,如果内存不足,那么操作系统会把部分数据转移到磁盘,应用服务器也可能根据MRU(最近最频繁使用)算法把部分不活跃的会话转储到磁盘,甚至可能抛出内存不足的异常。如果会话要被转储到磁盘那么必须要先被序列化,在大规模集群中,对对象进行序列化的代价是很昂贵的。因此,当会话不再需要时应当及时调用HttpSession的invalidate()方法清除会话
10、使用同步代码块替代同步方法。
这点在多线程模块中的synchronized锁方法块一文中已经讲得很清楚了,除非能确定一整个方法都是需要进行同步的,否则尽量使用同步代码块,避免对那些不需要进行同步的代码也进行了同步,影响了代码执行效率。
11、将常量声明为static final,并以大写命名
这样在编译期间就可以把这些内容放入常量池中,避免运行期间计算生成常量的值。另外,将常量的名字以大写命名也可以方便区分出常量与变量
以Tomcat6 jre6 Ubuntu为例
第一、集群中所有的服务器要时间同步
不同组内服务器的时间差不但影响session过期判断,时间差过大时,根本就无法建立集群。Linux下同步时间通常采用ntp协议。可以在每个服务器上增加自动运行脚本文件,每天时间服务器自动同步,如/etc/crondaily下增加脚本,内容为
Sh代码
/usr/sbin/ntpdate -s timenistgov
第二、修改需要同步的应用web应用的配置文件webxml,增加应用的分步标识,即在web-app结点下增加:
Xml代码
<distributable/>
第三、为实现会话自动在组内服务器迁移,所有放在session里的对象都要实现javaioSerializable接口
第四、打开tomcat下serverxml的注释,这是一种最简单的集群配置方式,适合组内服务器数量不多的情况(少于10台)
Xml代码
<Cluster className="orgapachecatalinahatcpSimpleTcpCluster"/>
第五、各台服务器上,通过javanetInetAddressgetLocalHost()getHostAddress()一定能够获得非127001的ip地址,用来收听集群消息。
可用以下代码进行测试
Java代码
public class test {
public static void main(String[] args) throws Exception {
Systemoutprintln("ip:"+javanetInetAddressgetLocalHost()getHostAddress());
}
}
将上面的代码保存成testjava
在相应的机器上执行
0条评论