这是我的问题: 我有两个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();
答案 0 :(得分:0)
因此,如果使用休眠,可以使用多个持久性单元连接多个数据源或数据库。