6 Mayıs 2022 Cuma

Wildfly JNDI DataSource Ekleme

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 Plugin
Build-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.ExceptionInInitializerError
at 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
<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>
Bunu test etmek için şöyle yaparız
>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>

Bean Validation @GroupSequence Anotasyonu

Örnek Elimizde şöyle bir kod olsun public class SampleRequest {   @NotNull   LocalDate startDate;   @NotNull   LocalDate endDate;   @AssertT...