飘逸的Groovy,利用Groovy+windows执行计划 实现动态RunstatusDb2数据库

来源:互联网 发布:阿里云销售 区域经理 编辑:程序博客网 时间:2024/05/16 17:57

    端午三天假,学习了JRuby,Groovy.最后还是觉得Groovy比较容易上手。用Groovy有点当年写basic的感觉,不再有java那样那么多条条框框。开发的时候更多的是在用代码描述自己的执行逻辑,而不是为了实现某种逻辑功能去编写大量符合java"定式"的类。    

Groovy给我的感觉就2个字"飘逸",在编码方面很多地方java工作量是非常繁琐而Groovy封装的相当成功,或许AOP的精华也就在此。    

每个月我要对DB2数据库进行Runstatus操作,要备份语句,上传语句到目的机器,并执行。每个月如此,只是每个月要执行的语句会变化,因为表也在不断变化中。这部分工作很机械,以前就像过写一个什么东西自动化一把。可惜没做.... 刚好学了Groovy就用它实现吧

下面贴出Groovy程序      DB2Runstatus.groovy

 

import groovy.sql.Sqlimport java.text.SimpleDateFormat import telnet.TelnetSample//实现生成脚本文件def user="用户名"def pass="密码"def schema=this.args[0]def bartDateFormat = new SimpleDateFormat("yyyy-MMMM-dd-EEEE"); def filePath="D:/数据库维护/Runstats/" //这个目录要事先建立好def fileDir=filePath+bartDateFormat.format(new Date())def fileName=fileDir+"/"+"${schema}.sql"def linesp="/n"def fileObjectDir=new File(fileDir)//没有目录先创建目录if(!fileObjectDir.exists())    fileObjectDir.mkdir()def sql = Sql.newInstance("jdbc:db2://10.154.144.38:50000/hndpdb", "${user}","${pass}", "com.ibm.db2.jcc.DB2Driver")file1 =new  File(fileName)//先删除已经存在的文件if(file1.exists())    file1.delete()sql.eachRow("select Rtrim(TABSCHEMA)||'.'||TABNAME AS TABLE from syscat.tables where TABSCHEMA='${schema}'", {     file1 << " RUNSTATS ON TABLE ${it.TABLE} ON KEY COLUMNS WITH DISTRIBUTION ON ALL COLUMNS AND SAMPLED DETAILED INDEXES ALL  ALLOW WRITE ACCESS ${linesp}"    file1 << " REORG TABLE  ${it.TABLE} ALLOW READ ACCESS ${linesp}"    file1 << " REORG INDEXES ALL FOR  TABLE  ${it.TABLE}  ALLOW READ ACCESS ${linesp}"    file1 << " RUNSTATS ON TABLE ${it.TABLE} ON KEY COLUMNS WITH DISTRIBUTION ON ALL COLUMNS AND SAMPLED DETAILED INDEXES ALL  ALLOW WRITE ACCESS ${linesp}"})sql.close()//上传脚本文件def ftpName=fileDir+"/"+"${schema}.ftp"ftpFile=new File(ftpName)//先删除已经存在的文件if(ftpFile.exists())    ftpFile.delete()//生成ftp脚本ftpFile <<"""open 10.154.144.40${user}${pass}cd deep/tmppromptdelete ${schema}.sqlput ${fileName}bye"""//执行脚本def command = "ftp -s:${ftpName}"def proc = command.execute()                proc.waitFor()                              println "输出: ${proc.in.text}"println "错误信息: ${proc.err.text}"//远程端执行sqlTelnetSample telnet = new TelnetSample( "10.154.144.40",                          "${user}",                          "${pass}") telnet.sendCommand( "cd deep/tmp" );  telnet.sendCommand( "db2 connect to hndpdb user ${user} using ${pass}" ); telnet.sendCommand( "nohup db2 -vf ${schema}.sql &" );

 

 短短60行的代码就实现了从备份到FTP再执行的任务,HOHO~ 执行的方式也很简单,再CLI模式下   groovy DB2Runstatus.groovy [表模式名] 假设我要执行ODS层的runstatus==> groovy DB2Runstatus.groovy ODS

这样在D:/数据库维护/Runstats/ 目录下 会生成一个当前日期的文件夹,文件夹下会生成一个 ODS.sql 文件和 ODS.ftp文件 分别上 执行语句和FTP语句再执行完之后就会自动 telnet 到目标机器 用Nohup挂载 执行( 这里我登陆的是 AIX 所以用nohup 其他的系统自己参考)

然后把完整的调用方式 写成一个bat文件 run.bat

groovy DB2Runstatus.groovy ODS groovy DB2Runstatus.groovy DW groovy DB2Runstatus.groovy WI 

再配置到windows执行计划里面去 就OK了

执行groovy的环境必须 JDK >=1.5 并且配置好 环境变量%GRROVY_HOME%

 

原创粉丝点击