JavaRush /Java Blog /Random-TK /JDBC ýa-da hemmesiniň başlanýan ýeri
Viacheslav
Dereje

JDBC ýa-da hemmesiniň başlanýan ýeri

Toparda çap edildi
Häzirki zaman dünýäsinde maglumat saklamazdan ýol ýok. Maglumatlar bazalary bilen işlemegiň taryhy JDBC-iň peýda bolmagy bilen has ir başlandy. JDBC-iň üstünde gurlan häzirki zaman çarçuwasyz edip bilmejek bir zady ýatda saklamagy teklip edýärin. Mundan başga-da, olar bilen işleşeniňizde-de, käwagt “köküňize gaýdyp gelmek” mümkinçiligi gerek bolup biler. Bu syn giriş hökmünde kömek eder ýa-da ýadyňyzy täzelemäge kömek eder diýip umyt edýärin.
JDBC ýa-da hemmesiniň başlanýan ýeri - 1

Giriş

Programmirleme diliniň esasy maksatlaryndan biri maglumatlary saklamak we gaýtadan işlemekdir. Maglumat saklamagyň nähili işleýändigine has gowy düşünmek üçin programmalaryň nazaryýetine we arhitekturasyna azajyk wagt sarp etmeli. Mysal üçin, edebiýaty okap bilersiňiz, ýagny Iosif Ingenonyň “ Programma arhitektorynyň gollanmasy: täsirli arçany durmuşa geçirip üstünlikli programma arhitektory boluň ... ” atly kitaby okap bilersiňiz. Aýdylyşy ýaly, belli bir maglumat derejesi ýa-da “Maglumat gatlagy” bar. Maglumatlary saklaýan ýeri (mysal üçin SQL maglumatlar bazasy) we maglumat dükany bilen işlemek üçin gurallary (mysal üçin, JDBC ara alnyp maslahatlaşylar) öz içine alýar. Şeýle hem, Microsoft web sahypasynda “ Maglumat derejesinden - erjellik gatlagyndan” goşmaça gatlagy aýyrmagyň binagärlik çözgüdini beýan edýän “ Infrastrukturanyň dowamly gatlagyny dizaýn etmek ” atly bir makala bar. Bu ýagdaýda “Data Tier” maglumatlary saklamagyň derejesidir, “Persistence Layer” bolsa “Data Tier” derejesindäki ammar maglumatlary bilen işlemek üçin abstraksiýanyň bir derejesidir. Dowamlylyk gatlagy "DAO" şablonyny ýa-da dürli ORM-leri öz içine alyp biler. Emma ORM başga bir pikir alyşmak üçin mowzuk. Öň düşünen bolmagyňyz mümkin, maglumatlar derejesi ilki peýda boldy. JDK 1.1 döwründen bäri JDBC (Java DataBase Connectivity - Java maglumatlar bazalaryna birikme) Java dünýäsinde peýda boldy. Bu, Java SE programmalaryna java.sql we javax.sql paketleri görnüşinde ýerine ýetirilen dürli DBMS-ler bilen özara täsirleşmek üçin standart:
JDBC ýa-da hemmesiniň başlanýan ýeri - 2
Bu standart " JSR 221 JDBC 4.1 API " spesifikasiýasy bilen düşündirilýär . Bu spesifikasiýa, JDBC API-iň Java-da ýazylan programmalardan baglanyşyk bazalaryna programma üpjünçiligini üpjün edýändigini aýdýar. Şeýle hem, JDBC API-iň Java platformasynyň bir bölegidigini we şonuň üçin Java SE we Java EE-e degişlidigini aýdýar. JDBC API iki paketde berilýär: java.sql we javax.sql. Geliň, indi olar bilen tanşalyň.
JDBC ýa-da hemmesiniň başlanýan ýeri - 3

Işiň başlangyjy

