31 Ocak 2022 Pazartesi

JDBC java.sql.Type Sınıfı - SQL Tipleri ve Java Tipleri Arasında Eşleşme

Giriş
Şu satırı dahil ederiz
import java.sql.Types;
Açıklaması şöyle. Yani Java 8'den sonra java.sql.JDBCType enumeration kullanılır. Aslında bu enumeration da java.sql.SQLType arayüzünü gerçekleştiriyor
With improvements in the API's, as of Java 8 and JDBC 4.2, we have JDBCType and SQLType, ...
java.sql.Types ve Java tipleri arasındaki eşleşme şöyle. Toplam 39 tane SQL tipi var. Bu tablo kısa bir özeti
SQL data type Java data type
BIT                 boolean
TINYINT         byte
SMALLINT         short
INTEGER int
BIGINT         long
REAL         float
FLOAT, DOUBLE double

DATE
TIME
TIMESTAMP         java.sql.Date, java.sql.Time, java.sql.Timestamp

VARCHAR String
BLOB         java.sql.Blob
Örnek
Şöyle yaparız
//Convert ResultSet to Java type
public <T> T convertPrimitive(final Class<T> clazz, final ResultSet resultSet)
   throws QueryResultProcessorException {

  try {
    Object obj = readFromResultSet(clazz, resultSet, 1);
    return assignResult(resultSet, obj);
  } catch (SQLException exception) {
    ...     
  }
}
Yardımcı sınıflar şöyle
//Reads the specified columnNumber from ResultSet and converts it to specified Java type
private <T> Object readFromResultSet(Class<T> clazz, ResultSet rs, Integer columnNumber)
  throws SQLException {
  Object obj = null;
  if (Util.isInteger(clazz)) {
        obj = rs.getInt(columnNumber);
  } else if (Util.isLong(clazz)) {
     obj = rs.getLong(columnNumber);
  } else if (Util.isBoolean(clazz)) {
    obj = rs.getBoolean(columnNumber);
  } else if (Util.isTimestamp(clazz)) {
    obj = rs.getTimestamp(columnNumber);
  } else if (Util.isString(clazz)) {
    obj = rs.getString(columnNumber);
  } else if (Util.isFloat(clazz)) {
     obj = rs.getFloat(columnNumber);
  } else if (Util.isDouble(clazz)) {
    obj = rs.getDouble(columnNumber);
  } else if (Util.isByte(clazz)) {
    obj = rs.getByte(columnNumber);
  } else if (Util.isShort(clazz)) {
    obj = rs.getShort(columnNumber);
  } else if (Util.isSqlDate(clazz)) {
    obj = rs.getDate(columnNumber);
  } else if (Util.isChar(clazz)) {
    String val = rs.getString(columnNumber);
    obj = Util.setChar(obj, val);
  } else {
     obj = rs.getObject(columnNumber);
   }
   return obj;
}
Yardımcı sınıflar şöyle
//Checksif resultSet.wasNull() == true
private <T> T assignResult(final ResultSet resultSet, final Object obj) throws SQLException {
  // if result wasn't null store it in the field else field = null
  T result = null;
  if (!resultSet.wasNull()) {
    result = (T) obj;
  }
  return result;
}

20 Ocak 2022 Perşembe

Collector groupingByConcurrent metodu

Giriş
Şu satırı dahil ederiz
import java.util.stream.Collectors;
Örnek 
Şöyle yaparız.
List<Event> getNearEventsConcurrent(int number, List<Event> events, String targetLocation) {
        
  Map<Integer, Set<Event>> distanceEventsMap = events.stream().parallel().
    collect(Collectors.groupingByConcurrent(
      event -> evaluateLocationProximity(event.location(), targetLocation), 
      ConcurrentSkipListMap::new, 
      Collectors.toCollection(() -> new TreeSet<>(
        Comparator.comparingInt(Event::eventRankId)))));
  
  return distanceEventsMap.values()
    .stream()
    .flatMap(Set::stream)
    .limit(number)
    .collect(Collectors.toList());
}


13 Ocak 2022 Perşembe

JDBC SQLException

Giriş
Şu satırı dahil ederiz
import java.sql.SQLException;
JDBC işlemlerinde çoğunlukla bu exception fırlatılır. Daha özelleştirilmiş exceptionlar da mevcut. Açıklaması şöyle
SQLNonTransientException: This type of exception will be thrown when an instance where a retry of the same operation would fail unless the cause of the SQLException has been corrected.

SQLTransientException: This type of exception will be thrown when a previously failed operation is able to succeed when we re-tried the operation again without any change/intervention.

