6. 数据源和存储库

在Tigase XMPP Server 8.0.0中引入了数据源的新概念。引入它是为了区分负责维护与实际数据源的连接的类和在该数据源上运行的类。

6.1. 数据源

Relations between DataSourceBean and DataSources

6.1.1. 数据源

DataSource 是一个接口,其应该由实现对数据源的访问的所有类来实现,换言之,使用JDBC连接实现对数据库的访问或对 MongoDB 的访问。 DataSource 的实现是使用配置中提供的uri和实现 DataSource 接口的类上的 @Repository.Meta 注释自动选择的。

6.1.2. DataSourcePool

DataSourcePool 是一个接口,应该由充当单个域的数据源池的类来实现。不需要创建实现这个接口的类,但是如果 DataSource 的实现是阻塞的并且不支持并发请求,那么建议创建 DataSourcePool。这种情况的一个例子是 DataRepositoryImpl 的实现,它使用单个连接执行所有请求,对于这个类,DataRepositoryPool 实现了 DataSourcePool 接口并提高了性能。使用配置中提供的uri和实现 DataSourcePool 接口的类上的 @Repository.Meta 注解自动选择 DataSourcePool 的实现。

6.1.3. DataSourceBean

该类是一个帮助类,并为处理多个数据源提供支持。您可以将 DataSourceBean 视为命名 DataSourceDataSourcePool 实例的映射。该类还负责数据源的初始化。此外,如果数据源在运行时发生变化,DataSourceBean 负责触发一个 DataSourceChangedEvent 以通知其他类有关此变化。

6.2. 用户和身份验证存储库

此存储库可能正在使用现有的(配置和初始化的)数据源。然而,它们也有可能有自己的连接源。如果可能,建议使用数据源。

Relations between AuthRepositories and DataSources

Relations between UserRepositories and DataSources

6.2.1. AuthRepository和UserRepository

这是一个基本接口,需要由身份验证存储库(AuthRepository)和用户存储库(UserRepository)实现。实现此接口的类应该只负责从数据源检索数据。

6.2.2. AuthRepositoryPool和UserRepositoryPool

如果实现 AuthRepositoryPoolUserRepositoryPool 的类不使用数据源或包含阻塞或不适合并发访问,则应将其包装在适当的存储库池中。作为Tigase XMPP Server的一部分提供的大多数实现不需要包装在存储库池中。如果您的实现阻塞或并发访问(即由于同步)性能不佳,则应将其包装在此池中。要将实现包装在池中,您需要在配置文件中设置已配置用户或身份验证存储库的 pool-cls 属性。

6.2.3. AuthRepositoryMDPoolBean和UserRepositoryMDPoolBean

这些类用于实现 AuthRepositoryUserRepository 的类,而 DataSourceBean 用于实现 DataSource 接口的类。此类包含命名身份验证或用户存储库的映射。他们还负责初始化实现此存储库的类。

6.3. 其他存储库

可以实现那些不实现 AuthRepositoryUserRepository 的存储库。每种类型的自定义存储库都应该有自己的API和自己的接口。

Relations between custom repositories and DataSources

6.3.1. DataSourceAware

自定义存储库应实现它们自己的接口,指定其API。此接口应扩展 DataSourceAware 接口,该接口是自定义存储库需要实现的基本接口。 DataSourceAware 有一个 setDataSource() 方法,它将与数据源实例一起调用以初始化自定义存储库的实例。实现应该用 @Repository.Meta 实现注释,以自动选择正确类型的 DataSource 实现。

6.3.2. MDRepositoryBean

需要创建一个扩展 MDRepositoryBean 的类,实现与自定义存储库相同的自定义接口。此类将是一个多域池,允许您为每个域单独实现自定义存储库。此外,它将负责创建和初始化您的自定义存储库实例。