小编Ian*_*ers的帖子

如何使用liquibase diffChangeLog以当前更改日志作为参考(生成增量更改集)

我有一个现有的数据库,并使用generateChangeLog命令行来创建初始更改日志.这很好用:-)

但现在我希望开发人员使用他们已知/已经使用的所有工具/流程来开发数据库和代码,并使用脚本生成任何适当的增量更改集.

即:使用当前更改日志(属性文件中的changeLogFile)作为基本引用,对开发人员数据库的当前状态(属性文件中的url/username/password)执行diff.

似乎没有简单的方法可以做到这一点 - 我提出的最好的方法是:

  1. 创建一个新的临时数据库.
  2. 使用liquibase通过覆盖连接URL来初始化临时数据库(当前在更改日志中): liquibase --url=jdbc:mysql://localhost:3306/tempbase update
  3. 使用liquibase通过区分两个数据库在更改日志中生成变更集: liquibase --referenceUrl=jdbc:mysql://localhost:3306/tempbase --referenceUsername=foo --referencePassword=baz diffChangeLog
  4. 删除临时数据库.
  5. 同步变更集: liquibase changelogSync

但必须有更好的方法......

liquibase

11
推荐指数
1
解决办法
3410
查看次数

如何防止ctrl + c杀死Java中的衍生进程

[NB.这与如何从Java程序启动完全独立的进程有关?但不同]

我希望能够从"管理器"Java进程中生成外部进程(shell脚本),该进程应该在JVM被杀死时继续运行 - 但是当我杀死父Java程序时,孩子也被杀死了(注意,如果JVM自然退出,行为会有所不同).我最简单的测试程序是:

public class Runit {

    public static void main(String args[]) throws IOException, InterruptedException {
        Runtime.getRuntime().exec(args[0]);

        // doesn't work this way either
        // ProcessBuilder pb = new ProcessBuilder(args[0]);
        // pb.start();

        while (true) {
            System.out.println("Kill me");
            Thread.sleep(2000);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

和外部脚本:

#!/bin/sh

while [ 1 ] ; do 
    ls
    sleep 1
done
Run Code Online (Sandbox Code Playgroud)

跑来跑去

java -classpath jar-with-dependencies.jar temp.exec.Runit runit.sh

如果管理器只是退出(即取出Java程序中的"while"循环),则生成的进程继续运行,但是当我Ctrl+ cJava程序时,外部程序也被杀死,这不是我想要的.

我在Ubuntu上使用OpenJDK 1.6.

Edit1:将exec更改为

Runtime.getRuntime().exec("/usr/bin/nohup " +  args[0]);
Run Code Online (Sandbox Code Playgroud)

没有帮助.

Edit2:如何在Java正常处理SIGKILL信号中所述添加关闭挂钩并不会阻止正在传播给子节点 …

java

7
推荐指数
1
解决办法
1129
查看次数

标签 统计

java ×1

liquibase ×1