在mysql中切换数据库连接

时间:2017-04-19 09:09:55

标签: java mysql hibernate mysqladmin

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

我从一个数据库切换到另一个数据库的唯一方法就是关闭mysql守护进程并再次指向第二个数据库目录。

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

由于

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

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

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

为什么我们有多个具有相同模式但位于不同位置的数据库,我们还需要通过外部应用程序读取此数据库,以便我们每次只需要打开一个数据库。

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

PS:我正在研究Java应用程序,我通过像Runtime.getRuntime().exec(MY_CMD)这样的Java系统访问来完成所有这些操作,而不是选择。也许使用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();

1 个答案:

答案 0 :(得分:0)

因此,如果使用休眠,可以使用多个持久性单元连接多个数据源或数据库。