Heim >Java >javaLernprogramm >Einführung und Methoden von DataSourceUitls
Die DataSourceUitls-Klasse befindet sich im Paket org.springframework.jdbc.datasource. Sie bietet viele statische Methoden zum Abrufen einer JDBC-Verbindung von einer javax.sql.DataSource und bietet Spring-Transaktionsverwaltung Unterstützung.
Innerhalb der JdbcTemplate-Klasse wird DataSourceUtils mehrfach verwendet. Tatsächlich können wir DataSourceUitls auch direkt im Code verwenden, um JDBC zu betreiben.
public static Connection getConnection(DataSource dataSource) throws CannotGetJdbcConnectionException { try { return doGetConnection(dataSource); } catch (SQLException ex) { throw new CannotGetJdbcConnectionException("Failed to obtain JDBC Connection", ex); } catch (IllegalStateException ex) { throw new CannotGetJdbcConnectionException("Failed to obtain JDBC Connection: " + ex.getMessage()); } }
Es ist ersichtlich, dass durch Übergabe einer angegebenen DataSource eine Verbindung erstellt werden kann erhalten, wird der Erfassungsprozess durch die doGetConnection-Methode implementiert. Wenn SQLException und IllegalStateException ausgelöst werden, wickeln Sie sie in CannotGetJdbcConnectionException ein. Tatsächlich können nur SQLException und IllegalStateException ausgelöst werden. Wenn wir uns den Quellcode von CannotGetJdbcConnectionException ansehen, können wir feststellen, dass CannotGetJdbcConnectionException tatsächlich eine Unterklasse von DataAccessException ist. Daher kann man sagen, dass getConnection die ausgelöste Ausnahme einheitlich in Springs DataAccessException kapselt.
public static Connection doGetConnection(DataSource dataSource) throws SQLException { Assert.notNull(dataSource, "No DataSource specified"); ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource); if (conHolder != null && (conHolder.hasConnection() || conHolder.isSynchronizedWithTransaction())) { conHolder.requested(); if (!conHolder.hasConnection()) { logger.debug("Fetching resumed JDBC Connection from DataSource"); conHolder.setConnection(fetchConnection(dataSource)); } return conHolder.getConnection(); } // Else we either got no holder or an empty thread-bound holder here. logger.debug("Fetching JDBC Connection from DataSource"); Connection con = fetchConnection(dataSource); if (TransactionSynchronizationManager.isSynchronizationActive()) { logger.debug("Registering transaction synchronization for JDBC Connection"); // Use same Connection for further JDBC actions within the transaction. // Thread-bound object will get removed by synchronization at transaction completion. ConnectionHolder holderToUse = conHolder; if (holderToUse == null) { holderToUse = new ConnectionHolder(con); } else { holderToUse.setConnection(con); } holderToUse.requested(); TransactionSynchronizationManager.registerSynchronization( new ConnectionSynchronization(holderToUse, dataSource)); holderToUse.setSynchronizedWithTransaction(true); if (holderToUse != conHolder) { TransactionSynchronizationManager.bindResource(dataSource, holderToUse); } } return con; }
Die doGetConnection-Methode ist die Kernmethode für den tatsächlichen Vorgang zum Erhalten einer Verbindung. Aus dem Quellcode kann geschlossen werden, dass eine neue Verbindung erstellt wird, wenn die Transaktionssynchronisierung des aktuellen Threads aktiv ist und die Spring-Transaktionsverwaltungsunterstützung nur zur Verbindung hinzugefügt wird erstellt; wenn eine entsprechende Verbindung für den aktuellen Thread vorhanden ist, dann gibt es eine aktuelle Transaktionsverwaltungszuordnung.
fetchConnection ist eine private Methode, die nicht für die Öffentlichkeit zugänglich ist. Sie führt tatsächlich eine einfache Funktion aus: Erstellen einer neuen Verbindung aus der aktuellen DastaSource. Wenn die Erstellung fehlschlägt, tritt eine IllegalStateException auf ausgelöst, was darauf hinweist, dass keine neue Verbindung hergestellt werden kann.
public static void releaseConnection(@Nullable Connection con, @Nullable DataSource dataSource) { try { doReleaseConnection(con, dataSource); } catch (SQLException ex) { logger.debug("Could not close JDBC Connection", ex); } catch (Throwable ex) { logger.debug("Unexpected exception on closing JDBC Connection", ex); } }
Die spezifische Implementierung der ReleaseConnection-Methode wird von doReleaseConnection verwaltet. Wenn eine Ausnahme ausgelöst wird, wird diese nur im Protokoll debuggt und nicht extern ausgelöst. Beide Parameter dieser Methode sind NULL.
Wenn con NULL ist, wird dieser Aufruf ignoriert, während der andere Parameter NULL sein darf.
public static void doReleaseConnection(@Nullable Connection con, @Nullable DataSource dataSource) throws SQLException { if (con == null) { return; } if (dataSource != null) { ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource); if (conHolder != null && connectionEquals(conHolder, con)) { // It's the transactional Connection: Don't close it. conHolder.released(); return; } } logger.debug("Returning JDBC Connection to DataSource"); doCloseConnection(con, dataSource); }
Die doReleaseConnection-Methode ist die Methode, die die Verbindung tatsächlich freigibt. Im Vergleich zur releaseConnection-Methode schließt sie die Verarbeitung der beiden eingehenden Daten ab Die Prüfsumme der Parameter löst eine Ausnahme einer niedrigeren Ebene aus. Wenn dataSource nicht NULL ist, geben Sie die aktuelle Verbindung frei, die von diesem ConnectionHolder beibehalten wird, damit die aktuelle Verbindung wiederverwendet werden kann. Dies ist sehr hilfreich, um die Leistung von JDBC-Vorgängen zu verbessern. Wenn dataSource null ist, schließen Sie die Verbindung direkt.
public static void doCloseConnection(Connection con, @Nullable DataSource dataSource) throws SQLException { if (!(dataSource instanceof SmartDataSource) || ((SmartDataSource) dataSource).shouldClose(con)) { con.close(); } }
In der doReleaseConnection-Methode haben wir gelernt, dass die Datenquelle NULL ist, wenn sie NULL ist führt die doCloseConnection-Methode aus. Tatsächlich wird die Verbindung nur dann tatsächlich geschlossen, wenn die dataSource die Schnittstelle org.springframework.jdbc.datasource.SmartDataSource nicht implementiert oder wenn die dataSource die Schnittstelle org.springframework.jdbc.datasource.SmartDataSource implementiert und geschlossen werden darf.
Die Schnittstelle org.springframework.jdbc.datasource.SmartDataSource ist eine Erweiterung der Schnittstelle javax.sql.DataSource und gibt die JDbc-Verbindung in unverpackter Form zurück. Klassen, die diese Schnittstelle implementieren, können abfragen, ob die Verbindung nach Abschluss des Vorgangs geschlossen werden soll. Solche Prüfungen werden automatisch in Srping und DataSourceUitls und JdbcTemplate durchgeführt.
Das obige ist der detaillierte Inhalt vonEinführung und Methoden von DataSourceUitls. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!