2017-04-10 2 views
0

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?

enter image description here

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.

Répondre

3

La meilleure façon consiste à utiliser la configuration du pilote compatible avec la réplication MySQL Connector/J. Votre chaîne de connexion sera comme ci-dessous

jdbc:mysql:replication://[master host][:port],[slave host 1][:port][,[slave host 2][:port]]...[/[database]] 

Une fois que vous marquez une transaction en lecture seule, il sera automatiquement acheminé à lire que des esclaves

https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-master-slave-replication-connection.html

+0

Nice. Besoin d'essayer ça. – Christian