JavaRush /Blog Jawa /Random-JV /JDBC utawa ngendi iku kabeh wiwit
Viacheslav
tingkat

JDBC utawa ngendi iku kabeh wiwit

Diterbitake ing grup
Ing donya modern, ora ana cara tanpa panyimpenan data. Lan sejarah nggarap database wiwit suwe banget, kanthi kedadeyan JDBC. Aku propose kanggo elinga soko sing ora framework modern dibangun ing ndhuwur JDBC bisa nindakake tanpa. Kajaba iku, sanajan nggarap dheweke, kadhangkala sampeyan butuh kesempatan kanggo "bali menyang oyod." Mugi review iki bakal bantuan minangka introduksi utawa bantuan refresh memori.
JDBC utawa ing ngendi kabeh diwiwiti - 1

Pambuka

Salah sawijining tujuan utama basa pamrograman yaiku nyimpen lan ngolah informasi. Kanggo luwih ngerti carane panyimpenan data, iku worth nglampahi sethitik wektu ing teori lan arsitektur aplikasi. Contone, sampeyan bisa maca literatur, yaiku buku " Software Architect's Handbook: Become a successful software architect by implementing effective arch... " dening Joseph Ingeno. Minangka ngandika, ana Tier Data tartamtu utawa "Lapisan Data". Iku kalebu panggonan kanggo nyimpen data (contone, database SQL) lan alat kanggo nggarap nyimpen data (contone, JDBC, kang bakal rembugan). Ana uga artikel ing situs web Microsoft: " Designing an infrastructure persistence layer ," sing nggambarake solusi arsitektur kanggo misahake lapisan tambahan saka Data Tier - Persistence Layer. Ing kasus iki, Data Tier minangka tingkat panyimpenan saka data kasebut dhewe, dene Lapisan Persistence minangka sawetara tingkat abstraksi kanggo nggarap data saka panyimpenan saka tingkat Data Tier. Lapisan Persistence bisa kalebu cithakan "DAO" utawa macem-macem ORM. Nanging ORM minangka topik kanggo diskusi liyane. Kaya sing wis dingerteni, Tier Data katon luwih dhisik. Wiwit jaman JDK 1.1, JDBC (Java DataBase Connectivity - connection to databases in Java) wis muncul ing jagad Jawa. Iki minangka standar kanggo interaksi aplikasi Java karo macem-macem DBMS, sing diimplementasikake ing wangun paket java.sql lan javax.sql sing kalebu ing Java SE:
JDBC utawa ing ngendi iku kabeh diwiwiti - 2
Standar iki diterangake kanthi spesifikasi " JSR 221 JDBC 4.1 API ". Spesifikasi iki ngandhani yen JDBC API nyedhiyakake akses programmatic menyang database relasional saka program sing ditulis ing Jawa. Uga ngandhani yen JDBC API minangka bagean saka platform Java lan mulane kalebu ing Java SE lan Java EE. JDBC API kasedhiya ing rong paket: java.sql lan javax.sql. Ayo padha kenalan.
JDBC utawa ing ngendi iku kabeh diwiwiti - 3

Wiwitan kerja