Umuman JDBC API nämedigine düşünmek üçin Java programmasy gerek. Taslama gurnama ulgamlaryndan birini ulanmak iň amatlydyr. Mysal üçin, Gradle ulanalyň . Gradle hakda has giňişleýin gözden geçirip bilersiňiz: " Gradle barada gysgaça giriş ". Ilki bilen täze Gradle taslamasyna başlalyň. “Gradle” funksiýasy pluginleriň üsti bilen amala aşyrylýandygy sebäpli, başlangyç üçin “ Gradle Build Init Plugin ” ulanmalydyrys :
gradle init --type java-application
Ondan soň, taslamamyzy we onuň bilen nähili işlemelidigimizi görkezýän build.gradle faýlyny açalyň . Bize baglylyklaryň düşündirilýän "garaşlylyk " bloky, ýagny kitaphanalar / çarçuwalar / api gyzyklanýar, onsuz biz işläp bilmeýäris we bagly bolýarys. Adaty tertipde şuňa meňzeş bir zady göreris:
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'
}
Näme üçin bu ýerde görýäris? Taslama döredilende Gradle awtomatiki usulda biziň üçin döreden taslamamyzyň garaşlylygy. Şeýle hem, guwa Java SE bilen goşulmaýan aýratyn kitaphanadyr. JUnit Java SE bilen hem goşulmaýar. Weöne bizde JDBC bar, ýagny Java SE-iň bir bölegi. Görnüşi ýaly, JDBC bar. Gowy. Başga näme gerek? Şeýle ajaýyp diagramma bar:
JDBC ýa-da hemmesiniň başlanýan ýeri - 4
Görşümiz ýaly we bu mantykly, maglumatlar binýady Java SE üçin ýerli däl bir bölekdir. Bu ýönekeý düşündirilýär - maglumatlar bazasy gaty köp we islendik biri bilen işleşip bilersiňiz. Mysal üçin, PostgreSQL, Oracle, MySQL, H2 bar. Bu maglumat bazalarynyň her biri, maglumatlar bazasyny satyjylar diýilýän aýratyn kompaniýa tarapyndan üpjün edilýär. Her bir maglumat bazasy öz programmirleme dilinde ýazylýar (hökman Java däl). Java programmasyndan maglumat bazasy bilen işlemek üçin maglumat bazasyny üpjün ediji, öz surat adapteri bolan ýörite sürüjini ýazýar. Şeýle JDBC gabat gelýänlere (ýagny JDBC sürüjisi bolanlara) “JDBC laýyk maglumatlar bazasy” hem diýilýär. Bu ýerde kompýuter enjamlary bilen meňzeşlik çekip bileris. Mysal üçin, depderçede "Çap" düwmesi bar. Her gezek basanyňyzda, programma operasiýa ulgamyna notepad programmasynyň çap etmek isleýändigini aýdýar. Sizde printer bar. Operasiýa ulgamyňyzy Canon ýa-da HP printeri bilen birmeňzeş aragatnaşyk saklamagy öwretmek üçin size dürli draýwerler gerek bolar. Emma ulanyjy hökmünde siziň üçin hiç zat üýtgemez. Şol bir düwmä basarsyňyz. JDBC bilen birmeňzeş. Şol bir kody işleýärsiňiz, kapotyň aşagynda dürli maglumat bazalarynyň işlemegi mümkin. Meniň pikirimçe, bu gaty düşnükli çemeleşme. Şeýle JDBC sürüjisiniň hersi haýsydyr bir artefakt, kitaphana, banka faýlydyr. Bu biziň taslamamyza baglylyk. Mysal üçin, " H2 Maglumat bazasy " maglumat bazasyny saýlap bileris , soň bolsa şuňa meňzeş garaşlylygy goşmalydyrys:
dependencies {
    implementation 'com.h2database:h2:1.4.197'
Baglanyşygy nädip tapmalydygyny we ony nädip suratlandyrmalydygyny maglumatlar bazasynyň üpjünçisiniň resmi web sahypalarynda ýa-da " Maven Central " -da görkezilýär. JDBC sürüjisi, düşünşiňiz ýaly maglumat bazasy däl. Heöne ol diňe oňa ýol görkeziji. "Öne" memoryat bazalarynda " ýaly bir zat bar . Bular, programmaňyzyň ömrüniň dowamynda ýatda saklanýan maglumat bazalarydyr. Adatça, bu köplenç synag ýa-da okuw maksatlary üçin ulanylýar. Bu, enjamda aýratyn maglumat bazasy serwerini gurmakdan saklanmaga mümkinçilik berýär. JDBC bilen tanyşmak üçin gaty amatly. Şeýlelik bilen sandyk gutusy taýýar we işe başlaýarys.
JDBC ýa-da hemmesiniň başlanýan ýeri - 5

Baglanyşyk

Şeýlelikde, JDBC sürüjimiz bar, JDBC API bar. .Adymyzda bolsa, JDBC Java DataBase Connectivity diýmekdir. Şonuň üçin hemmesi Baglanyşykdan - baglanyşyk gurmak ukybyndan başlaýar. Baglanyşyk bolsa birikme. Geliň, JDBC spesifikasiýasynyň tekstine ýene bir gezek ýüz tutalyň we mazmun tablisasyna seredeliň. " 4-nji BAP Gysgaça syn " (umumy syn) bölüminde " 4.1 Baglanyşyk gurmak " (baglanyşyk gurmak) bölümine ýüz tutýarys, maglumatlar bazasyna birikmegiň iki usuly bar diýilýär:
  • DriverManager arkaly
  • DataSource arkaly
DriverManager bilen iş salyşalyň. Aýdylyşy ýaly, DriverManager görkezilen URL-de maglumat bazasyna birikmäge mümkinçilik berýär, şeýle hem CLASSPATH-da tapylan JDBC Sürüjilerini ýükleýär (we öň JDBC 4.0-den öň sürüjiler synpyny özüňiz ýüklemelisiňiz). Maglumat bazasyna birikmek barada “9-njy BAP Baglanyşyklar” atly aýratyn bölüm bar. “DriverManager” -iň üsti bilen nädip baglanyşyk gazanyp boljakdygy bilen gyzyklanýarys, şonuň üçin “9.3 DriverManager Class” bölümi bilen gyzyklanýarys. Maglumatlar bazasyna nädip girip biljekdigimizi görkezýär:
Connection con = DriverManager.getConnection(url, user, passwd);
Parametrleri saýlan maglumatlar bazamyzyň web sahypasyndan alyp bolýar. Biziň ýagdaýymyzda bu H2 - " H2 aldaw sahypasy ". Gradle tarapyndan taýýarlanan “AppTest” synpyna geçeliň. Onda JUnit synaglary bar. JUnit synagy, bellik bilen bellenen usul @Test. Bölüm synaglary bu synyň mowzugy däl, şonuň üçin bu zatlaryň belli bir görnüşde beýan edilendigi, maksadynyň bir zady synamakdygyna düşünmek bilen çäkleneris. JDBC spesifikasiýasyna we H2 web sahypasyna görä, maglumatlar bazasyna baglanyşyk alandygymyzy barlarys. Baglanyş usulyny ýazalyň:
private Connection getNewConnection() throws SQLException {
	String url = "jdbc:h2:mem:test";
	String user = "sa";
	String passwd = "sa";
	return DriverManager.getConnection(url, user, passwd);
}
Indi, bu usulyň hakykatdanam gurlandygyny barlaýan synag üçin synag ýazalyň:
@Test
public void shouldGetJdbcConnection() throws SQLException {
	try(Connection connection = getNewConnection()) {
		assertTrue(connection.isValid(1));
		assertFalse(connection.isClosed());
	}
}
Bu synag, ýerine ýetirilende, ýüze çykan baglanyşygyň dogrudygyny (dogry döredilendigini) we ýapylmaýandygyny tassyklar. Synag çeşmeleri ulanyp, çeşmeler indi zerur däl wagty çykarys. Bu, bogun birikmelerinden we ýadyň syzmagyndan gorar. Maglumatlar bazasy bilen baglanyşykly islendik hereket birikmäni talap edýändigi sebäpli, geliň, synagdan soň goýberjek synagyň başynda @Test bilen birikdirilen galan synag usullaryny üpjün edeliň. Munuň üçin bize iki düşündiriş gerek: @ Öňünden we @After Geliň, synaglar üçin JDBC baglanyşygyny saklaýan AppTest synpyna täze bir meýdan goşalyň:
private static Connection connection;
Geliň, täze usullary goşalyň:
@Before
public void init() throws SQLException {
	connection = getNewConnection();
}
@After
public void close() throws SQLException {
	connection.close();
}
Indi islendik synag usulynyň JDBC baglanyşygy bolmagy kepillendirilýär we her gezek özüni döretmeli däl.
JDBC ýa-da hemmesiniň başlanýan ýeri - 6

Beýannamalar

Indiki jümleler ýa-da aňlatmalar bilen gyzyklanýarys. Resminamalarda " 13-nji BAP Jümleler " bölüminde beýan edilýär . Birinjiden, jümleleriň birnäçe görnüşi ýa-da görnüşi bar diýilýär:
  • Beýannama: parametrleri bolmadyk SQL aňlatmasy
  • Taýýarlanan beýannama: Giriş parametrlerini öz içine alýan SQL jümlesi
  • “CallableStatement”: SQL saklanylýan proseduralardan gaýdyp bahany almak ukyby bolan SQL aňlatmasy.
Şeýlelik bilen, baglanyşyk bar bolsa, bu baglanyşygyň çäginde käbir haýyşy ýerine ýetirip bileris. Şonuň üçin ilki bilen “Connection” -dan SQL aňlatmasynyň mysalyny almagymyz mantykly. Tablisa döretmekden başlamaly. Tablisa döretmek haýyşyny String üýtgeýjisi hökmünde suratlandyralyň. Muny nädip etmeli? Geliň, " sqltutorial.org ", " sqlbolt.com ", " postgresqltutorial.com ", " codecademy.com " ýaly käbir sapaklary ulanalyň. Mysal üçin, khanacademy.org sahypasyndaky SQL kursundan mysal alalyň . Maglumatlar bazasynda aňlatmany ýerine ýetirmegiň usulyny goşalyň:
private int executeUpdate(String query) throws SQLException {
	Statement statement = connection.createStatement();
	// Для Insert, Update, Delete
	int result = statement.executeUpdate(query);
	return result;
}
Öňki usuly ulanyp synag tablisasyny döretmek üçin bir usul goşalyň:
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);
}
Indi muny synap göreliň:
@Test
public void shouldCreateCustomerTable() throws SQLException {
	createCustomerTable();
	connection.createStatement().execute("SELECT * FROM customers");
}
Indi haýyşy, hatda parametr bilenem ýerine ýetireliň:
@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 “PreparedStatement” üçin atlandyrylan parametrleri goldamaýar, şonuň üçin parametrleriň özi soraglar bilen kesgitlenýär we bahany kesgitlemek bilen sorag indeksini görkezýäris (noldan däl, 1-den başlap). Iň soňky synagda netijäniň bardygyny ýa-da ýokdugyny görkezmek üçin dogry aldyk. Emma talap netijesi JDBC API-de nähili görkezilýär? Netijeler hökmünde görkezilýär.
JDBC ýa-da hemmesiniň başlanýan ýeri - 7

