JDBC-Provider und Datenquelle mit der JMX-API erstellen und konfigurieren
Wenn Ihre Anwendung den Zugriff auf eine relationale Datenbank über die JDBC-API (Java™ Database Connectivity) benötigt, können Sie die erforderlichen JDBC-Provider- und Datenquellenobjekte exklusiv mit der JMX-API (Java Management Extensions) erstellen. Alternativ dazu können Sie die JMX-API zusammen mit dem Scripting-Tool wsadmin verwenden.
Informationen zu diesem Vorgang

Beispiel
Die für den Zugriff auf relationale Datenbanken erforderlichen Konfigurationsobjekte mit der JMX-API erstellen. Dieses Codebeispiel veranschaulicht die Verwendung der MBeans von WebSphere Application Server zum Erstellen und Konfigurieren der Objekte, die für den Zugriff von einer Unternehmensanwendung auf eine relationale Datenbank erforderlich sind. Zu diesen Objekten gehören ein XA- oder nicht-XA-fähiger JDBC-Provider, eine Datenquelle, ein Authentifizierungsalias und wahlweise eine CMP-Verbindungsfactory (Container Managed Persistence). Details zur Konfiguration dieser Optionen finden Sie in den Kommentaren im Header des folgenden Quellcodes. Der Beispielcode zeigt außerdem, wie die Datenquellen-MBean dazu verwendet wird, die Konfigurationsänderungen erneut in den aktiven Server zu laden.
![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)
![[z/OS]](../images/ngzos.gif)
/**
* COPYRIGHTLIZENZ: Diese Veröffentlichung enthält Beispielcode, der als Quellcode
* zur Verfügung gestellt wird. Sie dürfen dieses Beispielprogramm kostenlos kopieren,
* ändern und verteilen, wenn dies zu dem Zweck geschieht, Anwendungsprogramme zu entwickeln,
* zu verwenden, zu vermarkten oder zu verteilen, die mit der Anwendungsprogrammierschnittstelle
* für die Betriebsumgebung konform sind, für die der Beispielcode geschrieben wird.
* Ungeachtet gegenteiliger Regelungen stellt IBM den Beispielquellcode ohne Wartung (auf "as-is"-Basis)
* zur Verfügung und übernimmt keinerlei Gewährleistung (ausdrücklich oder stillschweigend) einschließlich,
* aber nicht beschränkt auf die Handelsüblichkeit, die zufriedenstellende Qualität, die Verwendungsfähigkeit
* für einen bestimmten Zweck, das Eigentumsrecht und die Freiheit von Rechten Dritter.
IBM haftet nicht für unmittelbare,
* mittelbare oder Folgeschäden, die aus der Nutzung oder dem Betrieb des
* Beispielquellcodes entstehen. IBM ist nicht verpflichtet, Wartungsmaßnahmen
* für den Beispielquellcode durchzuführen oder Supportleistungen, Updates,
* funktionale Erweiterungen oder Modifikationen für den Beispielquellcode
* bereitzustellen.
*
* © Copyright IBM Corp. 2011.
* Alle Rechte vorbehalten. Lizenziertes Material - Eigentum von IBM.
*/
import java.util.Properties;
import java.util.Set;
import javax.management.Attribute;
import javax.management.AttributeList;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import com.ibm.websphere.management.AdminClient;
import com.ibm.websphere.management.AdminClientFactory;
import com.ibm.websphere.management.Session;
import com.ibm.websphere.management.configservice.ConfigServiceHelper;
import com.ibm.websphere.management.configservice.SystemAttributes;
import com.ibm.websphere.management.exception.ConnectorException;
/**
* Dieser Beispielcode veranschaulicht die Verwendung der WebSphere-JMX-APIs zum Erstellen
* eines JDBC-Providers und einer Datenquelle mit einem Authentifizierungsalias.
* Dieser Beispielcode kann für Folgendes konfiguriert werden:
* - Erstellen von Objekten auf Knoten- oder Serverebene
* - Erstellen eines XA- oder Nicht-XA-JDBC-Providers
* - Erstellen einer Verbindungsfactory, damit die Datenquelle von CMP-Beans
* verwendet werden kann, da die Datenquelle andernfalls von BMP-Beans,
* Session-Beans oder Servlets verwendet wird.
* Diese werden durch Festlegen des Wertes für Klassenkonstanten konfiguriert
* (siehe "Programmkonfigurationseinstellungen" weiter unten).
* Der JDBC-Provider, die Datenquelle und die CMP-Verbindungsfactory (falls
* konfiguriert) werden entsprechend dem bewährten Verfahren mit vordefinierten
* Schablonen erstellt.
* Anmerkung: Es gibt Schablonen, die gleichzeitig den JDBC-Provider und eine
* Datenquelle erstellen. In diesem Beispiel werden beide Objekte aus Gründen der
* Vollständigkeit absichtlich getrennt erstellt.
*
* Zum Kompilieren und Ausführen dieses Programms, stellen Sie das "admin-client"-Paket
* was_install_root\runtimes\com.ibm.ws.admin.client_9.0.jar
* zusätzlich zu der Klassendatei, die Sie durch Erstellen dieser Quellendatei erhalten,
* in den Klassenpfad.
*
* Nach dem Kompilieren wird dieses Programm in seiner eigenen JVM ausgeführt und
* interagiert über die WebSphere-Admin-Client-API fern oder lokal mit einem
* WebSphere Application Server, um die oben beschriebenen JDBC-Ressourcen zu erstellen.
*/
public class JDBCResourcesWithJMX {
// Programmkonfigurationseinstellungen
// Bei Angabe von "true" wird ein XA-fähiger JDBC-Provider erstellt. Andernfalls wird
// ein nicht-XA-fähiger JDBC-Provider erstellt.
private static final boolean createXAJDBCProvider = true;
// Bei Angabe von "true", wird eine CMP-Verbindungsfactory für die Verwendung
// durch CMP-Beans erstellt.
// Andernfalls kann die erstellte Datenquelle mit BMP-Beans, Session-Beans
// oder Servlets verwendet werden.
private static final boolean createCMPConnectionFactory = true;
// Bei Angabe von "true" werden Objekte auf der Knotenebene erstellt.
// Andernfalls werden Objekte auf der Serverebene erstellt.
private static final boolean createNodeScopedCfgObjs = true;
// Ende der Programmkonfigurationseinstellungen
private static final String jdbcProviderName =
"Sample DB2 JDBC Provider";
private static final String jdbcProviderTemplateNameXA =
"DB2 Using IBM JCC Driver Provider Only (XA)";
private static final String jdbcProviderTemplateName =
"DB2 Using IBM JCC Driver Provider Only";
// ein Alias für Authentifizierungsdaten
private static final String authDataAlias = "db2admin";
private static final String authAliasDescription =
"Sample authentication alias";
private static final String authAliasUserID = "db2admin"; // Benutzer-ID
private static final String authAliasPassword = "db2admin"; // Kennwort
private static final String dataSourceProviderTemplateNameXA =
"DB2 Using IBM JCC Driver - XA DataSource";
private static final String dataSourceHelperClassName =
"com.ibm.websphere.rsadapter.DB2DataStoreHelper";
private static final String cmpConnFactTemplateName =
"CMPConnectorFactory";
// Anzeigename für Datenquelle und Verbindungsfactory
private static final String dataSourceName = "SampleDataSource";
private static final String dataSourceTemplateName =
"DB2 Using IBM JCC Driver - DataSource";
@SuppressWarnings("unused")
private static final String dbName = "SamplesDB"; // der Datenbankname
public static void main(String[] args) {
JDBCResourcesWithJMX cds = new JDBCResourcesWithJMX();
try {
cds.run(args);
}
catch (Exception ex) {
System.out.println("Caught exception: " + ex);
ex.printStackTrace();
}
}
/**
* Erstellt einen JDBC-Provider, eine Datenquelle, einen Authentifizierungsalias und
* eine Verbindungsfactory, falls eine entsprechende Konfiguration vorgenommen wurde.
* Weder die Datenquelle noch die Verbindungsfactory (falls erstellt) werden in den Namespace gebunden, bevor der Server
* erneut gestartet wird oder bevor eine Anwendung, die ihn verwendet, gestartet wird.
*/
private void run(String[] args) throws Exception {
// Den AdminClient initialisieren.
Properties adminProps = new Properties();
adminProps.setProperty(AdminClient.CONNECTOR_TYPE,
AdminClient.CONNECTOR_TYPE_SOAP);
adminProps.setProperty(AdminClient.CONNECTOR_HOST, "localhost");
adminProps.setProperty(AdminClient.CONNECTOR_PORT, "8880");
AdminClient adminClient =
AdminClientFactory.createAdminClient(adminProps);
Session session = new Session();
// Beim Erstellen von Konfigurationsobjekten Knoten als Geltungsbereich verwenden.
ObjectName scope = null;
if (createNodeScopedCfgObjs) {
scope = ConfigServiceHelper.createObjectName(null, "Node", null);
}
else { // wenn nicht der Server als Geltungsbereich konfiguriert ist
scope = ConfigServiceHelper.createObjectName(null, "Server",
"server1");
}
// MBean ConfigService abrufen.
ObjectName configServiceMBean =
retrieveJMXMBean(adminClient, "ConfigService");
// MBean-Operation queryConfigObjects aufrufen,
// um einen Server oder Knoten zu finden.
ObjectName[] matches = (ObjectName[])adminClient.invoke(
configServiceMBean,
"queryConfigObjects",
// Parameter für die Operation
new Object[] {session, null, scope, null},
// Signatur der aufzurufenden Bean-Methode
new String[] {"com.ibm.websphere.management.Session",
"javax.management.ObjectName",
"javax.management.ObjectName",
"javax.management.QueryExp"});
scope = matches[0]; // das erste gefundene Server- oder Knotenobjekt verwenden.
// JDBC-Provider im angegebenen Geltungsbereich erstellen.
ObjectName jdbcProv =
createJDBCProvider(adminClient, session, scope,
configServiceMBean);
/// Authentifizierungsalias für die Datenquelle erstellen
createAuthAlias(adminClient, session, configServiceMBean);
// Integrierten WebSphere Relational Resource Adapter (RRA) in
// dem Geltungsbereich aufrufen, der oben angegeben wurde.
ObjectName rra =
ConfigServiceHelper.createObjectName(null, "J2CResourceAdapter",
null);
// MBean-Operation queryConfigObjects aufrufen,
matches = (ObjectName[])adminClient.invoke(
configServiceMBean,
"queryConfigObjects",
// Parameter für die Operation
new Object[] {session, scope, rra, null},
// Signatur der aufzurufenden Bean-Methode
new String[] {"com.ibm.websphere.management.Session",
"javax.management.ObjectName",
"javax.management.ObjectName",
"javax.management.QueryExp"});
rra = matches[0]; // das erste in diesem Geltungsbereich gefundene Objekt verwenden.
// Datenquelle mit dem JDBC-Provider erstellen.
ObjectName dataSource =
createDataSource(adminClient, session, scope, jdbcProv, rra,
configServiceMBean);
// Falls konfiguriert, eine Verbindungsfactory im integrierten
// WebSphere RRA für die Verwendung durch CMP-Beans erstellen.
if (createCMPConnectionFactory) {
createConnectionFactory(adminClient, session, rra, dataSource,
configServiceMBean);
}
// MBean-Operation save aufrufen, um die Änderungen im Konfigurationsrepository
// persistent zu speichern. Wenn als Plattform ND verwendet wird, muss
// außerdem eine Knotensynchronisation ausgeführt werden.
adminClient.invoke(
configServiceMBean,
"save",
// Parameter für die Operation
new Object[] {session, false},
// Signatur der aufzurufenden Bean-Methode
new String[] {"com.ibm.websphere.management.Session",
"boolean"});
System.out.println("Configuration changes saved");
// Datenquellen-MBean erneut laden.
reload(adminClient, session);
}
/**
* MBean ConfigService zum Erstellen eines Authentifizierungsalias verwenden.
*/
private void createAuthAlias(AdminClient adminClient, Session session,
ObjectName configServiceMBean) throws Exception {
// Das übergeordnete Sicherheitsobjekt ermitteln.
ObjectName security = ConfigServiceHelper.createObjectName(null, "Security", null);
// MBean-Operation queryConfigObjects aufrufen,
Object result = adminClient.invoke(
configServiceMBean,
"queryConfigObjects",
// Parameter für die Operation
new Object[] {session, null, security, null},
// Signatur der aufzurufenden Bean-Methode
new String[] {"com.ibm.websphere.management.Session",
"javax.management.ObjectName",
"javax.management.ObjectName",
"javax.management.QueryExp"});
security = ((ObjectName[])result)[0];
// Die Attributliste vorbereiten.
AttributeList authAliasAttrs = new AttributeList();
authAliasAttrs.add(new Attribute("alias", authDataAlias));
authAliasAttrs.add(new Attribute("userId", authAliasUserID));
authAliasAttrs.add(new Attribute("password", authAliasPassword));
authAliasAttrs.add(
new Attribute("description", authAliasDescription));
// JMX-Operation createConfigData aufrufen.
result = adminClient.invoke(configServiceMBean, "createConfigData",
// Parameter für die Operation
new Object[] {session, security, "authDataEntries",
"JAASAuthData", authAliasAttrs},
// Signatur der aufzurufenden Bean-Methode
new String[] {"com.ibm.websphere.management.Session",
"javax.management.ObjectName",
"java.lang.String",
"java.lang.String",
"javax.management.AttributeList"});
System.out.println("Created authorization alias: " + authDataAlias);
}
/*
* MBean ConfigService zum Erstellen einer CMP-Verbindungsfactory
* im integrierten WebSphere RRA verwenden.
*/
private void createConnectionFactory(AdminClient adminClient,
Session session, ObjectName rra, ObjectName dataSource,
ObjectName configServiceMBean)
throws Exception {
// Die Attributliste vorbereiten.
AttributeList cfAttrs = new AttributeList();
cfAttrs.add(new Attribute("name", dataSourceName + "_CF"));
cfAttrs.add(new Attribute("authMechanismPreference","BASIC_PASSWORD"));
cfAttrs.add(new Attribute("authDataAlias",authDataAlias));
cfAttrs.add(new Attribute("cmpDatasource", dataSource ));
// JMX-Operation queryTemplates aufrufen.
Object result = adminClient.invoke(
configServiceMBean,
"queryTemplates",
// Parameter für die Operation
new Object[] {session, "CMPConnectorFactory",},
// Signatur der aufzurufenden Bean-Methode
new String[] {"com.ibm.websphere.management.Session",
"java.lang.String"});
// Schablone mit dem gewünschten Anzeigenamensattribut finden.
ObjectName connFactTemplate = null;
if (result != null) {
ObjectName[] templates = (ObjectName[])result;
for (ObjectName template: templates) {
if (cmpConnFactTemplateName.equals(template.getKeyProperty(
SystemAttributes._WEBSPHERE_CONFIG_DATA_DISPLAY_NAME))) {
connFactTemplate = template;
}
}
}
// Die oben gefundene Schablone verwenden, um die CMP-Verbindungsfactory zu erstellen.
// JMX-Operation createConfigDataByTemplate aufrufen.
adminClient.invoke(
configServiceMBean,
"createConfigDataByTemplate",
// Parameter für die Operation
new Object[] {session, rra, "CMPConnectorFactory",
cfAttrs, connFactTemplate},
// Signatur der aufzurufenden Bean-Methode
new String[] {"com.ibm.websphere.management.Session",
"javax.management.ObjectName",
"java.lang.String",
"javax.management.AttributeList",
"javax.management.ObjectName"
});
System.out.println("Created CMP Connection factory: " +
dataSourceName + "_CF");
}
/**
* MBean ConfigService verwenden, um von einer der vordefinierten
* Schablonen eine Datenquelle im angegebenen Geltungsbereich zu erstellen.
*/
private ObjectName createDataSource(AdminClient adminClient,
Session session, ObjectName scope, ObjectName jdbcProv,
ObjectName rra, ObjectName configServiceMBean)
throws Exception {
// Der zu verwendende Schablonenname, der davon abhängig ist,
// ob dieses Beispiel für die Verwendung einer XA-Datenquelle konfiguriert
// ist oder nicht.
String templateName = dataSourceProviderTemplateNameXA;
if (!createXAJDBCProvider) {
templateName = dataSourceTemplateName;
}
// Das Attribut DataSource.relationResourceAdapter ist
// zusätzlich zu den Attributen in der Schablone erforderlich.
AttributeList dsAttrs = new AttributeList();
dsAttrs.add(new Attribute("name", dataSourceName));
// andere Eigenschaften in der Schablone überschreiben
dsAttrs.add(new Attribute("description", dataSourceName));
dsAttrs.add(new Attribute("jndiName", "jdbc/" + dataSourceName));
dsAttrs.add(new Attribute("datasourceHelperClassname",
dataSourceHelperClassName));
// Verbindung zum integrierten WebSphere RRA herstellen.
dsAttrs.add(new Attribute("relationalResourceAdapter", rra));
dsAttrs.add(new Attribute("authDataAlias",authDataAlias));
// JMX-Operation queryTemplates aufrufen.
Object result = adminClient.invoke(
configServiceMBean,
"queryTemplates",
// Parameter für die Operation
new Object[] {session, "DataSource"},
// Signatur der aufzurufenden Bean-Methode
new String[] {"com.ibm.websphere.management.Session",
"java.lang.String"});
// Schablone mit dem gewünschten Anzeigenamensattribut finden.
ObjectName db2Template = null;
if (result != null) {
ObjectName[] templates = (ObjectName[])result;
for (ObjectName template: templates) {
if (templateName.equals(template.getKeyProperty(
SystemAttributes._WEBSPHERE_CONFIG_DATA_DISPLAY_NAME))) {
db2Template = template;
}
}
}
// Die oben gefundene Schablone verwenden, um die Datenquelle zu erstellen.
// JMX-Operation createConfigDataByTemplate aufrufen.
ObjectName dataSource = (ObjectName)adminClient.invoke(
configServiceMBean,
"createConfigDataByTemplate",
// Parameter für die Operation
new Object[] {session, jdbcProv, "DataSource",
dsAttrs, db2Template},
// Signatur der aufzurufenden Bean-Methode
new String[] {"com.ibm.websphere.management.Session",
"javax.management.ObjectName",
"java.lang.String",
"javax.management.AttributeList",
"javax.management.ObjectName"
});
System.out.println("Created data source: " + dataSourceName +
" at " + (createNodeScopedCfgObjs ? "node" : "server") +
" scope");
return dataSource;
}
/**
* MBean DataSourceCfgHelper abrufen und reload() dafür aufrufen.
* Dadurch werden die neu erstellten Konfigurationsobjekte
* verfügbar.
*/
private void reload(AdminClient adminClient, Session session)
throws Exception {
// MBean DataSourceCfgHelper abrufen.
ObjectName mBean =
retrieveJMXMBean(adminClient, "DataSourceCfgHelper");
// Operation reload aufrufen.
Object result =
adminClient.invoke(
mBean,
"reload",
new Object[] {},
new String[] {});
if (result != null) {
System.err.println(
"DataSourceCfgHelper MBean reload operation failed: "
+ result);
}
else {
System.out.println("Reloaded DataSourceCfgHelper MBean");
}
}
/**
* MBean ConfigService verwenden, um von einer der vordefinierten
* Schablonen einen JDBC-Provider im angegebenen Geltungsbereich zu erstellen.
*/
private ObjectName createJDBCProvider(
AdminClient adminClient, Session session, ObjectName scope,
ObjectName configServiceMBean) throws Exception {
// Der zu verwendende Schablonenname, der davon abhängig ist,
// ob dieses Beispiel für die Verwendung eines XA-JDBC-Providers konfiguriert
// ist oder nicht.
String templateName = jdbcProviderTemplateNameXA;
if (!createXAJDBCProvider) {
templateName = jdbcProviderTemplateName;
}
// JMX-Operation queryTemplates aufrufen.
Object result = adminClient.invoke(
configServiceMBean,
"queryTemplates",
// Parameter für die Operation
new Object[] {session, "JDBCProvider"},
// Signatur der aufzurufenden Bean-Methode
new String[] {"com.ibm.websphere.management.Session",
"java.lang.String"});
// Schablone mit dem gewünschten Anzeigenamensattribut finden.
ObjectName db2Template = null;
if (result != null) {
ObjectName[] templates = (ObjectName[])result;
for (ObjectName template: templates) {
if (templateName.equals(template.getKeyProperty(
SystemAttributes._WEBSPHERE_CONFIG_DATA_DISPLAY_NAME))) {
db2Template = template;
}
}
}
// Das Attribut JDBCProvider.name ist zusätzlich zu den
// Attributen in der Schablone erforderlich.
AttributeList provAttrs = new AttributeList();
provAttrs.add(new Attribute("name", jdbcProviderName
+ (createXAJDBCProvider ? " (XA)" : "")));
// Die Beschreibung in der Schablone überschreiben.
provAttrs.add(new Attribute("description", jdbcProviderName
+ (createXAJDBCProvider ? " (XA)" : "")));
// Die oben gefundene Schablone verwenden, um den JDBC-Provider zu erstellen.
// JMX-Operation createConfigDataByTemplate aufrufen.
ObjectName jdbcProvider = (ObjectName)adminClient.invoke(
configServiceMBean,
"createConfigDataByTemplate",
// Parameter für die Operation
new Object[] {session, scope, "JDBCProvider",
provAttrs, db2Template},
// Signatur der aufzurufenden Bean-Methode
new String[] {"com.ibm.websphere.management.Session",
"javax.management.ObjectName",
"java.lang.String",
"javax.management.AttributeList",
"javax.management.ObjectName"
});
System.out.println("Created JDBC provider: " + jdbcProviderName
+ (createXAJDBCProvider ? " (XA)" : "") +
" at " + (createNodeScopedCfgObjs ? "node" : "server") +
" scope");
return jdbcProvider;
}
// angegebene MBean suchen
@SuppressWarnings("unchecked")
private ObjectName retrieveJMXMBean(AdminClient adminClient,
String beanName)
throws MalformedObjectNameException, ConnectorException {
// MBean ConfigService abrufen.
ObjectName mBean = null;
ObjectName queryName =
new ObjectName("WebSphere:type=" + beanName + ",*");
Set names = adminClient.queryNames(queryName, null);
if (!names.isEmpty()) {
mBean = (ObjectName) names.iterator().next();
}
return mBean;
}
}