Juan Moreno
Juan Moreno

Reputation: 2795

How create datasource programmatically in Wildfly 10?

I have searched for alternatives for creating datasource in Wildfly, but I don't find alternatives to create it programmatically, Is it possible?

Upvotes: 3

Views: 2986

Answers (2)

Thor
Thor

Reputation: 6656

The following example is tested with JBoss-EAP 7.0 (with Wildfly). Pure Wildfly will probably have a different maven dependency that provides ModelControllerClient. This example is using the following Maven Dependency (from repository https://maven.repository.redhat.com/ga):

<dependency>
  <groupId>org.wildfly.core</groupId>
  <artifactId>wildfly-controller-client</artifactId>
  <version>2.1.13.Final-redhat-1</version>
</dependency>

I assume that you already have configured a datasource manually and the driver module is in place jboss/modules/system/layers, the following examples use a MySQL driver. To add the driver to the JBoss configuration you have to execute the follwowing code:

ModelControllerClient client = ModelControllerClient.Factory.create(InetAddress.getByName("localhost"), 9990);

ModelNode request = new ModelNode();
request.get(ClientConstants.OP).set(ClientConstants.ADD);
request.get(ClientConstants.OP_ADDR).add("subsystem","datasources");
request.get(ClientConstants.OP_ADDR).add("jdbc-driver","mysql");
request.get("driver-name").set("mysql");
request.get("driver-module-name").set("com.mysql");
request.get("driver-xa-datasource-class-name").set("com.mysql.jdbc.jdbc2.optional.MysqlXADataSource");
client.execute(new OperationBuilder(request).build());
client.close();

This will add the driver to your configuration:

<driver name="mysql" module="com.mysql">
  <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
</driver>

Adding the datasource is quite similar than adding a driver:

ModelControllerClient client = ModelControllerClient.Factory.create(InetAddress.getByName("localhost"), 9990);

ModelNode request = new ModelNode();
request.get(ClientConstants.OP).set(ClientConstants.ADD);
request.get(ClientConstants.OP_ADDR).add("subsystem","datasources");
request.get(ClientConstants.OP_ADDR).add("data-source","TestDs");
request.get("jta").set(true);
request.get("jndi-name").set("java:jboss/datasources/TestDs");
request.get("pool-name").set("TestDs");
request.get("use-java-context").set(true);
request.get("use-ccm").set(true);

request.get("connection-url").set("jdbc:mysql://localhost/test");
request.get("driver-name").set("mysql");
request.get("transaction-isolation").set("TRANSACTION_READ_COMMITTED");

request.get("min-pool-size").set(5);
request.get("max-pool-size").set(20);
request.get("pool-prefill").set(true);
request.get("pool-use-strict-min").set(false);
request.get("flush-strategy").set("FailingConnectionOnly");

request.get("user-name").set("test");
request.get("password").set("test");

request.get("prepared-statements-cache-size").set(32);
request.get("share-prepared-statements").set(true);

client.execute(new OperationBuilder(request).build());
client.close();

With this code the datasource is programatically created:

<datasource jta="true" jndi-name="java:jboss/datasources/TestDs" pool-name="TestDs" use-java-context="true" use-ccm="true">
  <connection-url>jdbc:mysql://localhost/test</connection-url>
  <driver>mysql</driver>
  <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
  <pool>
    <min-pool-size>5</min-pool-size>
    <max-pool-size>20</max-pool-size>
    <prefill>true</prefill>
    <use-strict-min>false</use-strict-min>
    <flush-strategy>FailingConnectionOnly</flush-strategy>
  </pool>
  <security>
    <user-name>test</user-name>
    <password>test</password>
  </security>
  <statement>
    <prepared-statement-cache-size>32</prepared-statement-cache-size>
    <share-prepared-statements>true</share-prepared-statements>
  </statement>
</datasource>

Upvotes: 5

siom
siom

Reputation: 1817

You can use Wildfly's CLI tool to create a datasource, as it is described here. If the CLI tool is not sufficient for you, you can use the native management API directly, as explained for example here.

Upvotes: 0

Related Questions