Netijeler

ResultSet düşünjesi, JDBC API spesifikasiýasynda "15-nji BAP Netijeler toplumy" bölüminde düşündirilýär. Ilki bilen, ResultSet ýerine ýetirilen talaplaryň netijelerini almak we dolandyrmak usullaryny hödürleýär diýilýär. .Agny, ýerine ýetiriş usuly bize gaýdyp gelse, ResultSet alyp bileris. Geliň, jaňy @Before diýip bellenen init usulyna createCustomerTable () usulyna geçireliň. Indi gelmeliSelectData synagymyzy jemläliň:
@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);
}
Bu ýerde indiki “kursor” diýilýän zady herekete getirýän usuldygyny bellemelidiris. ResultSet-de kursor käbir hatary görkezýär. Şeýlelik bilen, bir setiri okamak üçin bu kursory goýmaly. Kursor göçürilende, kursor dogry (dogry, dogry), ýagny maglumatlary görkezýän bolsa, kursory göçürmek usuly hakyky bolýar. Falsealňyş yzyna gaýdyp gelse, onda maglumat ýok, ýagny kursor maglumatlary görkezmeýär. Nädogry kursor bilen maglumat almaga synanyşsak, ýalňyşlygy alarys: Hiç hili maglumat ýok ResultSet arkaly hatarlary täzeläp ýa-da goýup bilersiňiz.
@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

