Créer des clés, de table et de générer des tableaux dynamiquement à l'aide de Printemps de Données Cassandra
À l'aide de Cassandra, je veux créer des clés et des tableaux dynamiquement à l'aide de Printemps de Démarrage de l'application. Je suis à l'aide de Java en fonction de la configuration.
J'ai une entité annotée avec @Table dont le schéma je veux être créé avant l'application démarre depuis qu'il a fixé les champs qui sont connus à l'avance.
Cependant en fonction de l'utilisateur connecté, j'ai aussi envie de créer d'autres tables pour ceux de l'utilisateur de manière dynamique et être capable d'insérer des entrées de ces tables.
Quelqu'un peut-il me guider pour certaines ressources que je peux utiliser ou me diriger dans la bonne direction dans la façon d'aller sur la résolution de ces problèmes. Merci beaucoup pour l'aide!
Vous devez vous connecter pour publier un commentaire.
La meilleure chose à faire serait d'ajouter le Printemps De Démarrage Démarreur De Données Cassandra dépendance à votre Printemps de Démarrage application, comme si...
En outre, cela va ajouter de la Printemps de Données Cassandra la dépendance à votre demande.
Avec Printemps de Données Cassandra, vous pouvez configurer votre application Espace(s) à l'aide de la
CassandraClusterFactoryBean
(ou plus précisément, la sous-classe...CassandraCqlClusterFactoryBean
) par l'appel de la setKeyspaceCreations(:Set) méthode.La KeyspaceActionSpecification classe est assez explicite. Vous pouvez même en créer un avec le KeyspaceActionSpecificationFactorybean, l'ajouter à un
Set
et de passer ensuite que lasetKeyspaceCreations(..)
méthode sur laCassandraClusterFactoryBean
.Pour la génération de l'application des Tables, vous essentiellement besoin d'annoter votre domaine d'application, objet(s) (entités) à l'aide de la carte SD Cassandra @Table annotation, et assurez-vous que votre domaine d'objets/entités peuvent être trouvés sur le CLASSPATH de l'application.
Plus précisément, vous pouvez avoir votre application
@Configuration
classe prolonger la SD Cassandra AbstractClusterConfiguration classe. Là, vous trouverez la getEntityBasePackages():String[] méthode que vous pouvez remplacer fournir l'ensemble des emplacements contenant votre domaine d'application de l'objet/les classes d'entité, qui SD Cassandra pourront ensuite utiliser pour scan pour@Table
domaine d'objets/entités.Avec votre application
@Table
domaine d'objets/entités identifiés correctement, vous définissez la SD Cassandra SchemaAction àCREATE
à l'aide de laCassandraSessionFactoryBean
méthode, setSchemaAction(:SchemaAction). Cela permettra de créer des Tables dans votre Espace de clé pour tous les objets de domaine/entités trouvées lors de l'analyse, de vous fournir identifié le bon Espace sur votreCassandraSessionFactoryBean
de façon appropriée.Évidemment, si votre application crée/utilise plusieurs Keyspaces, vous aurez besoin de créer un
CassandraSessionFactoryBean
pour chaque Espace, avec laentityBasePackages
propriété configuration appropriée pour les entités qui appartiennent à un Espace de clé, de sorte que les Tableaux sont créés dans cet Espace.Maintenant...
Pour les "autres" de Tables par l'utilisateur, qui est un peu plus compliqué et délicat.
Vous pourriez être en mesure de tirer parti de Printemps Profils ici, cependant, les profils sont généralement appliquées uniquement au démarrage. Si un autre utilisateur se connecte à une application en cours d'exécution, vous avez besoin d'un moyen de fournir des
@Configuration
classes pour le PrintempsApplicationContext
au moment de l'exécution.Votre Printemps de Démarrage application peut injecter une référence à un
AnnotationConfigApplicationContext
, puis de l'utiliser sur un événement de connexion par programmation registre supplémentaires@Configuration
classes en fonction de l'utilisateur qui s'est connecté à l'application. Vous devez suivre votreregister(Class...)
appel(s) avec uneApplicationContext.refresh()
.Vous avez également besoin de traiter correctement la situation où les Tables existent déjà.
Ce n'est pas actuellement pris en charge dans la SD de Cassandra, mais voir DATACASS-219 pour plus de détails.
Techniquement, il serait beaucoup plus simple de créer toutes les Tables nécessaires par l'application pour tous les utilisateurs au moment de l'exécution et de l'utilisation de Cassandra paramètres de sécurité pour restreindre l'utilisateur individuel d'accès par rôle et des permissions.
Une autre option pourrait être de créer temporaire Keyspaces et/ou de Tableaux que nécessaire lorsqu'un utilisateur se connecte à l'application, les déposer lorsque l'utilisateur se déconnecte.
Clairement, il y a beaucoup de choix différents ici, et cela se résume plus à de l'architecture, des compromis et des considérations puis il ne faisabilité technique, donc soyez prudent.
Espère que cette aide.
Cheers!
Printemps suivant la configuration de la classe crée des clés et des tables si elles n'existent pas.
À l'aide de @Enes Altınkaya réponse:
À définir votre varaibles utiliser un
application.properties
ouapplication.yml
fichier:À l'aide de fichiers de configuration au lieu de chaînes codées en dur, vous pouvez publier votre code sur par exemple GitHub sans publier vos mots de passe et entrypoints (
.gitignore
fichiers) qui peut être un risque pour la sécurité.Suivantes cassandra configuration permettra de créer un espace de clé lorsqu'il n'existe pas et également exécuter le script de démarrage spécifié
Cette réponse est inspiré par Viswanath de réponse.
Mon
cassandra.yml
se présente comme suit:Vous pourriez avoir à personnaliser
@ConfigurationProperties("spring.data.cassandra")
, si votre configuration commence aveccassandra
danscassandra.yml
fichier, puis utilisez@ConfigurationProperties("cassandra")
Pour le tableau de la création, vous pouvez l'utiliser dans l'application.fichier de propriétés