0

这是我的问题:我有两个 mysql 数据库目录,我想一个接一个地使用。

我实际上找到的从一个数据库切换到另一个数据库的唯一方法是关闭 mysql 守护程序并重新启动它,指向第二个数据库目录。

还有其他方法可以执行吗?

谢谢


编辑: 我的应用程序管理嵌入数据库的“任务目录”。

该任务被复制到硬盘,该硬盘连接到将填充该数据库的外部设备。

然后当任务完成时,我们收集任务和数据库与应用程序生成报告。

这就是为什么我们有多个具有相同架构但放置在不同位置的数据库,我们还需要通过外部应用程序读取这个数据库,这就是为什么我们每次只需要打开一个数据库。

我的问题不是是否可以同时从两个不同的目录运行两个数据库,因为我知道这是可能的,而是如何从一个数据库切换到另一个数据库而不杀死守护进程。


PS:我正在开发 Java 应用程序,我通过 Java 中的系统访问来完成所有这些操作Runtime.getRuntime().exec(MY_CMD),而不是选择。也许使用Java库更好,我已经使用了hibernate。

这里的代码切换:

        new Thread(new Task<T>() {
        @Override
        protected T call() throws Exception {

            // Close the previous database
            if (isDaemonRunning()) {
                close();
            }

            // try to open the new one
            if (!open()) {
                notifyConnectedStatus(false);
                return null;
            }

            // create the hibernate session object
            _session = HibernateUtil.getSessionFactory().openSession();

            notifyConnectedStatus(true);

            // no return is waiting, then return null
            return null;
        }

    }).start();

这里调用的方法:

private boolean open() {
    int exitVal = 0;
    try {
        Process p = Runtime.getRuntime().exec(getRunDaemonCmd());
        p.waitFor(1, TimeUnit.SECONDS);
        if (p.isAlive()) {
            return true;
        }
        exitVal = p.exitValue();
    } catch (Exception e) {
        _logger.log(Level.SEVERE, e.getMessage(), e);
        return false;
    }
    return (0 == exitVal);
}

private void close() {
    do {
        try {
            if (null != _session) {
                _session.close();
                _session = null;
            }

            Process p = Runtime.getRuntime().exec(SHUTDOWN_CMD);
            p.waitFor();
        } catch (Exception e) {
            _logger.log(Level.SEVERE, e.getMessage(), e);
            return;
        }
    } while (isDaemonRunning());
    _connected = false;
}


private String[] getRunDaemonCmd() {
    return new String[] { MYSQLD, INI_FILE_PARAM + _myIniFile, DATADIR_PARAM + _databasePath };
}

private boolean isDaemonRunning() {
    int exitVal = 0;
    try {
        Process p = Runtime.getRuntime().exec(PING_CMD);
        p.waitFor();
        exitVal = p.exitValue();
    } catch (Exception e) {
        _logger.log(Level.SEVERE, e.getMessage(), e);
    }
    return (0 == exitVal);
}

这里是常量:

private static final String MYSQLD = "mysqld";
private static final String INI_FILE_PARAM = "--defaults-file=";
private static final String DATADIR_PARAM = "--datadir=";

private static final String MYSQLADMIN = "mysqladmin";

private static final String USER_PARAM = "-u";
private static final String PASSWORD_PARAM = "-p";
private static final String SHUTDOWN = "shutdown";

private static final String PING = "ping";

private static final String[] PING_CMD = new String[] { MYSQLADMIN, PING };

private static final String[] SHUTDOWN_CMD = new String[] { MYSQLADMIN, USER_PARAM + DatabaseSettings.getUser(),
        PASSWORD_PARAM + DatabaseSettings.getPassword(), SHUTDOWN };

private String _myIniFile = DatabaseSettings.getDefaultIniFile();
4

1 回答 1

0

所以,如果你使用hibernate,你可以使用多个持久化单元来连接多个数据源或数据库。

于 2017-04-19T09:22:37.147 回答