ResultSet-den başga, JDBC RowSet düşünjesini hödürleýär. Bu ýerde has köp okap bilersiňiz: " JDBC esaslary: RowSet obýektlerini ulanmak ". Ulanyşyň dürli görnüşleri bar. Mysal üçin, iň ýönekeý ýagdaý şeýle bolup biler:
@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);
}
Görşüňiz ýaly, RowSet jümläniň simbiozyna meňzeýär (biz onuň üsti bilen buýrugy kesgitledik) we ýerine ýetirilen buýrugy. Onuň üsti bilen kursory dolandyrýarys (indiki usula jaň edip) we ondan maglumat alýarys. Diňe bu çemeleşme gyzykly bolman, eýsem durmuşa geçirilmegi mümkin. Mysal üçin, CachedRowSet. Ol "kesildi" (ýagny maglumatlar bazasyna yzygiderli birikme ulanmaýar) we maglumatlar bazasy bilen aç-açan sinhronlamany talap edýär:
CachedRowSet jdbcRsCached = new CachedRowSetImpl();
jdbcRsCached.acceptChanges(connection);
Oracle web sahypasyndaky gollanmada has köp okap bilersiňiz: " CachedRowSetObjects ulanmak ".
JDBC ýa-da hemmesiniň başlanýan ýeri - 8

