0

我有一个库需要从 Java 在 MySQL 中创建模式。目前,我有一个模式转储,我只是通过管道输入mysql命令。这可以正常工作,但并不理想,因为:

  • 它很脆弱:mysql命令需要在路径上:通常在没有额外配置的情况下在 OSX 或 Windows 上不起作用。
  • 也很脆弱,因为模式存储为语句,而不是描述性的
  • Java 已经可以访问 mysql 数据库,所以依赖外部程序来做这件事似乎很愚蠢。

有谁知道更好的方法来做到这一点?也许...

  • 我可以从文件中读取语句并直接从 Java 执行它们吗?有没有一种不涉及解析分号和手动划分语句的方法?
  • 我可以以其他方式存储模式 - 作为配置文件或直接在 Java 中,而不是作为语句(以 rails'db:schema或的样式database.yml),并且有一个库可以根据该描述创建模式?

这是现有代码的片段,它可以工作(当mysql在命令行上时):

if( db == null ) throw new Exception ("Need database name!");
String userStr = user == null ? "" : String.format("-u %s ", user);
String hostStr = host == null ? "" : String.format("-h %s ", host);
String pwStr = pw == null ? "" : String.format("-p%s ", pw);

String cmd = String.format("mysql %s %s %s %s", hostStr, userStr, pwStr, db);

System.out.println(cmd + " < schema.sql");      

final Process pr = Runtime.getRuntime().exec(cmd);

new Thread() {
    public void run() {              
        try (OutputStream stdin = pr.getOutputStream()) {
            Files.copy(f, stdin);
        } 
        catch (IOException e) { e.printStackTrace(); }                          
    }
}.start();

new Thread() {
    public void run() {             
        try (InputStream stdout = pr.getInputStream() ) {
            ByteStreams.copy(stdout, System.out);
        } 
        catch (IOException e) { e.printStackTrace(); }
    }
}.start();              

int exitVal = pr.waitFor();
if( exitVal == 0 )
    System.out.println("Create db succeeded!");
else    
    System.out.println("Exited with error code " + exitVal);
4

2 回答 2

1

简短的回答(据我所知)是否定的。您必须将文件解析为单独的语句。

我也遇到过同样的情况,你可以在 SO 上找到很多关于这个主题的问题。像这里的一些会显示一个解析器。其他人可以直接使用工具,例如 apache 的这篇文章 ,它可以将架构转换为 xml 格式,然后可以将其读回。

我写这个答案的主要目的是告诉我最后选择使用命令行。

  • 额外配置:也许这是一项额外的工作,但您可以通过配置或在运行时根据您正在运行的系统来完成。你努力一次,你就完成了
  • 取决于外部工具:它并不像看起来那么糟糕。你也有一些好处。

    1-您不需要编写额外的代码或引入额外的库来解析模式命令。

    2- 该工具由供应商提供。它可能比将进行解析的任何其他代码都经过更多的调试和测试。

    3-从长远来看更安全。数据库版本附带的工具很可能支持“可能”破坏解析器的转储格式中的任何添加或更改。您无需对代码进行任何更改。

    4-您将要使用该工具的操作(创建模式)的性质不建议频繁使用,从而将其成为性能瓶颈的风险降至最低。

我希望您能找到满足您需求的最佳解决方案。

于 2013-03-21T15:24:24.680 回答
0

查看Yank,更具体地说是链接到该页面的代码示例。它是构建在 DBUtils 之上的轻量级持久层,并隐藏了处理连接和结果集的所有细节。您还可以像您提到的那样轻松加载配置文件。您还可以从属性文件存储和加载 SQL 语句和/或在代码中硬编码 SQL 语句。

于 2013-03-18T17:38:34.320 回答