WSO2 身份服务器 - 自定义 JDBC 用户存储管理器 - JDBC 池
WSO2 Identity Server - Custom JDBC User Store Manager - JDBC Pools
WSO2 身份服务器 5.0.0(和一些补丁 ;))
自定义 JDBC 用户存储管理器(JDBCUserStoreManager 的子项)似乎没有使用 JDBC 池。我注意到我可能会结束会话关闭错误和 sql 异常,而身份服务器本身仍然可以通过其单独的数据库连接(已配置的池)正常运行。
所以我想我对此有两个问题:
- 链上的某个地方,JDBC UserStoreManager 是否有一个 JDBC 池?如果是这样,有什么方法可以更强大地配置那个人吗?
- 我可以在 master-datasources.xml 中创建另一个 JDBC 数据源,我的自定义 JDBC 用户存储管理可以引用它吗?
您可以导入 Carbon 数据源并使用它们(它们带有内置池,无需担心任何配置等),而不是使用您自己的 datasources/connections。您可以通过直接调用 ndatasource 组件以编程方式访问它们,也可以通过 JNDI 访问它们。
直接从 ndatasource 组件访问它们:
依赖:
<dependency>
<groupId>org.wso2.carbon</groupId>
<artifactId>org.wso2.carbon.ndatasource.core</artifactId>
<version>add_correct_version_here</version>
</dependency>
(您可以检查 repository/components/plugins 以找出上述依赖项的正确版本)
您可以像 this code 一样注入 DataSourceService(@scr.reference 标记指的是您需要注入的服务,这在构建包时使用 maven scr 插件来解析这些依赖项)。
请注意,当您遵循此方法时,您必须将 jar 构建为 OSGi 包,因为它使用声明性服务(并且必须将其放在 repository/components/dropins 中)。否则不会在运行时注入依赖项。
接下来,您可以访问所有数据源:
List<CarbonDataSource> dataSources = dataSourceService.getAllDataSources();
Rajeev 的回答非常有见地,有助于调查和评估我应该做什么。但是,我最终没有使用那条路线。 :)
我最终查看了 Identity Server 和 Carbon 源代码,发现 JDBCUserStoreManager 确实最终创建了一个 JDBC 池,该池由您为该管理器设置的属性配置。我的自定义用户商店管理器有一个名为 CustomUserStoreConstants 的 class,它默认调用 setMandatoryProperty 来设置:
- JDBCRealmConstants.DRIVER_NAME
- JDBCRealmConstants.URL
- JDBCRealmConstants.USER_NAME
- JDBCRealmConstants.PASSWORD
所以池是用这些值配置的,但仅此而已……没有别的。所以难怪它没能熬过那个晚上!
事实证明,设置此代码的代码如果在配置参数中找到 JDBCRealmConstants.DATASOURCE 的值,它只会加载该数据源并忽略任何其他参数集。看到这一点,我摆脱了上面列出的那 4 个参数,并强制我的自定义用户存储只允许有一个数据源,我在代码中将它设置为默认的 JNDI 名称,我将始终命名该数据源。这样,我就可以在 master-datasources.xml 中使用所有参数(例如 testOnBorrow、validationQuery、validationInterval 等)为此数据源配置我的 JDBC 池。现在唯一需要更改的是该文件中的数据源配置。
我在 master-datasources.xml 中使用数据源的另一个原因是我不必在自定义用户存储的代码中决定我想要或不想要哪些参数,只需管理这一切都在 xml 文件中很容易。这在配置的可移植性和 IT 参与部署和调试方面确实具有优势。我在这个文件中已经有用于 IS 部署的其他数据源。
总而言之,我的用户商店现在要熬夜和周末。 :)
WSO2 身份服务器 5.0.0(和一些补丁 ;))
自定义 JDBC 用户存储管理器(JDBCUserStoreManager 的子项)似乎没有使用 JDBC 池。我注意到我可能会结束会话关闭错误和 sql 异常,而身份服务器本身仍然可以通过其单独的数据库连接(已配置的池)正常运行。
所以我想我对此有两个问题:
- 链上的某个地方,JDBC UserStoreManager 是否有一个 JDBC 池?如果是这样,有什么方法可以更强大地配置那个人吗?
- 我可以在 master-datasources.xml 中创建另一个 JDBC 数据源,我的自定义 JDBC 用户存储管理可以引用它吗?
您可以导入 Carbon 数据源并使用它们(它们带有内置池,无需担心任何配置等),而不是使用您自己的 datasources/connections。您可以通过直接调用 ndatasource 组件以编程方式访问它们,也可以通过 JNDI 访问它们。
直接从 ndatasource 组件访问它们:
依赖:
<dependency>
<groupId>org.wso2.carbon</groupId>
<artifactId>org.wso2.carbon.ndatasource.core</artifactId>
<version>add_correct_version_here</version>
</dependency>
(您可以检查 repository/components/plugins 以找出上述依赖项的正确版本)
您可以像 this code 一样注入 DataSourceService(@scr.reference 标记指的是您需要注入的服务,这在构建包时使用 maven scr 插件来解析这些依赖项)。
请注意,当您遵循此方法时,您必须将 jar 构建为 OSGi 包,因为它使用声明性服务(并且必须将其放在 repository/components/dropins 中)。否则不会在运行时注入依赖项。
接下来,您可以访问所有数据源:
List<CarbonDataSource> dataSources = dataSourceService.getAllDataSources();
Rajeev 的回答非常有见地,有助于调查和评估我应该做什么。但是,我最终没有使用那条路线。 :)
我最终查看了 Identity Server 和 Carbon 源代码,发现 JDBCUserStoreManager 确实最终创建了一个 JDBC 池,该池由您为该管理器设置的属性配置。我的自定义用户商店管理器有一个名为 CustomUserStoreConstants 的 class,它默认调用 setMandatoryProperty 来设置:
- JDBCRealmConstants.DRIVER_NAME
- JDBCRealmConstants.URL
- JDBCRealmConstants.USER_NAME
- JDBCRealmConstants.PASSWORD
所以池是用这些值配置的,但仅此而已……没有别的。所以难怪它没能熬过那个晚上!
事实证明,设置此代码的代码如果在配置参数中找到 JDBCRealmConstants.DATASOURCE 的值,它只会加载该数据源并忽略任何其他参数集。看到这一点,我摆脱了上面列出的那 4 个参数,并强制我的自定义用户存储只允许有一个数据源,我在代码中将它设置为默认的 JNDI 名称,我将始终命名该数据源。这样,我就可以在 master-datasources.xml 中使用所有参数(例如 testOnBorrow、validationQuery、validationInterval 等)为此数据源配置我的 JDBC 池。现在唯一需要更改的是该文件中的数据源配置。
我在 master-datasources.xml 中使用数据源的另一个原因是我不必在自定义用户存储的代码中决定我想要或不想要哪些参数,只需管理这一切都在 xml 文件中很容易。这在配置的可移植性和 IT 参与部署和调试方面确实具有优势。我在这个文件中已经有用于 IS 部署的其他数据源。
总而言之,我的用户商店现在要熬夜和周末。 :)