WSO2 Identity Server - 自定义JDBC用户存储管理器 - JDBC池

时间:2015-10-28 17:47:02

标签: oracle jdbc wso2 connection-pooling wso2is

WSO2 Identity Server 5.0.0(以及一些补丁;))

自定义JDBC用户存储管理器(JDBCUserStoreManager的子节点)似乎不使用JDBC池。我注意到我可以结束会话关闭错误和sql异常,而Identity Server本身仍然可以通过其单独的数据库连接(已配置的池)运行。

所以我想我有两个问题:

  1. 在链的某个地方,是否有JDBCUserStoreManager的JDBC池?如果是这样,是否有办法更有力地配置那个人?
  2. 我可以在master-datasources.xml中创建另一个JDBC数据源,我的自定义JDBC用户存储管理可以引用它吗?

2 个答案:

答案 0 :(得分:1)

您可以导入Carbon数据源并使用它们(它们带有内置池,无需担心任何配置等),而不是使用您自己的数据源/连接。您可以通过直接调用ndatasource组件以编程方式访问它们,也可以通过JNDI访问它们。

直接从ndatasource组件访问它们:
依赖:

<dependency>
  <groupId>org.wso2.carbon</groupId>
  <artifactId>org.wso2.carbon.ndatasource.core</artifactId>
  <version>add_correct_version_here</version>
</dependency>

(您可以检查存储库/组件/插件以找出上述依赖项的正确版本)
您可以在this code中注入DataSourceService(@ scr.reference标记指的是您需要注入的服务,这使用maven scr插件在构建包时解析这些依赖项。)

请注意,当您使用此方法时,您必须将jar构建为OSGi包,因为它使用声明性服务(并且必须将其放在存储库/组件/ dropins中)。否则,依赖关系不会在运行时注入。

接下来,您可以访问所有数据源:

List<CarbonDataSource> dataSources = dataSourceService.getAllDataSources();

答案 1 :(得分:1)

Rajeev的回答非常有见地,有助于调查和评估我应该做些什么。但是,我并没有最终使用那条路线。 :)

我最后查看了Identity Server和Carbon源代码,发现JDBCUserStoreManager最终创建了一个JDBC池,该JDBC池由您为该管理器设置的属性配置。我的自定义用户存储管理器有一个名为CustomUserStoreConstants的类,默认调用setMandatoryProperty来设置:

  • JDBCRealmConstants.DRIVER_NAME
  • JDBCRealmConstants.URL
  • JDBCRealmConstants.USER_NAME
  • JDBCRealmConstants.PASSWORD

所以池配置了这些值,但是它就是......没有别的。所以难怪它没有幸存下来!

原来,代码设置了这个,如果它在config参数中找到了JDBCRealmConstants.DATASOURCE的值,它只会加载该数据源并忽略任何其他参数集。看到这一点,我摆脱了上面列出的4个参数,并强制我的自定义用户存储只允许使用DATASOURCE,并且我在代码中设置了默认的JNDI名称,我将命名该数据源。通过这种方式,我能够为master-datasources.xml中的所有参数配置我的JDBC池,例如testOnBorrow,validationQuery,validationInterval等。现在唯一需要改变的是数据源在该文件中的配置。

我使用master-datasources.xml中的数据源的另一个原因是我没有必要在我的自定义用户存储的代码中决定我想拥有或不拥有哪些参数,并且只需在xml文件很容易。这对于配置的可移植性以及部署和调试的IT参与确实具有优势。我已经在此文件中有其他数据源用于IS部署。

所有人都说,我的用户商店现在经营着整个晚上和周末。 :)