J'ai besoin d'utiliser des serveurs MySQL séparés. Un auteur et un (ou plusieurs) ont lu une réplique.Spring + Hibernate: lecture/écriture de différentes sources de données et des milliers de bases de données mysql
Quelle est la meilleure façon de faire cela?
J'ai trouvé beaucoup d'exemples:
http://www.dragishak.com/?p=307
Utilisez pilote JDBC spécial: com.mysql.jdbc.ReplicationDriver
Et l'utilisation est:
@Transactional(readOnly=true)
@ReadOnlyConnection
public Result serviceMethod(…) {
…
}
https://stackoverflow.com/a/33169879/1974494
avec Spring AbstractRoutingDatasource
:
Utilisation:
@Transactional(readOnly = true)
public Page<BookDTO> getBooks(Pageable p) {
try{
DbContextHolder.setDbType(DbType.REPLICA1); // <----- set ThreadLocal DataSource lookup key
Dans chaque méthode que je dois mettre DbType.
Est-il possible d'envoyer automatiquement une "requête de lecture" au serveur de réplication et une "requête d'écriture" (insertion/mise à jour) au serveur maître?
Et deuxième question:
Je voudrais avoir une base de données mysql par utilisateur (très grand). Je m'attends à environ 2 000 utilisateurs. Donc je ne peux pas définir de source de données pour chaque utilisateur * lecteur + écrivain.
Exemple:
spring.ds_items.driverClassName=com.mysql.jdbc.Driver
spring.ds_items.url=jdbc:mysql://mysql-master/user1
spring.ds_items.username=root
spring.ds_items.password=12345
spring.ds_items.driverClassName=com.mysql.jdbc.Driver
spring.ds_items.url=jdbc:mysql://mysql-replica1/user1
spring.ds_items.username=root
spring.ds_items.password=12345
spring.ds_items.driverClassName=com.mysql.jdbc.Driver
spring.ds_items.url=jdbc:mysql://mysql-master/user2
spring.ds_items.username=root
spring.ds_items.password=12345
spring.ds_items.driverClassName=com.mysql.jdbc.Driver
spring.ds_items.url=jdbc:mysql://mysql-replica1/user2
spring.ds_items.username=root
spring.ds_items.password=12345
Je voudrais avoir une « base de données principale de MySQL » avec table quelque chose comme:
user db_name
--------------
test1 db_test1
test2 db_test2
Et si j'ai besoin des données pour l'utilisateur test2
je regarde « principale base de données "et obtenir des informations pour la base de données db_test2
à utiliser. Après cela, envoyez la requête à la base de données db_test2
.
Nice. Besoin d'essayer ça. – Christian