Heim  >  Artikel  >  Datenbank  >  Verwendet meine JDBC-Verbindung tatsächlich einen Pool?

Verwendet meine JDBC-Verbindung tatsächlich einen Pool?

DDD
DDDOriginal
2024-11-24 03:48:10872Durchsuche

Is My JDBC Connection Actually Using a Pool?

JDBC-Verbindungspooling: Überprüfung der Implementierung

Die Feststellung, ob Sie JDBC-Verbindungspooling verwenden, kann aufgrund seiner angeblichen Einfachheit verwirrend sein. Schauen wir uns die bereitgestellte Verbindungsklasse und deren Verwendung genauer an, um festzustellen, ob echtes Verbindungspooling verwendet wird.

Verbindungsklassenanalyse

Die bereitgestellte Verbindungsklasse scheint die BasicDataSource von DBCP zu verwenden Verbindungsmanagement. Bei näherer Betrachtung zeigt sich jedoch, dass bei jedem Verbindungsaufbau ein neuer Verbindungspool aufgebaut wird. Dies macht das grundlegende Konzept des Verbindungspoolings zunichte, da Verbindungen aus einem einzigen, gemeinsam genutzten Pool gezogen werden sollten.

Außerdem wird es nicht empfohlen, die Verbindung als Instanzvariable zu halten. Verbindungen sollten nach Bedarf abgerufen und ordnungsgemäß geschlossen werden, um Ressourcen effektiv zurückzugewinnen.

Neu geschriebene Codeauszüge

Um diese Probleme zu beheben, finden Sie hier eine überarbeitete Verbindungsklasse:

public final class Database {

    private static final BasicDataSource dataSource = new BasicDataSource();

    static {
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/data");
        dataSource.setUsername("USERNAME");
        dataSource.setPassword("PASSWORD");
    }

    private Database() {
        //
    }

    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

}

Dieser Code erstellt den Verbindungspool einmal und bietet eine Möglichkeit, Verbindungen daraus zu erhalten it.

Überarbeitete Verbindungsnutzung

So würden Sie die Verbindungsklasse und die JDBC-Funktionalität robuster nutzen:

private static final String SQL_EXIST = "SELECT * FROM users WHERE username=? AND password=?";

public boolean exist(User user) throws SQLException {
    boolean exist = false;

    try (
        Connection connection = Database.getConnection();
        PreparedStatement statement = connection.prepareStatement(SQL_EXIST);
    ) {
        statement.setString(1, user.getUsername());
        statement.setString(2, user.getPassword());

        try (ResultSet resultSet = preparedStatement.executeQuery()) {
            exist = resultSet.next();
        }
    }       

    return exist;
}

Dies Der überarbeitete Code verwendet einen Try-with-Resource-Block, um die ordnungsgemäße Freigabe von Verbindungen und anderen Ressourcen sicherzustellen.

Das obige ist der detaillierte Inhalt vonVerwendet meine JDBC-Verbindung tatsächlich einen Pool?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn