25 Ekim 2021 Pazartesi

JDBC Connection String

Giriş
jdbc ile bağlanmak istersek şöyle yaparız
jdbc:ignite:thin://localhost:10800
JdbcThinConnection nesnesi yaratır. Bu sınıf şöyle yani TCP ile bağlantı kuruyor
public class JdbcThinConnection implements Connection {
  ...
  private volatile JdbcThinTcpIo singleIo;
  ...
}
Schema
Başka scheme' ya bağlanmak istersek şöyle yaparız
jdbc:ignite:thin://localhost:10800/MY_SCHEMA
Hangi schema' ya bağlandıysak CREATE TABLE cümlesi o schema altında tablo yaratır.
Schema ile ilgili açıklama şöyle
Here are a few options to connect to a specific schema in Ignite:

  jdbc:ignite:thin://172.16.0.5/mySchema - will connect to "MYSCHEMA" (case insensitive)
  jdbc:ignite:thin://172.16.0.5/"mySchema" - will connect to "mySchema" (case sensitive)
Transaction
JDBC ile transaction yapılabilir. Konuyla ilgili bir soru burada.

Transaction Isolation Level
Grig Gain 8.8.9 ile denediğimde şu sonucu aldım
Connection conn = ...;
DatabaseMetaData dbmd = conn.getMetaData();
int defaultTransactionIsolation = dbmd.getDefaultTransactionIsolation();
//4 yani Connection.TRANSACTION_REPEATABLE_READ
Şu kod işe yaramaz
conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
Desteklenen Isolation Level'ları şöyle deneyebiliriz
DatabaseMetaData dbmd = conn.getMetaData();
if (dbmd.supportsTransactionIsolationLevel(Connection.TRANSACTION_REPEATABLE_READ)) {
  System.out.println("Supports TRANSACTION_REPEATABLE_READ");
}
if (dbmd.supportsTransactionIsolationLevel(Connection.TRANSACTION_SERIALIZABLE)) {
  System.out.println("Supports TRANSACTION_SERIALIZABLE");
}
ResultSet Tipleri
Grig Gain 8.8.9 ile denediğimde şu kod exception fırlattı.
Connection connection = ...;
PreparedStatement statement = connection.prepareStatement("...",
  ResultSet.TYPE_SCROLL_SENSITIVE, 
  ResultSet.CONCUR_UPDATABLE);
Exception şöyle
Invalid result set type (only forward is supported).
INSERT Cümlesi
Elimizde şöyle bir SQL olsun.
CREATE TABLE IF NOT EXISTS MYUSER (
  ID NUMBER(10,0),
  NAME VARCHAR2(100),
  PRIMARY KEY (ID)
) WITH "ATOMICITY=TRANSACTIONAL";
Ama aslında dokümantasyon şöyle. Aslında SQL Transaction ile TRANSACTIONAL_SNAPSHOT kullan diyor ancak bu cümle sanırım JDBC'yi kapsamıyor.
Enables fully ACID-compliant transactional cache behavior for the key-value API.
Note! In this mode, transactional consistency is guaranteed for key-value API operations only. To enable ACID capabilities for SQL transactions, use the TRANSACTIONAL_SNAPSHOT mode.

Note! This atomicity mode is not compatible with the other modes within the same transaction. if a transaction is executed over multiple caches, all caches must have the same atomicity mode, either TRANSACTIONAL_SNAPSHOT or TRANSACTIONAL.
Ancak benim denemelerimde bu tabloya şöyle yaptım ve sorun olmadan çalışıyor. Burada tablonun TRANSACTIONAL olmasında bir problem yok. Bunu denememim sebebi TRANSACTIONAL_SNAPSHOT kullandığımda MVCC'nin devreye girmesi. Ben de bunu istemiyorum
Connection connection = ...;

int id = ...;
String name = ...;
String SQL_INSERT = "INSERT INTO MYUSER(ID,NAME) VALUES(?,?)";
try (PreparedStatement insertStatement = connection.prepareStatement(SQL_INSERT)) {

  insertStatement.setLong(1, id);
  insertStatement.setString(2, name);

   updateStatement.executeUpdate();
} catch (Exception exception) {
 ...
}
Aynı şeyi tabloyu şöyle yaratarak denedim yine sorun çıkmadı
CREATE TABLE IF NOT EXISTS MYUSER (
  ID NUMBER(10,0),
  NAME VARCHAR2(100),
  PRIMARY KEY (ID)
) WITH "ATOMICITY=ATOMIC";
SELECT FOR UPDATE Cümlesi
Elimizde şöyle bir SQL olsun.
CREATE TABLE IF NOT EXISTS MYSEQUENCE (
  SEQ_NAME VARCHAR2(100),
  SEQ_VALUE NUMBER(10,0),
  PRIMARY KEY (SEQ_NAME)
) WITH "ATOMICITY=TRANSACTIONAL_SNAPSHOT";

INSERT INTO MYSEQUENCE(SEQ_NAME, SEQ_VALUE) VALUES ('SEQ1', 1);
Bu tabloda TRANSACTIONAL_SNAPSHOT kullanıldığı için SELECT FOR UPDATE yapılabilir. Şöyle yaparız
String SQL_QUERY = "SELECT SEQ_NAME, SEQ_VALUE FROM MYSEQUENCE WHERE SEQ_NAME = ? FOR UPDATE ";
try (PreparedStatement selectStatement = conn.prepareStatement(SQL_QUERY)) {
  ...
}
Eğer tabloyu TRANSACTIONAL_SNAPSHOT olarak yaratmazsak exception alırız. Exception şöyle
SELECT FOR UPDATE query requires transactional cache with MVCC enabled.
SELECT FOR UPDATE ile bir başka transaction bizim kaydımızı halen okuyabiliyor ancak güncelleyemez.


 


Hiç yorum yok:

Yorum Gönder

Ignite Transaction Kullanımı

Giriş Bir tablo 3 tane atomicity değerinden birisine sahip olabilir. 1. ATOMIC 2. TRANSACTIONAL 3. TRANSACTIONAL_SNAPSHOT ATOMIC Açıklaması ...