全面掌握Spark2.0 ML机器学习,ML的应用开发和定制开发

java执行sql脚本 

  1.   /**
  2.   * 运行Sql脚本
  3.   * sql脚本放在resources下的sql文件夹下
  4.   */
  5.   public final class RunSqlScript {
  6.   /**
  7.   * <p>运行指定的sql脚本
  8.   * @param sqlFile 需要执行的sql脚本的名字
  9.   */
  10.   public static void run(String sqlFile) {
  11.   try {
  12.   // 获取数据库相关配置信息
  13.   Properties props = Resources.getResourceAsProperties("config/db.properties");
  14.    
  15.   // jdbc 连接信息: 注: 现在版本的JDBC不需要配置driver,因为不需要Class.forName手动加载驱动
  16.   String url = props.getProperty("jdbc.url");
  17.   String username = props.getProperty("jdbc.username");
  18.   String password = props.getProperty("jdbc.password");
  19.    
  20.   // 建立连接
  21.   Connection conn = DriverManager.getConnection(url, username, password);
  22.    
  23.   // 创建ScriptRunner,用于执行SQL脚本
  24.   ScriptRunner runner = new ScriptRunner(conn);
  25.   runner.setErrorLogWriter(null);
  26.   runner.setLogWriter(null);
  27.   // 绝对路径读取
  28.   // Reader read = new FileReader(new File("f:\\test.sql"));
  29.   // 从class目录下直接读取
  30.   Reader read = Resources.getResourceAsReader("user_sql.sql");
  31.   runner.runScript(read);
  32.   // 执行SQL脚本
  33.   // runner.runScript(Resources.getResourceAsReader("sql/" + sqlFile + ".sql"));
  34.    
  35.   // 关闭连接
  36.   conn.close();
  37.    
  38.   // 若成功,打印提示信息
  39.   System.out.println("====== SUCCESS ======");
  40.   } catch (IOException | SQLException e) {
  41.   e.printStackTrace();
  42.   }

二、java执行shell脚本

一、介绍

有时候我们在Linux中运行Java程序时,需要调用一些Shell命令和脚本。而Runtime.getRuntime().exec()方法给我们提供了这个功能,而且Runtime.getRuntime()给我们提供了以下几种exec()方法:

  1.   Process exec(String command)
  2.   在单独的进程中执行指定的字符串命令。
  3.    
  4.   Process exec(String[] cmdarray)
  5.   在单独的进程中执行指定命令和变量。
  6.    
  7.   Process exec(String[] cmdarray, String[] envp)
  8.   在指定环境的独立进程中执行指定命令和变量。
  9.    
  10.   Process exec(String[] cmdarray, String[] envp, File dir)
  11.   在指定环境和工作目录的独立进程中执行指定的命令和变量。
  12.    
  13.   Process exec(String command, String[] envp)
  14.   在指定环境的单独进程中执行指定的字符串命令。
  15.    
  16.   Process exec(String command, String[] envp, File dir)
  17.   在有指定环境和工作目录的独立进程中执行指定的字符串命令。

其中,其实cmdarray和command差不多,同时如果参数中如果没有envp参数或设为null,表示调用命令将在当前程序执行的环境中执行;如果没有dir参数或设为null,表示调用命令将在当前程序执行的目录中执行,因此调用到其他目录中的文件和脚本最好使用绝对路径。各个参数的含义:

  1. cmdarray: 包含所调用命令及其参数的数组。 
  2. command: 一条指定的系统命令。
  3. envp: 字符串数组,其中每个元素的环境变量的设置格式为name=value;如果子进程应该继承当前进程的环境,则该参数为 null。
  4. dir: 子进程的工作目录;如果子进程应该继承当前进程的工作目录,则该参数为 null。

细心的读者会发现,为了执行调用操作,JVM会启一个Process,所以我们可以通过调用Process类的以下方法,得知调用操作是否正确执行:

  1.   abstract int waitFor()
  2.   导致当前线程等待,如有必要,一直要等到由该 Process 对象表示的进程已经终止。

二、调用Shell脚本

2、构建指令

shell运行脚本指令为 sh **.sh args,其实这个格式与java格式相同。

我的脚本为:

  1.   #!/bin/sh
  2.   #根据进程名杀死进程
  3.   echo "This is a $call"
  4.   if [ $# -lt 2 ]
  5.   then
  6.      echo "缺少参数:procedure_name和ip"
  7.      exit 1
  8.   fi
  9.    
  10.   echo "Kill the $1 process"
  11.   PROCESS=`ps -ef|grep $1|grep $2|grep -v grep|grep -v PPID|awk '{ print $2}'`
  12.   for i in $PROCESS
  13.   do
  14.      echo "Kill the $1 process [ $i ]" 
  15.   done

 

其实所有准备若当,就是无法读取里面的数据,执行shell指令,原因就是:

注意事项:

1.shell脚本必须有执行权限,比如部署后chmod -R 777 /webapps

2.shell文件,必须是UNIX格式,ANSI编码格式,否则容易出问题(可以用notepad++,编辑->文档格式转换,格式->转为ANSI格式(UNIX格式)

3、java程序

  1.   public class TestBash {
  2.   public static void main(String [] args){
  3.   BufferedReader reader = null;
  4.   try{
  5.   reader = new BufferedReader(new InputStreamReader(System.in));
  6.   System.out.println("请输入IP:");
  7.   String ip = reader.readLine();
  8.   String bashCommand = "sh "+ "/usr/local/java/jdk1.8.0_121/lib/stopffmpeg.sh" + " ffmpeg " + ip;
  9.   // String bashCommand = "chmod 777 " + "/usr/local/java/jdk1.8.0_121/lib/stopffmpeg.sh" ;
  10.   // String bashCommand = "kill -9" + ip;
  11.   System.out.println(bashCommand);
  12.   Runtime runtime = Runtime.getRuntime();
  13.   Process pro = runtime.exec(bashCommand);
  14.   int status = pro.waitFor();
  15.   if (status != 0)
  16.   {
  17.   System.out.println("Failed to call shell's command ");
  18.   }
  19.    
  20.   BufferedReader br = new BufferedReader(new InputStreamReader(pro.getInputStream()));
  21.   StringBuffer strbr = new StringBuffer();
  22.   String line;
  23.   while ((line = br.readLine())!= null)
  24.   {
  25.   strbr.append(line).append("\n");
  26.   }
  27.    
  28.   String result = strbr.toString();
  29.   System.out.println(result);
  30.    
  31.   }
  32.   catch (IOException ec)
  33.   {
  34.   ec.printStackTrace();
  35.   }
  36.   catch (InterruptedException ex){
  37.   ex.printStackTrace();
  38.    
  39.   }
  40.   }
  41.   }

 

其中文件路径为绝对路径,这点需要注意。

三、调试心得

在调试shell脚本执行过程中,反了几个错

1、构建指令不对

1、开始指令为:

 String bashCommand = "/usr/local/java/jdk1.8.0_121/lib/stopffmpeg.sh "+ " ffmpeg " + ip;
程序报错,权限不足。
2、此时修改为:
String bashCommand = "chmod 777 "+"/usr/local/java/jdk1.8.0_121/lib/stopffmpeg.sh "+ " ffmpeg " + ip;

记住一定注意空格(格式)但此时依然无法指定脚本指令。3、在发现格式不对后,修改后,还是不行,此时指令为:

String bashCommand = "sh "+ "/usr/local/java/jdk1.8.0_121/lib/stopffmpeg.sh" + " ffmpeg " + ip;

2、文件格式不对

这是无法读取内容的关键原因,因为sh文件是在Windows系统下生成的,所以需要将格式修改为linux格式的,即(UNIX格式)

此时网上程序可以了,然后看到指令不同,修改指令即可以了。

最后终于调通了,看来格式经验不足啊

上一篇:【转】在Unity中读写文件数据:LitJSON快速教程


下一篇:移动端font-size适配方案