Bonjour,

Voici mon problème :

J'ai 2 dossiers contenant chacun une base de donnée, et je veux pouvoir utiliser l'une puis l'autre dans mon application. Au démarrage de mon application, je n'ai aucune idée de où sont ces bases de données.
A savoir, le schéma de ces bases sont strictement identiques, ainsi, je retrouve exactement la même base avec les mêmes tables.

L'unique moyen que j'ai trouvé, pour passer d'une base à l'autre, est d'éteindre le daemon mysqld qui pointait sur la première base, puis de le redémarrer en le faisant pointer sur la deuxième base.

Existe-t-il un autre moyen de faire cela ?

Merci.

PS: Je travaille sur une application Java et je réalise toutes ces actions par des accès système de type `Runtime.getRuntime().exec(MY_CMD).
Une fois que ma base est démarrer j'utilise hibernate.
A priori au démarrage de l'application je ne connait pas le nombre exact de base, ni leur chemin précis, je ne peux donc pas l'indique dans un fichier de configuration.

Pour info, voici mon code pour switcher de base :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
    		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();
Voici les méthodes appelées :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 
	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);
	}
Et ici les constantes :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
	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();
PS2: Toute ressemblance avec le post suivant switching-database-connection-in-mysql est tout à fait fortuite


Merci de votre compréhension