6. 数据源和存储库
在Tigase XMPP Server 8.0.0中引入了数据源的新概念。引入它是为了区分负责维护与实际数据源的连接的类和在该数据源上运行的类。
6.1. 数据源
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
视为命名 DataSource
或 DataSourcePool
实例的映射。该类还负责数据源的初始化。此外,如果数据源在运行时发生变化,DataSourceBean
负责触发一个 DataSourceChangedEvent
以通知其他类有关此变化。
6.2. 用户和身份验证存储库
此存储库可能正在使用现有的(配置和初始化的)数据源。然而,它们也有可能有自己的连接源。如果可能,建议使用数据源。
6.2.1. AuthRepository和UserRepository
这是一个基本接口,需要由身份验证存储库(AuthRepository
)和用户存储库(UserRepository
)实现。实现此接口的类应该只负责从数据源检索数据。
6.2.2. AuthRepositoryPool和UserRepositoryPool
如果实现 AuthRepositoryPool
或 UserRepositoryPool
的类不使用数据源或包含阻塞或不适合并发访问,则应将其包装在适当的存储库池中。作为Tigase XMPP Server的一部分提供的大多数实现不需要包装在存储库池中。如果您的实现阻塞或并发访问(即由于同步)性能不佳,则应将其包装在此池中。要将实现包装在池中,您需要在配置文件中设置已配置用户或身份验证存储库的 pool-cls
属性。
6.2.3. AuthRepositoryMDPoolBean和UserRepositoryMDPoolBean
这些类用于实现 AuthRepository
和 UserRepository
的类,而 DataSourceBean
用于实现 DataSource
接口的类。此类包含命名身份验证或用户存储库的映射。他们还负责初始化实现此存储库的类。
6.3. 其他存储库
可以实现那些不实现 AuthRepository
或 UserRepository
的存储库。每种类型的自定义存储库都应该有自己的API和自己的接口。
6.3.1. DataSourceAware
自定义存储库应实现它们自己的接口,指定其API。此接口应扩展 DataSourceAware
接口,该接口是自定义存储库需要实现的基本接口。 DataSourceAware
有一个 setDataSource()
方法,它将与数据源实例一起调用以初始化自定义存储库的实例。实现应该用 @Repository.Meta
实现注释,以自动选择正确类型的 DataSource
实现。
6.3.2. MDRepositoryBean
需要创建一个扩展 MDRepositoryBean
的类,实现与自定义存储库相同的自定义接口。此类将是一个多域池,允许您为每个域单独实现自定义存储库。此外,它将负责创建和初始化您的自定义存储库实例。