Connexion JDBC mise en commun à l'aide de C3P0
Qui suit est ma classe d'assistance pour obtenir de l'DB connexion:
J'ai utilisé le C3P0 le regroupement de connexion, 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 dois-je la peine de faire toutes autres opérations de nettoyage autres que de fermer les curseurs(connexion/déclaration/resultSet/preparedStatement) répertoriés dans le bloc finally.
Qu'est-ce que cette de nettoyage?? Quand et où dois-je le faire?
Si vous trouvez quelque chose de mal dans le code ci-dessus, nous vous prions d'.
- dans le JDK 7, vous n'avez pas besoin de fermer preparedStatement, elle met en œuvre AutoClosable. en raison de ce post
Vous devez vous connecter pour publier un commentaire.
Avec une mise en commun de la source de données, les connexions dans le pool ne sont pas réellement fermé, ils sont juste retourné à la piscine. Toutefois, lorsque l'arrêt de l'application, les connexions à la base de données doit être correctement et effectivement fermé, qui est l'endroit où le nettoyage final est en.
D'ailleurs, le c3p0 projet est assez mort dans l'eau, je vous recommande d'utiliser Apache Commons DBCP au lieu de cela, il est toujours maintenu.
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 devriez être en train de passer de la source de données ou la connexion à l'instance dans le DAO.
Si l'un des appels à l'étroit dans votre bloc finally lancer une exception, aucun de ceux qui vont suivre vont être appelés. Chacun doit être dans son propre bloc try/catch. Je les ai mis dans une classe utilitaire que des méthodes statiques.
Le code semble bien pour moi, mais je voudrais écrire une méthode d'assistance que le fait de la fermeture ou vous aurez cette prolixe enfin à bloc tous les DAO ou de la méthode. Peut-être que vous devriez écrire trois try-catch-blocs autour de la clôture des Opérations, assurez-vous que la connexion est fermée, peu importe si la déclaration et resultset ont jeté un exection. Notez également que le javadoc dit
De sorte que vous n'avez pas besoin de fermer le jeu de résultats dans l'exemple ci-dessus, mais vous pourriez.
Liés méthode de nettoyage est de la fermeture de la source de données, ce qui n'est pas nécessaire dans la plupart des projets, parce que DS la vie aussi longtemps que votre application est en cours d'exécution.
J'utilise Jouer au Cadre et à la Scala, l'exemple suivant est en jeu projet.
Étape 1. configuration
Dans la construction.sbt, si vous utilisez mysql/ruche en tant que base de données, vous devez ajouter ces propriétés.
Step2. comment y accéder? vous avez besoin d'importer c3p0 bibliothèque.
Step3. et puis vous avez besoin de créer une instance.
Etape 4. vous obtenez une connexion