当前位置: 首页 > 知识库问答 >
问题:

使用spring数据Cassandra动态创建键空间、表和生成表

容修贤
2023-03-14

使用Cassandra,我想使用spring boot应用程序动态地创建键空间和表。我正在使用基于Java的配置。

我有一个用@table注释的实体,我想在应用程序启动之前创建它的模式,因为它有预先已知的固定字段。

但是,根据登录的用户,我还希望为这些用户动态创建额外的表,并能够将条目插入到这些表中。

有没有人可以指导我一些我可以利用的资源,或者指出我如何解决这些问题的正确方向。非常感谢你的帮助!

共有1个答案

安高义
2023-03-14

最简单的做法是将spring boot Starter Data Cassandra依赖项添加到您的spring boot应用程序中,如下所示...

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-cassandra</artifactId>
  <version>1.3.5.RELEASE</version>
</dependency>

此外,这将向您的应用程序添加spring数据Cassandra依赖项。

使用spring数据Cassandra,您可以通过调用setKeyspaceCreations(:set)方法,使用CassandracLusterFactoryBean(或者更准确地说,子类...CassandracQLClusterFactoryBean)配置应用程序的密钥空间。

KeyspaceActionSpecification类非常简单。您甚至可以使用KeyspaceActionSpecificationFactoryBean创建一个KeyspaceActionSpecificationFactoryBean,将其添加到Set中,然后将其传递给CassandracLusterFactoryBean上的SetKeySpaceCreations(..)方法。

为了生成应用程序的表,您基本上只需要使用SD Cassandra@Table注释来注释应用程序的域对象(实体),并确保可以在应用程序的类路径上找到域对象/实体。

具体地说,您可以让应用程序@configuration类扩展SD Cassandra AbstractClusterConfiguration类。在这里,您可以找到getEntityBasePackages():String[]方法,您可以重写该方法,以提供包含应用程序域对象/实体类的包位置,然后SD Cassandra将使用该包来扫描@table域对象/实体。

正确标识应用程序@table域对象/实体后,使用CassandrasessionFactoryBean方法setSchemaAction(:SchemaAction)将SD Cassandra SchemaAction设置为create。如果您在CassandrasessionFactoryBean上正确标识了正确的键空间,这将在您的键空间中为扫描期间找到的所有域对象/实体创建表。

显然,如果应用程序创建/使用多个键空间,则需要为每个键空间创建单独的CassandrasessionFactoryBean,并为属于特定键空间的实体适当设置EntityBasePackages配置属性,以便在该键空间中创建相关联的表。

现在...

对于每个用户的“附加”表来说,这是相当复杂和棘手的。

您可能可以在这里利用spring配置文件,然而,配置文件通常只应用于启动。如果不同的用户登录到一个已经运行的应用程序中,您需要一种方法在运行时向springApplicationContext提供额外的@configuration类。

您的spring boot应用程序可以注入对AnnotationConfigApplicationContext的引用,然后在登录事件中使用它,根据登录到应用程序的用户以编程方式注册其他@configuration类。您需要使用ApplicationContext.Refresh()跟随Register(class...)调用。

您还需要适当地处理表已经存在的情况。

SD Cassandra目前不支持这一点,但请参阅DATACASS-219了解更多详细信息。

从技术上讲,在运行时为所有用户创建应用程序所需的所有可能的表,并使用Cassandra的安全设置来根据角色和分配的权限限制单个用户的访问,会简单得多。

另一种选择可能是在用户登录应用程序时根据需要创建临时键空间和/或表,在用户注销时删除它们。

显然,这里有很多不同的选择,它更多地归结为架构决策、权衡和考虑,然后才是技术可行性,所以要小心。

希望这有帮助。

干杯!

 类似资料:
  • 主要内容:什么是键空间(Keyspace)?,Cassandra Keyspace的不同组件Cassandra查询语言(CQL)可帮助开发人员与Cassandra沟通交互。 Cassandra查询语言的语法与SQL非常相似。 什么是键空间(Keyspace)? 键空间()是用于保存列族,用户定义类型的对象。 键空间(Keyspace)就像RDBMS中的数据库,其中包含列族,索引,用户定义类型,数据中心意识,键空间(Keyspace)中使用的策略,复制因子等。 在Cassandra中,“”

  • 我使用Cassandra作为我的Spring boot应用程序的数据源,并希望在应用程序启动前初始化数据库。 到目前为止,我所做的是,我已经定义了一个类“CassandraConfiguration”,扩展了“AbstractCassandraConfiguration”类,如下面的示例所示,我有一个扩展“CassandraRepository”的存储库。当我自己创建键空间和表时,应用程序工作正常

  • 我使用的是spring数据。下面是我的配置类。我的期望是,当spring boot应用程序加载时,它必须连接到Cassandra并创建密钥空间。但我的应用程序能够连接到Cassandra,但它没有创建密钥空间。我在启动时收到以下异常。如果我遗漏了什么,请告诉我。 通过构造函数参数5表示的未满足依赖关系;嵌套的异常是org。springframework。豆。工厂BeanCreationExcept

  • 身份证姓名地点1 abc Hyd 2 banu chen 3 jai bang 4 hari Hyd 5 nani Hyd 6 banti bang 7 kali chen 在此文本文件加载的基础上,我们需要动态创建位置表并加载相关数据。由于一段时间文本文件中可能有更多的位置,我们需要动态创建表并加载它。请告诉我如何使用SSIS实现此任务。我们需要foreach循环容器,但不知道如何实现此任务。请

  • 问题内容: 我有一个Webapp,允许用户创建自己的字段,以供以后使用表单呈现。 我有一个像这样的Formfield模型: 我用来代表字段的类型,无论是哪种类型(复选框,输入,以后都会有更多)。 如你所见,每个字段都有一个form_id的FK。 我正在尝试为给定的form_id生成动态表单。问题是我需要确定要为每个Formfield呈现的字段的类型。因此,我还需要在某个时候处理字段类型。 我想一个

  • 本文向大家介绍使用Vue生成动态表单,包括了使用Vue生成动态表单的使用技巧和注意事项,需要的朋友参考一下 开需求会了,产品说这次需求的表单比较多,目前有18个,后期的表单可能会有增加、修改。我作为这次的前端开发,看到这样的需求,心里知道要这样搞不得把自己累死,首先表单居多,还会有变更,以后维护起来也让人心力憔悴。 于是我提议做动态表单,做一个表单的配置系统,在系统里配置表单类型、表单得字段、以及