Kanggo ngerti apa JDBC API umume, kita kudu aplikasi Java. Iku paling trep kanggo nggunakake salah siji saka sistem Déwan project. Contone, ayo nggunakake Gradle . Sampeyan bisa maca liyane babagan Gradle ing review singkat: " A Brief Pambuka kanggo Gradle ". Pisanan, ayo miwiti proyek Gradle anyar. Wiwit fungsionalitas Gradle diimplementasikake liwat plugin, kita kudu nggunakake " Gradle Build Init Plugin " kanggo initialization:
gradle init --type java-application
Sawise iki, ayo mbukak skrip mbangun - file build.gradle , sing nggambarake proyek kita lan cara nggarap. Kita kasengsem ing blok " dependensi ", ing ngendi dependensi diterangake - yaiku, perpustakaan / kerangka / api, tanpa sing ora bisa digunakake lan gumantung. Kanthi gawan, kita bakal weruh kaya:
dependencies {
    // This dependency is found on compile classpath of this component and consumers.
    implementation 'com.google.guava:guava:26.0-jre'
    // Use JUnit test framework
    testImplementation 'junit:junit:4.12'
}
Yagene kita ndeleng iki ing kene? Iki minangka dependensi proyek sing digawe Gradle kanthi otomatis nalika nggawe proyek kasebut. Lan uga amarga jambu minangka perpustakaan kapisah sing ora kalebu karo Java SE. JUnit uga ora kalebu karo Java SE. Nanging kita duwe JDBC metu saka kothak, yaiku bagean saka Java SE. Pranyata kita duwe JDBC. Agung. Apa maneh sing kita butuhake? Ana diagram sing apik banget:
JDBC utawa ing ngendi iku kabeh diwiwiti - 4
Nalika kita bisa ndeleng, lan iki logis, database komponèn external sing ora native Jawa SE. Iki diterangake kanthi gampang - ana akeh database lan sampeyan bisa nggarap sapa wae. Contone, ana PostgreSQL, Oracle, MySQL, H2. Saben basis data kasebut diwenehake dening perusahaan kapisah sing disebut vendor database. Saben basis data ditulis nganggo basa pamrograman dhewe-dhewe (ora kudu Jawa). Supaya bisa nggarap database saka aplikasi Java, panyedhiya database nulis driver khusus, yaiku adaptor gambar dhewe. Sing kompatibel karo JDBC kasebut (yaiku, sing duwe driver JDBC) uga diarani "Database Compliant JDBC". Ing kene kita bisa nggambar analogi karo piranti komputer. Contone, ing notepad ana tombol "Cetak". Saben sampeyan menet, program ngandhani sistem operasi sing pengin dicithak aplikasi notepad. Lan sampeyan duwe printer. Kanggo ngajari sistem operasi supaya bisa komunikasi kanthi seragam karo printer Canon utawa HP, sampeyan butuh driver sing beda. Nanging kanggo sampeyan, minangka pangguna, ora ana sing bakal diganti. Sampeyan isih bakal menet tombol sing padha. Padha karo JDBC. Sampeyan nganggo kode sing padha, mung database sing beda-beda bisa mlaku ing sangisore tutup. Aku iki pendekatan cetha banget. Saben driver JDBC kuwi sawetara jinis artefak, perpustakaan, file jar. Iki minangka ketergantungan kanggo proyek kita. Contone, kita bisa milih database " H2 Database " banjur kita kudu nambah dependensi kaya iki:
dependencies {
    implementation 'com.h2database:h2:1.4.197'
Cara nemokake dependensi lan cara njlèntrèhaké iku dituduhake ing situs web resmi panyedhiya database utawa ing " Maven Central ". Pembalap JDBC dudu database, kaya sing sampeyan ngerteni. Nanging dheweke mung dadi tuntunan. Nanging ana bab kayata " Ing database memori ". Iki minangka basis data sing ana ing memori kanggo umur aplikasi sampeyan. Biasane, iki asring digunakake kanggo tujuan testing utawa latihan. Iki ngidini sampeyan supaya ora nginstal server database kapisah ing mesin. Sing cocog banget kanggo kita kenal karo JDBC. Dadi kothak wedhi kita siap lan kita miwiti.
JDBC utawa ing ngendi iku kabeh diwiwiti - 5

Sambungan

Dadi, kita duwe driver JDBC, kita duwe API JDBC. Minangka kita elinga, JDBC singkatan saka Java DataBase Connectivity. Mulane, kabeh diwiwiti karo Konektivitas - kemampuan kanggo nggawe sambungan. Lan sambungan iku Sambungan. Ayo bali menyang teks spesifikasi JDBC lan deleng tabel isi. Ing bab " BAB 4 Ringkesan " (ringkesan) kita pindhah menyang bagean " 4.1 Establishing a Connection " (netepake sambungan) ngandika ana rong cara kanggo nyambung menyang database:
  • Liwat DriverManager
  • Liwat Sumber Data
Ayo menehi hasil karo DriverManager. Kaya sing dikandhakake, DriverManager ngidini sampeyan nyambungake menyang database ing URL sing ditemtokake, lan uga ngemot Driver JDBC sing ditemokake ing CLASSPATH (lan sadurunge, sadurunge JDBC 4.0, sampeyan kudu mbukak kelas driver dhewe). Ana bab kapisah "BAB 9 Sambungan" bab nyambungake menyang database. Kita kasengsem carane njaluk sambungan liwat DriverManager, supaya kita kasengsem ing bagean "9.3 DriverManager Class". Iki nuduhake carane kita bisa ngakses database:
Connection con = DriverManager.getConnection(url, user, passwd);
Parameter kasebut bisa dijupuk saka situs web database sing wis dipilih. Ing kasus kita, iki H2 - " H2 Cheat Sheet ". Ayo pindhah menyang kelas AppTest sing disiapake dening Gradle. Isine tes JUnit. Tes JUnit minangka cara sing ditandhani karo anotasi @Test. Tes unit dudu topik review iki, mula kita mung bakal mbatesi awake dhewe ngerti yen iki minangka metode sing diterangake kanthi cara tartamtu, tujuane kanggo nyoba. Miturut spesifikasi JDBC lan situs web H2, kita bakal mriksa manawa kita wis nampa sambungan menyang database. Ayo nulis cara kanggo entuk sambungan:
private Connection getNewConnection() throws SQLException {
	String url = "jdbc:h2:mem:test";
	String user = "sa";
	String passwd = "sa";
	return DriverManager.getConnection(url, user, passwd);
}
Saiki ayo nulis tes kanggo metode iki sing bakal mriksa manawa sambungan kasebut wis digawe:
@Test
public void shouldGetJdbcConnection() throws SQLException {
	try(Connection connection = getNewConnection()) {
		assertTrue(connection.isValid(1));
		assertFalse(connection.isClosed());
	}
}
Tes iki, nalika dieksekusi, bakal verifikasi manawa sambungan sing diasilake bener (digawe kanthi bener) lan ora ditutup. Kanthi nggunakake try-with-resources, kita bakal ngeculake sumber daya yen kita ora butuh maneh. Iki bakal nglindhungi kita saka sambungan sagging lan bocor memori. Amarga tumindak apa wae karo database mbutuhake sambungan, ayo nyedhiyakake metode tes sing isih ditandhani @Test karo Sambungan ing wiwitan tes, sing bakal diluncurake sawise tes. Kanggo nindakake iki, kita butuh rong anotasi: @Before lan @After Ayo nambah lapangan anyar menyang kelas AppTest sing bakal nyimpen sambungan JDBC kanggo tes:
private static Connection connection;
Lan ayo nambah cara anyar:
@Before
public void init() throws SQLException {
	connection = getNewConnection();
}
@After
public void close() throws SQLException {
	connection.close();
}
Saiki, sembarang cara tes dijamin duwe sambungan JDBC lan ora kudu nggawe dhewe saben wektu.
JDBC utawa ing ngendi iku kabeh diwiwiti - 6

Pratelan

Sabanjure kita kasengsem ing Pernyataan utawa ekspresi. Padha diterangake ing dokumentasi ing bab " BAB 13 Pranyatan ". Kaping pisanan, ujar manawa ana sawetara jinis utawa jinis pernyataan:
  • Pranyatan: Ekspresi SQL sing ora ana paramèter
  • PreparedStatement: Pernyataan SQL sing disiapake sing ngemot parameter input
  • CallableStatement: Ekspresi SQL kanthi kemampuan kanggo entuk nilai bali saka SQL Stored Procedures.
Dadi, duwe sambungan, kita bisa nglakokake sawetara panjalukan ing kerangka sambungan iki. Mulane, logis yen kita entuk conto ekspresi SQL saka Connection. Sampeyan kudu miwiti nggawe tabel. Ayo diterangake panyuwunan nggawe tabel minangka variabel String. Carane nindakake? Ayo nggunakake sawetara tutorial kaya " sqltutorial.org "," sqlbolt.com "," postgresqltutorial.com "," codecademy.com ". Ayo nggunakake, contone, conto saka kursus SQL ing khanacademy.org . Ayo nambahake metode kanggo nglakokake ekspresi ing basis data:
private int executeUpdate(String query) throws SQLException {
	Statement statement = connection.createStatement();
	// Для Insert, Update, Delete
	int result = statement.executeUpdate(query);
	return result;
}
Ayo nambahake metode kanggo nggawe tabel uji nggunakake metode sadurunge:
private void createCustomerTable() throws SQLException {
	String customerTableQuery = "CREATE TABLE customers " +
                "(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)";
	String customerEntryQuery = "INSERT INTO customers " +
                "VALUES (73, 'Brian', 33)";
	executeUpdate(customerTableQuery);
	executeUpdate(customerEntryQuery);
}
Saiki ayo nyoba iki:
@Test
public void shouldCreateCustomerTable() throws SQLException {
	createCustomerTable();
	connection.createStatement().execute("SELECT * FROM customers");
}
Saiki ayo nglakokake panjaluk kasebut, lan uga nganggo parameter:
@Test
public void shouldSelectData() throws SQLException {
 	createCustomerTable();
 	String query = "SELECT * FROM customers WHERE name = ?";
	PreparedStatement statement = connection.prepareStatement(query);
	statement.setString(1, "Brian");
	boolean hasResult = statement.execute();
	assertTrue(hasResult);
}
JDBC ora ndhukung paramèter sing dijenengi kanggo PreparedStatement, saéngga paramèter kasebut ditemtokake kanthi pitakonan, lan kanthi nemtokake nilai kasebut, kita nuduhake indeks pitakonan (wiwit saka 1, ora nol). Ing test pungkasan kita nampa bener minangka indikasi apa ana asil. Nanging kepiye asil pitakon diwakili ing JDBC API? Lan ditampilake minangka ResultSet.
JDBC utawa ing ngendi iku kabeh diwiwiti - 7

ResultSet

Konsep ResultSet diterangake ing specification API JDBC ing bab "BAB 15 Result Sets". Kaping pisanan, ujar manawa ResultSet nyedhiyakake cara kanggo njupuk lan manipulasi asil pitakon sing dieksekusi. Yaiku, yen metode eksekusi bali menyang kita, mula kita bisa entuk ResultSet. Ayo pindhah telpon menyang cara createCustomerTable () menyang metode init, sing ditandhani minangka @Before. Saiki ayo ngrampungake tes shouldSelectData:
@Test
public void shouldSelectData() throws SQLException {
	String query = "SELECT * FROM customers WHERE name = ?";
	PreparedStatement statement = connection.prepareStatement(query);
	statement.setString(1, "Brian");
	boolean hasResult = statement.execute();
	assertTrue(hasResult);
	// Обработаем результат
	ResultSet resultSet = statement.getResultSet();
	resultSet.next();
	int age = resultSet.getInt("age");
	assertEquals(33, age);
}
Iku worth kang lagi nyimak ing kene sing sabanjuré cara sing gerakane sing disebut "kursor". Kursor ing ResultSet nuduhake sawetara baris. Dadi, kanggo maca baris, sampeyan kudu nyelehake kursor iki. Nalika kursor dipindhah, cara pamindhahan kursor ngasilake bener yen kursor bener (bener, bener), yaiku, nuduhake data. Yen bali palsu, banjur ora ana data, yaiku, kursor ora ngarahake data kasebut. Yen kita nyoba njupuk data kanthi kursor sing ora bener, kita bakal entuk kesalahan: Ora ana data sing kasedhiya.
@Test
public void shouldInsertInResultSet() throws SQLException {
	Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
	ResultSet resultSet = statement.executeQuery("SELECT * FROM customers");
	resultSet.moveToInsertRow();
	resultSet.updateLong("id", 3L);
	resultSet.updateString("name", "John");
	resultSet.updateInt("age", 18);
	resultSet.insertRow();
	resultSet.moveToCurrentRow();
}

RowSet

Saliyane ResultSet, JDBC ngenalake konsep RowSet. Sampeyan bisa maca liyane ing kene: " Dasar JDBC: Nggunakake Obyek RowSet ". Ana macem-macem variasi panggunaan. Contone, kasus sing paling gampang bisa katon kaya iki:
@Test
public void shouldUseRowSet() throws SQLException {
 	JdbcRowSet jdbcRs = new JdbcRowSetImpl(connection);
 	jdbcRs.setCommand("SELECT * FROM customers");
	jdbcRs.execute();
	jdbcRs.next();
	String name = jdbcRs.getString("name");
	assertEquals("Brian", name);
}
Kaya sing sampeyan ngerteni, RowSet mirip karo simbiosis pernyataan (kita nemtokake perintah kasebut) lan perintah sing dieksekusi. Liwat kita ngontrol kursor (kanthi nelpon cara sabanjure) lan entuk data saka iku. Ora mung pendekatan iki menarik, nanging uga implementasine sing bisa ditindakake. Contone, CachedRowSet. Iku "pedhot" (yaiku, ora nggunakake sambungan terus-terusan menyang database) lan mbutuhake sinkronisasi eksplisit karo database:
CachedRowSet jdbcRsCached = new CachedRowSetImpl();
jdbcRsCached.acceptChanges(connection);
Sampeyan bisa maca liyane ing tutorial ing situs web Oracle: " Nggunakake CachedRowSetObjects ".
JDBC utawa ing ngendi kabeh diwiwiti - 8

Metadata

Saliyane pitakon, sambungan menyang database (yaiku, conto kelas Sambungan) nyedhiyakake akses menyang metadata - data babagan carane database kita diatur lan diatur. Nanging pisanan, ayo sebutno sawetara poin penting: URL kanggo nyambungake menyang database kita: "jdbc: h2: mem: test". test iku jeneng database kita. Kanggo API JDBC, iki minangka direktori. Lan jeneng kasebut bakal nganggo huruf gedhe, yaiku, TEST. Skema standar kanggo H2 yaiku PUBLIC. Saiki, ayo nulis tes sing nuduhake kabeh tabel pangguna. Kenapa adat? Amarga database ora mung ngemot tabel pangguna (sing digawe dhewe nggunakake ekspresi tabel), nanging uga tabel sistem. Padha perlu kanggo nyimpen informasi sistem babagan struktur database. Saben basis data bisa nyimpen tabel sistem kasebut kanthi cara sing beda. Contone, ing H2 disimpen ing skema " INFORMATION_SCHEMA ". Apike, SKEMA INFORMASI minangka pendekatan umum, nanging Oracle pindhah rute sing beda. Sampeyan bisa maca liyane ing kene: " INFORMATION_SCHEMA lan Oracle ". Ayo nulis tes sing nampa metadata ing tabel pangguna:
@Test
public void shoudGetMetadata() throws SQLException {
	// У нас URL = "jdbc:h2:mem:test", где test - название БД
	// Название БД = catalog
	DatabaseMetaData metaData = connection.getMetaData();
	ResultSet result = metaData.getTables("TEST", "PUBLIC", "%", null);
	List<String> tables = new ArrayList<>();
	while(result.next()) {
		tables.add(result.getString(2) + "." + result.getString(3));
	}
	assertTrue(tables.contains("PUBLIC.CUSTOMERS"));
}
JDBC utawa ing ngendi kabeh diwiwiti - 9

Kolam sambungan

Kolam sambungan ing spesifikasi JDBC duwe bagean sing disebut "Bab 11 Sambungan Pooling". Iku uga menehi sabdhoning utama kanggo perlu kanggo blumbang sambungan. Saben Coonection minangka sambungan fisik menyang database. Nggawe lan nutup iku cukup "larang" proyek. JDBC mung nyedhiyakake API pooling sambungan. Mulane, pilihan saka implementasine tetep kita. Contone, implementasine kasebut kalebu HikariCP . Mulane, kita kudu nambah blumbang kanggo ketergantungan proyek kita:
dependencies {
    implementation 'com.h2database:h2:1.4.197'
    implementation 'com.zaxxer:HikariCP:3.3.1'
    testImplementation 'junit:junit:4.12'
}
Saiki kita kudu nggunakake blumbang iki. Kanggo nindakake iki, sampeyan kudu miwiti sumber data, uga dikenal minangka Sumber Data:
private DataSource getDatasource() {
	HikariConfig config = new HikariConfig();
	config.setUsername("sa");
	config.setPassword("sa");
	config.setJdbcUrl("jdbc:h2:mem:test");
	DataSource ds = new HikariDataSource(config);
	return ds;
}
Lan ayo nulis tes kanggo nampa sambungan saka blumbang:
@Test
public void shouldGetConnectionFromDataSource() throws SQLException {
	DataSource datasource = getDatasource();
	try (Connection con = datasource.getConnection()) {
		assertTrue(con.isValid(1));
	}
}
JDBC utawa ing ngendi iku kabeh diwiwiti - 10

Transaksi

Salah sawijining perkara sing paling menarik babagan JDBC yaiku transaksi. Ing specification JDBC, padha diutus bab "BAB 10 Transaksi". Kaping pisanan, sampeyan kudu ngerti apa transaksi kasebut. Transaksi minangka klompok operasi urut-urutan sing digabungake kanthi logis ing data, diproses utawa dibatalake kanthi sakabehe. Nalika transaksi diwiwiti nalika nggunakake JDBC? Minangka spesifikasi kasebut, iki ditangani langsung dening Driver JDBC. Nanging biasane, transaksi anyar diwiwiti nalika statement SQL saiki mbutuhake transaksi lan transaksi kasebut durung digawe. Nalika transaksi rampung? Iki dikontrol dening atribut auto-commit. Yen autocommit diaktifake, transaksi bakal rampung sawise statement SQL "rampung". Apa tegese "rampung" gumantung saka jinis ekspresi SQL:
  • Basa Manipulasi Data, uga dikenal minangka DML (Insert, Update, Delete)
    Transaksi rampung sanalika tumindak rampung
  • Pilih Statements
    Transaksi wis rampung nalika ResultSet ditutup ( ResultSet#close )
  • CallableStatement lan ekspresi sing ngasilake macem-macem asil
    Nalika kabeh ResultSets sing gegandhengan wis ditutup lan kabeh output wis ditampa (kalebu jumlah nganyari)
Iki persis carane JDBC API tumindak. Kaya biasane, ayo nulis tes kanggo iki:
@Test
public void shouldCommitTransaction() throws SQLException {
	connection.setAutoCommit(false);
	String query = "INSERT INTO customers VALUES (1, 'Max', 20)";
	connection.createStatement().executeUpdate(query);
	connection.commit();
	Statement statement = connection.createStatement();
 	statement.execute("SELECT * FROM customers");
	ResultSet resultSet = statement.getResultSet();
	int count = 0;
	while(resultSet.next()) {
		count++;
	}
	assertEquals(2, count);
}
Iku prasaja. Nanging iki bener anggere kita mung duwe siji transaksi. Apa sing kudu ditindakake nalika ana sawetara? Padha kudu diisolasi saka saben liyane. Mula, ayo ngomong babagan tingkat isolasi transaksi lan kepiye JDBC ngatasi.
JDBC utawa ing ngendi iku kabeh diwiwiti - 11

Tingkat insulasi

Ayo mbukak bagean "10.2 Transaction Isolation Levels" saka spesifikasi JDBC. Ing kene, sadurunge pindhah luwih, aku pengin ngelingi babagan ACID. ACID nerangake syarat kanggo sistem transaksional.
  • Atomicity:
    Ora ana transaksi sing bakal ditindakake sebagian kanggo sistem kasebut. Kabeh sub-operasi bakal ditindakake, utawa ora ana sing bakal ditindakake.
  • Konsistensi:
    Saben transaksi sukses, miturut definisi, mung nyathet asil sing bener.
  • Isolasi:
    Nalika transaksi mlaku, transaksi bebarengan ora mengaruhi asile.
  • Daya tahan:
    Yen transaksi kasil rampung, owah-owahan sing ditindakake ora bakal dibatalake amarga gagal.
Nalika ngomong babagan tingkat isolasi transaksi, kita ngomong babagan syarat "Isolasi". Isolasi minangka syarat sing larang, mula ing basis data nyata ana mode sing ora ngisolasi transaksi (tingkat isolasi sing bisa diulang lan luwih murah). Wikipedia nduweni panjelasan sing apik babagan masalah sing bisa kedadeyan nalika nggarap transaksi. Waca liyane ing kene: " Masalah akses paralel nggunakake transaksi ." Sadurunge nulis tes, ayo ngganti Skrip Gradle Build: nambah blok kanthi properti, yaiku, kanthi setelan proyek kita:
ext {
    h2Version = '1.3.176' // 1.4.177
    hikariVersion = '3.3.1'
    junitVersion = '4.12'
}
Sabanjure, kita nggunakake iki ing versi:
dependencies {
    implementation "com.h2database:h2:${h2Version}"
    implementation "com.zaxxer:HikariCP:${hikariVersion}"
    testImplementation "junit:junit:${junitVersion}"
}
Sampeyan bisa uga wis ngeweruhi sing versi h2 wis dadi luwih murah. Kita bakal weruh apa mengko. Dadi kepiye carane ngetrapake tingkat isolasi? Ayo langsung ndeleng conto praktis cilik:
@Test
public void shouldGetReadUncommited() throws SQLException {
	Connection first = getNewConnection();
	assertTrue(first.getMetaData().supportsTransactionIsolationLevel(Connection.TRANSACTION_READ_UNCOMMITTED));
	first.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
	first.setAutoCommit(false);
	// Транзакиця на подключение. Поэтому первая транзакция с ReadUncommited вносит изменения
	String insertQuery = "INSERT INTO customers VALUES (5, 'Max', 15)";
	first.createStatement().executeUpdate(insertQuery);
	// Вторая транзакция пытается их увидеть
	int rowCount = 0;
	JdbcRowSet jdbcRs = new JdbcRowSetImpl(getNewConnection());
	jdbcRs.setCommand("SELECT * FROM customers");
	jdbcRs.execute();
	while (jdbcRs.next()) {
		rowCount++;
	}
	assertEquals(2, rowCount);
}
Apike, tes iki bisa uga gagal ing vendor sing ora ndhukung TRANSACTION_READ_UNCOMMITTED (contone, sqlite utawa HSQL). Lan tingkat transaksi bisa uga ora bisa digunakake. Elinga yen kita nuduhake versi driver Database H2? Yen kita ngunggahake menyang h2Version = '1.4.177' lan luwih dhuwur, banjur READ UNCOMMITTED bakal mandheg, sanajan kita ora ngganti kode kasebut. Iki maneh mbuktekake manawa pilihan vendor lan versi driver ora mung huruf, nanging bakal nemtokake kepiye panjaluk sampeyan bakal ditindakake. Sampeyan bisa maca babagan carane ndandani prilaku iki ing versi 1.4.177 lan carane ora bisa digunakake ing versi sing luwih dhuwur ing kene: " Dhukungan READ UNCOMMITTED tingkat isolasi ing mode MVStore ".
JDBC utawa ing ngendi iku kabeh diwiwiti - 12

Garis ing ngisor

Kaya sing kita deleng, JDBC minangka alat sing kuat ing tangan Jawa kanggo nggarap database. Mugi review singkat iki bakal mbantu menehi titik wiwitan utawa bantuan refresh memori. Inggih, kanggo cemilan, sawetara bahan tambahan: #Viacheslav
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION