首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

月薪20K的java程序员也必须要注意的那些事项

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。

给你学习路线:html-css-js-jq-javase-数据库-jsp-servlet-Struts2-hibernate-mybatis-spring4-springmvc-ssh-ssm

最近在做的一个项目需要使用多线程Java应用程序与服务器上的Oracle数据库频繁进行数据交互。开发完成后,我们重新进行了多次安全性检查,具体项目如下:

1、在多线程调用,特别是循环调用时,实例化的preparedStatement变量必须在使用后或下一次实例化之前进行关闭操作,必要时还需要将该变量置空,帮助JVM进行垃圾回收。

如果不及时对使用过的资源进行关闭和回收,ps与数据库建立的连接不会自动得到释放,导致程序报错:ORA-01000: maximum open cursors exceeded 或者干脆不报错,返回空的查询结果等等。

2、与及时关闭ps的原理类似,线程中对数据库进行的UPDATE,INSERT和DELETE等操作必须及时commit。由于Oracle数据库在commit时会将同一张表的非查询访问串行化,不及时commit可能导致锁表等严重后果。这里出现的锁表在日志上显示的十分尴尬,一般为彻底卡死,不报错,不执行finally代码段,也看不到任何后续输出。

然而,过分迅速的commit往往也不是好事,当一个线程中的其他程序出错时,数据库操作的回滚显得十分必要。它在一定程度上避免了错误的数据库交互,增加了代码逻辑的鲁棒性。一般来说,可以使用下列操作:

首先,获取一个数据库连接,保存该连接之前的isAutoCommit属性,将当前的autoCommit属性设置为false。当确定线程中所有代码依预定逻辑正确执行时,commit该连接,并将其isAutoCommit属性恢复到之前的状态。

关于怎么快速学java,有什么方法,这个问题,想必大家都已经心中有数了,打算深入了解这个行业的朋友,可以加下小编的java学习群:498+691+053,不管你是小白还是大牛,小编我都欢迎,不定期分享干货,包括小编自己整理的一份2018最新的java资料和0基础入门教程,欢迎初学和进阶中的小伙伴。

每天晚上20:00我都会开直播给大家分享java学习知识和路线方法,群里会不定期更新最新的教程和学习方法(进群送2018java学习教程),大家都是学习java的,或是转行,或是大学生,还有工作中想提升自己能力的前端党,如果你是正在学习java的小伙伴可以加入学习。最后祝所有程序员都能够走上人生巅峰,让代码将梦想照进现实,非常适合新手学习,有不懂的问题可以随时问我,工作不忙的时候希望可以给大家解惑。

3、当多个线程同时对多张表进行操作时,可能出现互锁的问题。例如:

假设线程1和线程2都在本线程结束时才进行commit操作,当线程1在表B中插入数据时,表B暂时被锁,不允许其他线程进行非查询操作。同一时间,线程2在表C中插入数据,表C暂时被锁,不允许其他线程进行非查询操作。接下来,如果线程1想要更新表C中的数据,就会进入排队等待的状态,同样,线程2也无法对表B进行数据更新,导致两个线程互锁。

该问题的解决方案之一是将两个线程对各张表操作的顺序整理一致,例如:

这样就可以避免发生上述互锁情况了。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180420A1BC4F00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券