27 Ocak 2019 Pazar

SpringJMX @ManagedResource Anotasyonu

Giriş
@ManagedResource anotasyonu sınıfa yazılır. @ManagedOperation anotasyonu sınıfın metoduna yazılır

23 Ocak 2019 Çarşamba

HikariDataSource Sınıfı

Giriş
Şu satırı dahil ederiz.
import com.zaxxer.hikari.HikariDataSource;
Bu sınıf HikariConfig'den kalıttığı için hem setter() metodlar sunuyor hem de  HikariConfig alan bir contructor sunuyor.

Kullanım
Normalde bu sınıfı kodla yaratmaya gerek yok. Ancak kodla yapmak istersek şöyle yaparız. Sınıf aslında DataSource olduğu için nihayetinde LocalContainerEntityManagerFactoryBean nesnesine geçilir.
@Bean
public HikariDataSource dataSource() {

  HikariConfig config = new HikariConfig();

  config.setJdbcUrl(databaseUrl);
  config.setUsername(username);
  config.setPassword(password);
  config.setDriverClassName(driverClassName);
  config.setConnectionTimeout(connectionTimeout);
  config.setIdleTimeout(idleTimeout);
  config.setMaximumPoolSize(maxpoolSize);
  config.setMaxLifetime(maxLifeTime);
  config.setMinimumIdle(minIdleConnections);
  //config.setPoolName(poolName);

  return new HikariDataSource(config);
}


@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
  LocalContainerEntityManagerFactoryBean factory = 
    new LocalContainerEntityManagerFactoryBean();
  factory.setDataSource(dataSource());
  factory.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
  factory.setPackagesToScan("com.target.storetaskcount.entity");
  factory.setJpaProperties(additionalProps());
  return factory;
}
Örnek
Şöyle yaparız. Normalde Hikari ayarları spring.datasource.hikari.XXX şeklinde yapılır. Bu kodla tüm ayarları app.datasource altına taşıyoruz
@Configuration
public class PostgresDataSource {
  @Bean
  @ConfigurationProperties("app.datasource")
  public HikariDataSource hikariDataSource() {
    return DataSourceBuilder
      .create()
      .type(HikariDataSource.class)
      .build();
  }
}
constructor
Şöyle yaparız.
@Primary
@Bean(name = "ProdDatasource")
public DataSource datasource() {
  HikariDataSource dataSource = new HikariDataSource();
  dataSource.setDriverClassName("org.postgresql.Driver");
  //       dataSource.setJdbcUrl("jdbc:postgresql://localhost:5432/places");
  dataSource.setUsername("sddsdf");
  dataSource.setPassword("xxx");
  dataSource.setMaximumPoolSize(40);
  dataSource.setMinimumIdle(5);
  return dataSource;
}
constructor - HikariConfig
Properties dosyasından değerleri okumak için kullanılır
Örnek
Şöyle yaparız
void initDatabaseConnectionPool() {
  HikariConfig hikariConfig = new HikariConfig("/database.properties");
  dataSource = new HikariDataSource(hikariConfig);
}
database.properties dosyası şöyledir
jdbcUrl=jdbc:mariadb://localhost:3306/jdbc_demo
dataSource.username=user
dataSource.password=password

Örnek
Şöyle yaparız. Burada değerleri tek bir hamlede HikariDataSource nesnesine geçmek için kullanılıyor
HikariConfig config = new HikariConfig();
config.setJdbcUrl(...);
config.setMaximumPoolSize(...);
config.setMinimumIdle(...);

HikariDataSource dataSource= new HikariDataSource(config);
close metodu
Şöyle yaparız
HikariDataSource dataSource;

void initDatabaseConnectionPool() {
  dataSource = new HikariDataSource();
  dataSource.setJdbcUrl("jdbcUrl=jdbc:mariadb://localhost:3306/jdbc_demo");
  dataSource.setUsername("user");
  dataSource.setPassword("pasword");
}

void closeDatabaseConnectionPool() {
    dataSource.close();
}

void insertData(String name, int rating) throws SQLException {
  try (Connection connection = dataSource.getConnection()) {
    ...
  }
}
getConnection metodu
Şöyle yaparız.
try (Connection conn = dataSource.getConnection();) {
  // execute some query...
}
getConnection metodu - String username + String password
Bu metod SQLFeatureNotSupportedException fırlatıyor çünkü Hikari'nin amacı Hibernate içinden kullanılmak değil, Spring tarafından Hibernate'e DataSource olarak geçilmek.

setMinimumIdle metodu
Şöyle yaparız.
spring:
  profiles: dev
  datasource:
    hikari:
          minimum-idle: 1
          maximum-pool-size: 5
          pool-name: yourPoolName
          auto-commit: false
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://xxx
    username: xx
    password: xx
    maximumPoolSize: 5
    type: com.zaxxer.hikari.HikariDataSource
setPoolName metodu
Şöyle yaparız.
spring:
  application:
    name: miq-batch
  datasource:
    url: jdbc:mysql://localhost:3306/scdf
    username: root
    password: root
    driverClassName: org.mariadb.jdbc.Driver
    testOnBorrow: true
    validationQuery: SELECT 1
    hikari:
      pool-name: SpringBootHikariCP