使用JDBCResourcesWithJMX创建集群范围数据源遇ADMG0007E错误求助
如何在WebSphere中通过JMX创建集群范围的JDBC资源
你遇到的问题是因为WebSphere的配置服务并不支持直接将"Cluster"作为ConfigServiceHelper.createObjectName的配置类型参数——错误提示里的ADMG0007E已经明确说明了这一点。集群范围的配置不能这么直接指定,得换一种方式来实现。
问题根源
WebSphere的配置模型中,ConfigServiceHelper.createObjectName的第二个参数是配置数据类型(比如Node、Server、JDBCProvider这类),而"Cluster"并不是一个有效的配置数据类型。要创建集群范围的资源,你需要先定位到目标集群的配置对象,再以它作为父节点来创建JDBC相关的配置项。
解决方案:以集群为父对象创建配置
下面是修改后的代码示例,展示如何正确创建集群范围的JDBC资源:
AdminClient adminClient = AdminClientFactory.createAdminClient(connectProps); Session session = new Session(); // 1. 先查询目标集群的ObjectName,注意配置类型是"ServerCluster" ObjectName clusterQuery = ConfigServiceHelper.createObjectName(null, "ServerCluster", "ClusterName"); ObjectName[] clusters = adminClient.queryNames(clusterQuery, null); if (clusters != null && clusters.length > 0) { ObjectName clusterObjName = clusters[0]; // 2. 以集群为父对象,创建JDBC Provider(示例) ObjectName jdbcProviderObj = ConfigServiceHelper.createObjectName("JDBCProvider", "MyClusterScopedJDBCProvider"); Properties jdbcProps = new Properties(); jdbcProps.setProperty("name", "MyClusterScopedJDBCProvider"); jdbcProps.setProperty("implementationClassName", "com.ibm.db2.jcc.DB2XADataSource"); jdbcProps.setProperty("description", "JDBC Provider scoped to ClusterName"); // 调用配置服务创建集群范围的配置 adminClient.invoke( ConfigServiceHelper.CONFIG_SERVICE_NAME, "createConfig", new Object[]{clusterObjName, jdbcProviderObj, jdbcProps, ConfigServiceHelper.EMPTY_CONFIG_DATA}, new String[]{ObjectName.class.getName(), ObjectName.class.getName(), Properties.class.getName(), Integer.class.getName()} ); // 同理可以创建DataSource等其他JDBC资源,父对象同样指定为clusterObjName }
关键说明
- 集群在WebSphere配置中的数据类型是
ServerCluster,所以查询集群时要用这个类型,而不是"Cluster"。 - 集群范围的配置本质上是将配置挂载到集群对象下,这样集群内的所有服务器都会继承这个配置。
- 如果你需要创建的是数据源这类依赖JDBC Provider的资源,要确保先创建好集群范围的Provider,再创建对应的数据源,并且数据源的父对象同样设置为集群的ObjectName。
内容的提问来源于stack exchange,提问作者oztur
相关产品推荐
相关产品推荐

