Regroupement de connexions JDBC à l'aide de C3P0


Voici ma classe d'aide pour obtenir une connexion DB:

J'ai utilisé le pool de connexions C3P0 comme décrit ici.

public class DBConnection {

    private static DataSource dataSource;
    private static final String DRIVER_NAME;
    private static final String URL;
    private static final String UNAME;
    private static final String PWD;

    static {

        final ResourceBundle config = ResourceBundle
                .getBundle("props.database");
        DRIVER_NAME = config.getString("driverName");
        URL = config.getString("url");
        UNAME = config.getString("uname");
        PWD = config.getString("pwd");

        dataSource = setupDataSource();
    }

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

    private static DataSource setupDataSource() {
        ComboPooledDataSource cpds = new ComboPooledDataSource();
        try {
            cpds.setDriverClass(DRIVER_NAME);
        } catch (PropertyVetoException e) {
            e.printStackTrace();
        }
        cpds.setJdbcUrl(URL);
        cpds.setUser(UNAME);
        cpds.setPassword(PWD);
        cpds.setMinPoolSize(5);
        cpds.setAcquireIncrement(5);
        cpds.setMaxPoolSize(20);
        return cpds;
    }
}

Dans le DAO, je vais écrire quelque chose comme ceci:

try {
            conn = DBConnection.getOracleConnection();

            ....


} finally {
    try {
        if (rs != null) {
            rs.close();
        }
        if (ps != null) {
            ps.close();
        }
        if (conn != null) {
            conn.close();
        }
    } catch (SQLException e) {
        logger
                .logError("Exception occured while closing cursors!", e);

    }

Maintenant, ma question est de savoir si je devrais prendre la peine de faire un autre nettoyage que de fermer les curseurs(connection/statement/ResultSet/preparedStatement) répertoriés dans le bloc finally.

Qu'est-Ce que ce nettoyage?? Quand et où dois-je le faire?

Devriez-vous trouver tout ce qui ne va pas dans le code ci-dessus, veuillez le souligner.

Author: jai, 2009-09-22

4 answers

Avec une source de données groupée, les connexions dans le pool ne sont pas réellement fermées, elles sont simplement renvoyées dans le pool. Cependant, lorsque l'application est arrêtée, ces connexions à la base de données doivent être correctement et réellement fermées, ce qui est l'endroit où le nettoyage final entre en jeu.

Incidemment, le projet c3p0 est à peu près mort dans l'eau, je vous recommande d'utiliserApache Commons DBCP à la place, il est toujours maintenu.

 23
Author: skaffman, 2009-09-22 08:01:18

DAOs ne devrait pas être responsable de l'acquisition d'une connexion à la base de données. Ils n'ont aucun moyen de savoir quand ils sont utilisés dans le cadre d'une opération plus vaste. Vous devez transmettre la source de données ou l'instance de connexion au DAO.

Si l'un des appels à fermer dans votre bloc finally lève une exception, aucun de ceux qui suivent ne sera appelé. Chacun doit être dans son propre bloc try/catch. Je les ai mis dans une classe utilitaire en tant que méthodes statiques.

 6
Author: duffymo, 2009-09-22 09:53:48

Le code me semble bien, mais j'écrirais une méthode d'aide qui effectue les opérations de fermeture ou vous obtiendrez ce bloc final verbeux dans chaque DAO ou méthode. Peut-être devriez-vous écrire trois blocs try-catch distincts autour des opérations de fermeture, pour vous assurer que la connexion est fermée, peu importe si l'instruction et le jeu de résultats ont jeté une exection. Notez également que le javadoc, dit -

Lorsqu'un objet Instruction est fermé, son objet ResultSet actuel, s'il existe, est également fermé.

Vous n'avez donc pas besoin de fermer le jeu de résultats dans l'exemple ci-dessus, mais vous le pouvez.

La méthode de nettoyage liée sert à fermer la source de données, ce qui n'est pas nécessaire dans la plupart des projets car la DS vit aussi longtemps que votre application est en cours d'exécution.

 5
Author: Tim Büthe, 2009-09-22 08:03:37

J'utilise Play Framework et Scala, donc l'exemple suivant est dans le projet play.

Etape 1. configuration

Dans la construction.sbt, si vous utilisez mysql / hive comme base de données, vous devez ajouter ces propriétés.

libraryDependencies ++ = Seq (
   jdbc,
  "mysql" % "mysql-connector-java" % "5.1.31",
  "org.apache.hive" % "hive-jdbc" % "0.12.0",
  "com.mchange" % "c3p0" % "0.9.2.1"
)

Etape 2. comment y accéder? vous devez importer la bibliothèque c3p0.

import com.mchange.v2.c3p0.ComboPooledDataSource

Étape 3. et puis vous devez créer une instance.

val cpds = new ComboPooledDataSource()
cpds.setDriverClass(...)
cpds.setJdbcUrl(...)
cpds.setUser(...)
cpds.setPassword(...)

Étape 4. vous obtenez une connexion

cpds.getConnection
 0
Author: Haimei, 2014-11-24 20:43:54