Metadata

Soraglardan başga-da, maglumat bazasyna birikme (meselem, Baglanyşyk synpynyň mysaly) metadata - maglumatlar bazamyzyň nädip düzülendigi we tertipleşdirilendigi baradaky maglumatlary elýeterli edýär. Firstöne ilki bilen birnäçe möhüm nokady belläliň: Maglumatlar bazamyza birikmek üçin URL: “jdbc: h2: mem: test”. synag maglumatlar bazamyzyň adydyr. JDBC API üçin bu katalog. Ady baş harp bilen, ýagny TEST bolar. H2 üçin deslapky shema PUBLIC. Indi, ähli ulanyjy tablisalaryny görkezýän synag ýazalyň. Näme üçin adaty? Sebäbi maglumat bazalarynda diňe bir ulanyjy tablisalary däl (özümiz döreden tablisa aňlatmalaryny ulanyp döredenlerimiz) däl, eýsem ulgam tablisalary hem bar. Maglumatlar bazasynyň gurluşy barada ulgam maglumatlary saklamaly. Her bir maglumat bazasy şeýle ulgam tablisalaryny başgaça saklap biler. Mysal üçin, H2-de " INFORMATION_SCHEMA " shemasynda saklanýar . Gyzykly tarapy, MAGLUMAT SCHEMA umumy bir çemeleşme, ýöne Oracle başga ugra gitdi. Has giňişleýin şu ýerde okap bilersiňiz: " INFORMATION_SCHEMA we Oracle ". Ulanyjy tablisalarynda meta-maglumaty alýan synagy ýazalyň:
@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 ýa-da hemmesiniň başlanýan ýeri - 9

