Giriş
Uygulamadan bir DataSource'a erişmek için 3 tane yöntem var.
1. Uygulama içinde tanımlanır
2. Wildfly Üzerinde Modul Olarak Tanımlanır Ancak Wildfly Ayarlarına Driver Eklenmez
3. Wildfly Üzerinde Modul Olarak Tanımlanır ve Wildfly Ayarlarına Driver + DataSource eklenir. Uygulama JNDI üzerinden erişir. Bir örnek burada.
Örnek - MySQL
WILDFLY_HOME/modules/system/layers/base/com/mysql/main/module.xml dosyasında şöyle yaparız
<module xmlns="urn:jboss:module:1.5" name="com.mysql"> <resources> <resource-root path="mysql-connector-java-8.0.17.jar" /> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
Daha sonra
1. Configuration -> Subsystems -> Datasources & Drivers -> JDBC Drivers menüsü ile bir driver eklenir. Ekrandaki bilgiler şöyle
Driver Name : mysql Driver Module Name : com.mysql Driver Class Name : com.mysql.cj.jdbc.Driver Driver XA Datasourc Class Nam : com.mysql.cj.jdbc.MysqlXADataSource
2. Configuration -> Subsystems -> Datasources & Drivers -> Datasources menüsü ile bir XA olmayan datasource eklenir. Buradaki parametreleri veremiyorum. Kendi veri tabanınıza göre ayarlamanız gerekiyor.
Örnek - postgre
$WILDFLY_HOME\modules\org\postgres\main\module.xml dosyasında şöyle yaparız
<?xml version='1.0' encoding='UTF-8'?> <module xmlns="urn:jboss:module:1.1" name="org.postgres"> <resources> <resource-root path="postgresql-9.4-1204-jdbc4.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> <module name="javax.servlet.api" optional="true"/> </dependencies> </module>
DataSource olarak şöyle yaparız
<datasource jta="false" jndi-name="java:jboss/datasources/YourDS" pool-name="YourDS" enabled="true" use-ccm="false"> <connection-url>jdbc:postgresql://localhost:5432/yourDB</connection-url> <driver>postgres</driver> <security> <user-name>user</user-name> <password>pass/password> </security> <validation> <validate-on-match>false</validate-on-match> <background-validation>false</background-validation> </validation> <statement> <share-prepared-statements>false</share-prepared-statements> </statement> </datasource> <drivers> <driver name="postgres" module="org.postgres"> <driver-class>org.postgresql.Driver</driver-class> </driver> </drivers>
Örnek - gridgain-community-8.8.9
Bunu
JDK 8, Wildfly 25 ve standalone.xml ve ignite-core-8.8.9.jar ile denedim ve çalıştı
JDK 11, Wildfly 25 ve standalone.xml ve ignite-core-8.8.9.jar ile denedim ve çalıştı
JDK 16, Wildfly 25 ve standalone.xml ve ignite-core-8.8.9.jar ile denedim ve çalıştı.
jar dosyasına bakınca MANIFEST.MF dosyasında şunu görüyorum. Yani gridgain-community-8.8.9.jar JDK 8 ile derlenmiş.
Created-By: Apache Maven Bundle PluginBuild-Jdk: 1.8.0_291
JDK 16 ile çalışması için bazı ayarlar yapmak gerekiyor. Şöyle yaparız
set JAVA_OPTS=--add-modules jdk.unsupported --add-opens=java.base/java.nio=ALL-UNNAMED
Eğer bunu yapmazsak hata olarak şunu veriyor.
Operation ("add") failed - address: ([("subsystem" => "datasources"),("jdbc-driver" => "ignite")]): java.lang.ExceptionInInitializerErrorat org.apache.ignite@8.8.9//org.apache.ignite.internal.util.IgniteUtils.<clinit>(IgniteUtils.java:865)at org.apache.ignite@8.8.9//org.apache.ignite.lang.IgniteProductVersion.fromString(IgniteProductVersion.java:311)at org.apache.ignite@8.8.9//org.apache.ignite.internal.IgniteVersionUtils.<clinit>(IgniteVersionUtils.java:99)at org.apache.ignite@8.8.9//org.apache.ignite.IgniteJdbcThinDriver.<clinit>(IgniteJdbcThinDriver.java:139)
sebebi de sun.misc.Unsafe sınıfının artık jdk.unsupported içinde olması. Yani artık JDK 8'den sonra direkt kullanılamıyor.
sun.misc.unsafe JDK 11 src.zip dosyasının içinde "jdk.unsupported" dizininde halen bu sınıflar görülebilir. Ancak JDK 11 module' e bir şekilde erişim izni verirken, JDK 16 vermiyor.
JDK 8, Wildfly 12 ve standalone.xml ile denedim ve çalışmadı. Hata olarak şunu veriyor sebebini de bilmiyorum. Her şeyi aynı tutarak ignite-core-2.11.0.jar ile de denedim. Yine aynı hatayı aldım. Aslında Wildfly 12 eski olduğu için de daha fazla uğraşmadım.
Operation ("add") failed - address: ([ ("subsystem" => "datasources"), ("jdbc-driver" => "ignite") ]): java.lang.NoClassDefFoundError: sun/misc/Unsafe at org.apache.ignite.internal.util.IgniteUtils.unsafeByteArrayCopyAvailable(IgniteUtils.java:9413) at org.apache.ignite.internal.util.IgniteUtils.<clinit>(IgniteUtils.java:344) at org.apache.ignite.lang.IgniteProductVersion.fromString(IgniteProductVersion.java:311) at org.apache.ignite.internal.IgniteVersionUtils.<clinit>(IgniteVersionUtils.java:99) at org.apache.ignite.IgniteJdbcThinDriver.<clinit>(IgniteJdbcThinDriver.java:139)
$WILDFLY_HOME\modules\org\apache\ignite\main\module.xml dosyasında şöyle yaparız
<?xml version="1.0" ?> <module xmlns="urn:jboss:module:1.1" name="org.ignite.jdbc"> <resources> <resource-root path="ignite-core-8.8.9.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
Şöyle yaparız. Kendi tanımımda use-java-context ve statistics-enabled yok ancak ekleyince de sorun çıkmıyor
Bunu test etmek için şöyle yaparız<datasources><datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true"use-java-context="true"statistics-enabled="${wildfly.datasources.statistics-enabled: ${wildfly.statistics-enabled:false}}"><connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1; DB_CLOSE_ON_EXIT=FALSE</connection-url><driver>h2</driver><security><user-name>sa</user-name><password>sa</password></security></datasource><datasource jndi-name="java:jboss/datasources/IgniteDS" pool-name="ignitedatasource"><connection-url>jdbc:ignite:thin://localhost:10800/</connection-url><driver>ignite</driver><pool><min-pool-size>1</min-pool-size></pool></datasource><drivers><driver name="h2" module="com.h2database.h2"><xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class></driver><driver name="ignite" module="org.apache.ignite"><driver-class>org.apache.ignite.IgniteJdbcThinDriver</driver-class></driver></drivers></datasources>
>jboss-cli.bat --connect [standalone@localhost:9990 /]/subsystem=datasources/data-source=ignitedatasource: test-connection-in-pool { "outcome" => "success", "result" => [true] }Data Source ve JTA
JTA transaction istiyorsak jta=true yapılmalı
Örnek
Şöyle yaparız
<datasource jta="false" jndi-name="java:/wt/testds" pool-name="testds" enabled="true"
use-ccm="false">
...
</datasource>
Data Source ve statistics-enabled
statistics-enabled true ise Runtime/Datasources altında connection pool için istatistiki bilgiler görülebilir
Örnek
Şöyle yaparız
datasource jndi-name="java:/fooDS" pool-name="fooDS"
statistics-enabled="true"
> .. </datasource>