Könnyek és fájdalom
Java programok futtatása közben hibák léphetnek fel. Az adatbázissal való munka során hibák lépnek fel. Minden azon múlik, hogy melyikükről tudod megjósolni és megfelelő megoldást kínálni.
A hibák első nagy csoportja vár rád a sor végrehajtásakor:
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "secret");
Mire számíthatsz itt?
1. hiba. Az illesztőprogram nem található .
Ha a „Nem található megfelelő illesztőprogram a következőhöz” hibaüzenetet kapja , az azt jelenti, hogy a DriverManager nem tudta megérteni, milyen típusú DBMS van az URL mögött. Például azt írtad, hogy jdbc_mysql: a jdbc:mysql helyett:
Hiba 2. Csatlakozási hiba .
Ha hibázik a gazdagépnévben, akkor nagy valószínűséggel a következő üzenet jelenik meg: „Nem ismert ilyen gazdagép” vagy „Kommunikációs kapcsolathiba”.
3. hiba. Az adatbázisnév helytelen .
Ha hibásan írta le az adatbázis nevét, vagy csatlakozik egy másik kiszolgálóhoz, ahol az nem létezik, akkor a következő üzenet jelenik meg: „Ismeretlen adatbázis 'supershop3'” .
Hiba 4. Rossz bejelentkezési név vagy jelszó .
Ha elfelejtette az adatbázis jelszavát, vagy hibásan adta meg, akkor valószínűleg olyan üzenetet fog kapni, mint „A 'root'@'localhost' felhasználó hozzáférése megtagadva (jelszó használatával: IGEN)” .
SQL kivétel
Ha ennek ellenére létrejön a kapcsolat a bázissal, akkor a továbbiakban érdekesebb lesz. Az adatbázissal való munka során fellépő hibák esetén a JDBC-nek van egy speciális kivétele - java.sql.SQLException . Valamint több fajtája.
Ennek a kivételnek csak egy további metódusa van (az Exception osztályhoz képest) - a getSQLState() metódus, amely visszaadja az SQL-kiszolgáló által visszaküldött állapotkódot (karakterláncot). A hibakezelés így néz ki:
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "secret");
try {
int rowsCount = statement.executeUpdate("DELETE FROM ‘Unemployees’");
} catch (SQLException ex) {
// If table doesn't exist
if (ex.getSQLState().compareTo("X0Y32") != 0) {
throw ex;
}
} finally {
connection.close();
}
Több száz hibakód létezik. A teljes listát itt tekintheti meg .
De néha a hibakódok segítenek a JDBC-nek jobban megérteni a hibát, és nem csak SQLExceptiont, hanem speciális SQLExceptiont is dob:
BatchUpdateException | Hiba a csoportos kérés során |
DataTruncation | Gyakran előfordul hosszú adatok csonkolásakor |
SQLClientInfoException | Az ügyfél olyan paramétereket adott át, amelyek nem állíthatók be a kapcsolaton: Kapcsolat |
SQLDataException | Hiba az adatokkal, a részletek a DBMS típusától függenek |
SQLException | Adatbázis-hozzáférési hiba vagy egyéb általános hibák |
SQLFeatureNotSupportedException | A DBMS nem támogatja ezt a funkciót |
SQLIntegrityConstraintViolationException | Minden hiba a következővel: SQLState ==22 |
SQLInvalidAuthorizationSpecException | Hozzáférési és/vagy engedélyezési hiba |
SQLNonTransientConnectionException | Minden hiba a következővel: SQLState ==08 |
SQLRecoverableException | Hiba van, de alkalmazás beavatkozásával javítható |
SQLSyntaxErrorException | Hiba a lekérdezés szintaxisában |
SQLTimeoutException | A kérés túl sokáig tartott |
SQLTransactionRollbackException | Hiba a tranzakció visszaállítása közben |
SQLWarning | A DBMS figyelmeztetést adott ki |
Példák a hibákra
Ha hiba történt a szerveralkalmazás szakaszában, akkor azt általában csak naplózni, majd részletesebben lehet kezelni. De ha ez akkor történt, amikor az alkalmazás futott a programozó számítógépén, akkor alaposan meg kell vizsgálnia ennek okát.
Az adatbázisokkal végzett munka során két legnagyobb hibaosztály létezik:
- Kérjen szöveges hibát
- Hiba a ResultSet használata közben
Nagyon gyakran előfordulhat hiba a kérés szövegében. A lekérdezés lehet nagyon hosszú, több táblát (JOIN-on keresztül csatlakozva) és allekérdezést (SUBSELECT) tartalmazhat. Nem könnyű hibát találni egy ilyen kérésben. Ráadásul a kéréseket gyakran alkatrészekből ragasztják össze, ott adják hozzá az adatokat.
A legelső hiba, amellyel tisztában kell lennie, az SQLSyntaxErrorException . Az ilyen hiba általában azt jelenti, hogy a kérés törzsében elírás van.
Vegyük kedvenc példánkat:
ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
results.next();
int count = results.getInt(1);
És „véletlenül” törölje a csillagot a kérés törzséből:
ResultSet results = statement.executeQuery("SELECT Count() FROM user");
results.next();
int count = results.getInt(1);
Akkor kivételt kapunk:
Exception in thread "main" java.sql.SQLSyntaxErrorException:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM task' at line 1
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
Az SQL szerver azt mondja, hogy szintaktikai hiba volt a FROM előtt.
Gondosan megvizsgáljuk a kérést és gondolkodunk. Ha semmi sem jut eszedbe, és ez nagyon gyakran megtörténik, akkor meg kell kérned valakit, hogy nézze meg, mi a baj.
Egy másik népszerű hiba a ResultSet - a kérés eredménye - nem megfelelő munka. Tegyük fel, hogy elfelejtette, hogy az adatok beolvasása előtt a ResultSet objektum „aktuális sora” az első sor elé kerül, akkor a következő kódot kapja:
ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
// results.next();
int count = results.getInt(1);
Ezt a hibát fogja kapni:
2012 12:55:48 AM jButton5ActionPerformed
SEVERE: null
java.sql.SQLException: Before start of result set
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:841)
at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5650)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5570)
Alaposan megvizsgáljuk a hibát és gondolkodunk. Utána keresünk google-t és találunk pár példát, és megpróbáljuk megérteni a megoldást.
GO TO FULL VERSION