Baglanyşyk howzy

JDBC spesifikasiýasyndaky baglanyşyk basseýninde "11-nji bap birikme howuzy" atly bölüm bar. Şeýle hem, baglanyşyk basseýniniň zerurlygy üçin esasy delil getirýär. Her Coonection maglumatlar bazasyna fiziki baglanyşykdyr. Ony döretmek we ýapmak gaty "gymmat" iş. JDBC diňe birikme basma API üpjün edýär. Şonuň üçin durmuşa geçirmegi saýlamak biziňkidir. Mysal üçin, şeýle amallara HikariCP girýär . Şoňa laýyklykda taslama garaşlylygymyza howuz goşmaly bolarys:
dependencies {
    implementation 'com.h2database:h2:1.4.197'
    implementation 'com.zaxxer:HikariCP:3.3.1'
    testImplementation 'junit:junit:4.12'
}
Indi bu howzy nädip ulanmalydyrys. Munuň üçin maglumat çeşmesini başlamaly, “Datasource” diýlip hem atlandyrylýar:
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;
}
Howuzdan baglanyşyk almak üçin synag ýazalyň:
@Test
public void shouldGetConnectionFromDataSource() throws SQLException {
	DataSource datasource = getDatasource();
	try (Connection con = datasource.getConnection()) {
		assertTrue(con.isValid(1));
	}
}
JDBC ýa-da hemmesiniň başlanýan ýeri - 10

Geleşikler

JDBC hakda iň gyzykly zatlaryň biri geleşiklerdir. JDBC spesifikasiýasynda olara "10-njy BAP Geleşikler" bölümi berilýär. Ilki bilen geleşigiň nämedigine düşünmeli. Geleşik, maglumatlar boýunça logiki taýdan birleşdirilen yzygiderli amallaryň topary, gaýtadan işlenen ýa-da umuman ýatyrylan topar. JDBC ulanylanda geleşik haçan başlar? Spesifikasiýada aýdylyşy ýaly, bu göni JDBC Sürüjisi tarapyndan amala aşyrylýar. Usuallyöne, adatça, häzirki SQL jümlesi geleşik talap edilende we geleşik entek döredilmedik ýagdaýynda başlaýar. Geleşik haçan gutarýar? Bu awtomatiki borçnama bilen dolandyrylýar. Awtokommit açyk bolsa, geleşik SQL beýany "gutarandan" soň tamamlanar. "Edilen" diýmek, SQL aňlatmasynyň görnüşine bagly:
  • Maglumatlary dolandyrmak dili, DML (Goýmak, täzelemek, öçürmek) ady bilen hem tanalýar,
    amal gutarandan soň geleşik tamamlanýar.
  • Beýannamalary saýlaň
    ResultSet ýapylanda geleşik tamamlanýar ( ResultSet # close )
  • “CallableStatement” we birnäçe netijäni gaýtaryp berýän aňlatmalar
    allhli baglanyşykly ResultSets ýapylanda we ähli çykyş kabul edilende (täzelenmeleriň sanyny goşmak bilen)
JDBC API-iň özüni alyp barşy. Hemişe bolşy ýaly, munuň üçin synag ýazalyň:
@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);
}
Bu ýönekeý. Thisöne bu diňe bir geleşigimiz bar bolsa dogry. Olaryň birnäçesi bar bolsa näme etmeli? Biri-birinden üzňeleşmeli. Şonuň üçin geleşikleriň izolýasiýa derejeleri we JDBC-iň olar bilen nähili işleşýändigi barada gürleşeliň.
JDBC ýa-da hemmesiniň başlanýan ýeri - 11

Izolýasiýa derejeleri