SQLRecoverableException: This type of exception will be thrown when a previously failed operation can succeed when we re-tried the operation again with any change/intervention by the application. While doing that the current connection should be closed and the new connection should be opened.

BatchUpdateException: This type of exception will be thrown if any error has occurred while doing the batch update operation. Besides the SQLException information, BatchUpdateException provides the status of the statements which have been executed/updated before the error has occurred.

SQLClientInfoException: This type of exception will be thrown if one or more information properties could not be set on a connection. Besides the SQLException information, SQLClientInfoException a list of client information properties that were not been set.
SQLNonTransientException
Örneğin tabloda tek bir satır olmasını bekliyoruz, ancak daha fazla satır varsa bu exception fırlatılabilir. Çünkü işlemi tekrarlasak bile tablodaki satırlar silinmediği müddetçe aynı hatayı elde edeceğizdir.

getSQLState metodu
Veri tabanları getErrorCode() için int tipinden farklı değerler dönerler. Daha portable kod için String dönen getSQLState() metodu kullanılabilir. Mapping MySQL Error Numbers to JDBC SQLState Codes yazısına bakılabilir.

Örnek
Şöyle yaparız
import com.mysql.cj.exceptions.MysqlErrorNumbers;

if (sqlException.getErrorCode() == MysqlErrorNumbers.ER_LOCK_WAIT_TIMEOUT || 
sqlException.getSQLState() == MysqlErrorNumbers.SQL_STATE_ROLLBACK_SERIALIZATION_FAILURE) {
    ...
}


10 Ocak 2022 Pazartesi

HttpClient Sınıfı - Java 11 İle Geliyor - HttpClient API

Giriş
Şu satırı dahil ederiz.
import java.net.http.HttpClient;
1. HttpRequest nesnesi yaratılır. Bu nesne GET, POST gibi bir isteği temsil ederi
2. HttpClient nesnesi yaratılır. Bu nesnenin send() veya sendAsync() metodu çağrılır. 
3. Çağrı sonucunda HttpResponse nesnesi elde edilir. 
4. HttpResponse sınıfı şöyle kullanılır

Örnek - String HttpResponse
Şöyle yaparız
HttpClient client = HttpClient.newHttpClient();

HttpRequest request = ...;

HttpResponse<String> responseOfString = client.send(request,
  HttpResponse.BodyHandlers.ofString());


System.out.println("Status code: " + responseOfString.statusCode());
System.out.println("Body: " + responseOfString.body());
Örnek - Stream HttpResponse
Şöyle yaparız
HttpResponse<InputStream> getResponse(HttpRequest request) 
  throws IOException, InterruptedException {
  return HttpClient
    .newHttpClient()
    .send(request, HttpResponse.BodyHandlers.ofInputStream());
}

HttpResponse<InputStream> response = getResponse(request);

System.out.println("status code: " + response.statusCode());
InputStream body = response.body();

newBuilder metodu
HttpClient.Builder Sınıfı yazısına taşıdım


newHttpClient metodu
Şöyle yaparız
HttpClient client = HttpClient.newHttpClient();
send metodu
send metodu yazısına taşıdım

sendAsync metodu
sendAsync metodu yazısına taşıdım

Java 21
Açıklaması şöyle
The java.net.http.HttpClient now implements AutoClosable, making it usable in a try-with-resources block.

There are also 5 new related methods:
İmzası şöyle
// Initiates an orderly shutdown by completing previously submitted
// request but not accepting new ones.
void close()

// Initiates a graceful shutdown and returns immediately
void shutdown()

// Initiates an immediate shutdown and tries to interrupt any active
// operation. Returns immediately, too.
void shutdownNow()

// Waits for the client to terminate for the given duration.
// Returns true if the client was terminated in time.
boolean awaitTermination(Duration duration)

// Checks if a client is terminated.
boolean isTerminated()
Açıklaması şöyle
Instances obtained via HttpClient.newHttpClient() or HttpClient.newBuilder() provide best-effort implementations of these methods.






JDBC SQLRecoverableException

Giriş
Şu satırı dahil ederiz
import java.sql.SQLRecoverableException;
java.sql.SQLException sınıfından kalıtır

Veri tabanından gelen hatanın bizim kodumuzdan kaynaklanmadığını, veri tabanı tarafında bir problem olduğunu belirtir. JDBC işleminin tekrarlanmasını gerekir.

6 Ocak 2022 Perşembe

IntelliJ Idea Run Menüsü

Run | Open Profiler Snapshot | Open
Bu menu altında hprof dosyaları incelenebilir.