Scala过度包装的平衡怎么理解
发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,本篇内容介绍了"Scala过度包装的平衡怎么理解"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!最近,
千家信息网最后更新 2025年01月18日Scala过度包装的平衡怎么理解
本篇内容介绍了"Scala过度包装的平衡怎么理解"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
最近,在阅读项目组的代码时,再次陷入了苦思:基于Java、Hibernate的商业应用开发确实陷入到了一个很痛苦的境界,这个问题实际上正在进行开发的大部分开发人员都不会感觉到,因为大家都觉得这就是正常的程序员生活。再说,几乎所有的框架都在力捧Hibernate这样的ORM工具能够极大的简化程序的开发,要不,你去使用使用 JDBC试试。
在Java中基于JDBC编程,确实有些汇编语言的感觉,摘抄一份实际项目的代码:
public void updateTerminalStatus(String timeout, String transtime) throws Exception { //更新超时终端的状态值(9为超时) String updateTerminal = "update T_Terminal set Status=9 " + " where TerminalID in (select TerminalID from T_Terminal where TO_CHAR(latestDate, 'yyyymmddHH24miss')<=? and (status=0 or status=2) ) "; //查询超时的终端信息,且该终端号在故障表中没有未处理的超时记录,(包含该终端号在故障表中没有超时记录的情况)。 String queryTimeOutTerm = "SELECT te.TerminalID FROM T_TERMINAL te WHERE te.status=9 "; String queryTerm = "SELECT terminalid FROM T_TROUBLELOG tr " + " WHERE tr.DeviceID='COMMMODULE' AND tr.TroubleID='CommTimeOut' " + " AND tr.SolveDate IS NULL GROUP BY terminalid "; //向故障表中添加一条新的故障记录。 String insertTrouble = "insert into T_TroubleLog (LogID, TerminalID, DeviceID, TroubleID, HappenDate) " + " values (?, ?, 'COMMMODULE', 'CommTimeOut', TO_DATE(?,'yyyymmddHH24miss')) "; //更新故障表中的终端超时记录,该终端号的状态已经不超时,则超时故障处理完毕。 String updateTrouble = "UPDATE T_TROUBLELOG tl SET tl.SolveDate=TO_DATE(?,'yyyymmddHH24miss') " + " WHERE terminalid IN" + " (SELECT tm.terminalid FROM T_TERMINAL tm,T_TROUBLELOG tl " + " WHERE tm.Status != 9 AND tm.TerminalID=tl.TerminalID )" + " AND tl.DeviceID='COMMMODULE' AND tl.TroubleID='CommTimeOut' AND tl.SolveDate IS NULL "; Connection conn = null; PreparedStatement pstmt = null; PreparedStatement pstmtInsert = null; ResultSet rs = null; List terlist = new ArrayList(); List noterlist = new ArrayList(); try { conn = transDataSource.getConnection(); conn.setAutoCommit(false); pstmt = conn.prepareStatement(updateTerminal); pstmt.setString(1, timeout); pstmt.executeUpdate(); pstmt.close(); pstmt = conn.prepareStatement(updateTrouble); pstmt.setString(1, transtime); pstmt.executeUpdate(); pstmt.close(); log.debug("更新完成"); //生成32位的随机ID,使用Hibernate中的UUID算法。 Properties props = new Properties(); props.setProperty("separator", ""); IdentifierGenerator gen = new UUIDHexGenerator(); ( (Configurable) gen ).configure(Hibernate.STRING, props, null); pstmtInsert = conn.prepareStatement(insertTrouble); pstmt = conn.prepareStatement(queryTerm); rs = pstmt.executeQuery(); while(rs.next()){ String termid = rs.getString(1); terlist.add(termid); } log.debug("查询终端号在故障表中没有未处理的超时记录完成"); rs.close(); rs = null; pstmt.close(); pstmt = null; pstmt = conn.prepareStatement(queryTimeOutTerm); rs = pstmt.executeQuery(); while (rs.next()) { String term = rs.getString(1); noterlist.add(term); } log.debug("查询超时的终端信息完成" + noterlist.size()); for(int j = 0; j < noterlist.size(); j++){ String terminalid = noterlist.get(j).toString(); if(terlist.contains(terminalid)){ continue; } pstmtInsert.setString(1, (String) gen.generate(null, null)); pstmtInsert.setString(2, terminalid); pstmtInsert.setString(3, transtime); pstmtInsert.addBatch(); } pstmtInsert.executeBatch(); conn.commit(); log.debug("向故障表中添加新的故障记录完成"); } catch (Exception ex) { try{ conn.rollback(); }catch (Exception e) { } throw ex; } finally { if (rs != null) { try { rs.close(); } catch (Exception ex) { } } if (pstmt != null) { try { pstmt.close(); } catch (Exception ex) { } } if (pstmtInsert != null) { try { pstmtInsert.close(); } catch (Exception ex) { } } if (conn != null) { try { conn.close(); } catch (Exception ex) { } } } }
这份代码长达120行,要去理解它还是得花一些时间的,如果使用 scala来写的话,可以怎么写呢?
implicit val conn: Connection = transDataSource.getConnection() transaction { update("""update T_Terminal set Status=9 where TerminalID in (select TerminalID from T_Terminal where TO_CHAR(latestDate, 'yyyymmddHH24miss')<= ? and (status=0 or status=2)) """, timeout); update("""UPDATE T_TROUBLELOG tl SET tl.SolveDate=TO_DATE(?,'yyyymmddHH24miss') WHERE terminalid IN (SELECT tm.terminalid FROM T_TERMINAL tm,T_TROUBLELOG tl WHERE tm.Status != 9 AND tm.TerminalID=tl.TerminalID ) AND tl.DeviceID='COMMMODULE' AND tl.TroubleID='CommTimeOut' AND tl.SolveDate IS NULL """, transtime); val terlist: List[String] = List() query("""SELECT terminalid FROM T_TROUBLELOG tr WHERE tr.DeviceID='COMMMODULE' AND tr.TroubleID='CommTimeOut' AND tr.SolveDate IS NULL GROUP BY terminalid """).foreach { (row) => terlist += row("terminalid") } log.debug("查询终端号在故障表中没有未处理的超时记录完成"); val noterlist: List[String] = List() query("SELECT te.TerminalID FROM T_TERMINAL te WHERE te.status=9").foreach { (row)=> noterlist += row("terminalid") } log.debug("查询超时的终端信息完成" + noterlist.size()); val psInsert = conn prepareStatement """insert into T_TroubleLog (LogID, TerminalID, DeviceID, TroubleID, HappenDate) values (?, ?, 'COMMMODULE', 'CommTimeOut', TO_DATE(?,'yyyymmddHH24miss'))""" for(val terminalId <- noterlist){ psInsert << uuid() << terminalid << transtime <这是一个直译的版本,代码函数为34行,瘦身到25%左右。不仅代码行数更短,而且新的代码的可读性也更高得多。
最近一直在思考,我们对JDBC是否做了过度的包装?包括事务处理,DAO等从EJB1.0时代产生的设计模式,到后续的O-R-M框架,看上去代码是越发简洁,实际上已经远远的远离代码的本质。这种基于Scala的JDBC简单封装,即便于我,也还远不如原始的4GL的简洁,但相比传统的jdbc或者后续的orm、spring+dao等等,则要简化得多。
"Scala过度包装的平衡怎么理解"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
故障
终端
代码
处理
查询
实际
开发
包装
信息
更新
简洁
内容
实际上
情况
感觉
更多
框架
状态
知识
程序
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
重庆电脑软件开发要多少钱
万博网络安全与数据
西南大学网络技术学院
数据库构建国外研究现状
手机网易我的世界开服务器视频
网络安全检测与防护
博纳软件开发公司
网络安全技术与实践
手机软件开发报价标准
软件开发工具对比
云服务器数据删除还能恢复吗
网站服务器管理的试题
软件开发过程控制点
网络安全周信息稿
t 服务器到期还可以用的吗
zynq用什么软件开发
计算机网络技术网络推广就业前景
翻墙代理服务器
军工软件开发流程
北京快行网络技术有限公司
免费unix服务器
北京餐饮软件开发视频
双鸭山gpu服务器
奇迹ex902数据库
dayz 服务器教程
联通云服务器集采中标金额
宝山区品牌数据库系统研发资格
安庆分布式服务器价格
飞机加速器手动添加服务器教程
网络安全信息规范视频