JDBC spesifikasiýasynyň "10.2 Geleşik izolýasiýa derejeleri" bölümini açalyň. Bu ýerde, has öňe gitmezden ozal, ACID ýaly bir zady ýatlamak isleýärin. ACID tranzaksiýa ulgamynyň talaplaryny beýan edýär.
  • Atomlyk:
    Ulgam üçin hiç hili amal bölekleýin berilmez. Suba-da kiçi amallarynyň hemmesi ýerine ýetiriler, ýa-da hiç biri ýerine ýetirilmez.
  • Dowamlylyk:
    Her bir üstünlikli amal, kesgitleme boýunça diňe dogry netijeleri ýazýar.
  • Izolýasiýa:
    Geleşik dowam edýärkä, bir wagtyň özünde geleşikler onuň netijesine täsir etmeli däldir.
  • Çydamlylygy:
    Eger geleşik üstünlikli tamamlansa, oňa edilen üýtgeşmeler haýsydyr bir şowsuzlyk sebäpli yzyna gaýtarylmaz.
Geleşik izolýasiýa derejeleri barada aýdanymyzda, “izolýasiýa” talaby hakda aýdýarys. Izolýasiýa gaty gymmat talap, şonuň üçin hakyky maglumat bazalarynda geleşigi düýbünden izolirlemeýän reesimler bar (Gaýtalanýan okamak izolýasiýa derejesi we has pes). Wikipediýada geleşikler bilen işleşende ýüze çykyp biljek meseleleriň ajaýyp düşündirişi bar. Bu ýerde has köp okamaly: " Geleşikleri ulanmak bilen paralel giriş meselesi ." Synagymyzy ýazmazdan ozal, “Gradle Build” skriptimizi azajyk üýtgedeliň: häsiýetleri bolan, ýagny taslamamyzyň sazlamalary bilen bir blok goşuň:
ext {
    h2Version = '1.3.176' // 1.4.177
    hikariVersion = '3.3.1'
    junitVersion = '4.12'
}
Soň bolsa, muny wersiýalarda ulanýarys:
dependencies {
    implementation "com.h2database:h2:${h2Version}"
    implementation "com.zaxxer:HikariCP:${hikariVersion}"
    testImplementation "junit:junit:${junitVersion}"
}
H2 wersiýasynyň has pes bolandygyny gören bolmagyňyz mümkin. Munuň sebäbini soň göreris. Onda izolýasiýa derejelerini nädip ulanarsyňyz? Geliň derrew kiçijik amaly mysala seredeliň:
@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);
}
Gyzykly tarapy, bu synag TRANSACTION_READ_UNCOMMITTED (mysal üçin sqlite ýa-da HSQL) goldaýan satyjyda şowsuz bolup biler. Geleşik derejesi bolsa işlemän biler. H2 Maglumat bazasynyň sürüjisiniň wersiýasyny görkezendigimizi ýadyňyzdamy? Eger ony h2Version = '1.4.177' we has ýokary derejä çykarsak, UNCOMMITTED-i okaň, kod üýtgetmedik bolsak-da, işini bes eder. Bu, satyjynyň we sürüjiniň wersiýasynyň saýlanmagynyň diňe harplar däldigini, islegleriňiziň nähili ýerine ýetiriljekdigini kesgitlär. Bu gylyk-häsiýeti 1.4.177 wersiýasynda nädip düzedip boljakdygyny we has ýokary wersiýalarynda nädip işlemejekdigini şu ýerden okap bilersiňiz: " MVStore re iniminde UNCOMMITTED izolýasiýa derejesini okaň ".
JDBC ýa-da hemmesiniň başlanýan ýeri - 12

Aşakdaky setir

Görşümiz ýaly, JDBC maglumatlar bazalary bilen işlemek üçin Java-yň elindäki güýçli guraldyr. Bu gysgaça syn size başlangyç nokady bermäge ýa-da ýadyňyzy täzelemäge kömek eder diýip umyt edýärin. Iýmitlenmek üçin goşmaça materiallar: # Wiaçeslaw
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION