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
şöyleHere 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.