2015-08-09 3 views
0

Mon serveur utilise Hibernate pour se connecter à une base de données MySQL. J'utilise aussi c3p0 pour le regroupement de connexions. Je veux exécuter une requête SQL spécifique une fois sur chaque connexion lors de sa création, mais comme j'utilise ComboPooledDataSource, il n'y a aucun moyen de détecter quand une nouvelle session est créée. J'ai découvert que je peux exécuter ma requête en activant la connexion de test à la caisse et définir la requête que je veux exécuter en tant que requête de test préférée (mais elle peut s'exécuter plus d'une fois).Comment exécuter une requête SQL juste après Hibernate SessionFactory crée une nouvelle connexion?

String query = "my query"; 
comboPooledDataSource.setTestConnectionOnCheckout(true); 
comboPooledDataSource.setPreferredTestQuery(query); 

Existe-t-il un moyen plus élégant d'accomplir ceci?

* Modifier *

Je suis en train de faire ma db accepter les caractères utf8mb4. La façon acceptable de le faire est en appliquant ce qui suit au fichier my.cnf:

[mysqld] 
character-set-server = utf8mb4 
collation-server = utf8mb4_unicode_ci 

Le problème est que je n'ai pas accès à quoi que ce soit, mais mon db, donc ma solution est d'exécuter SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci; pour chaque connexion.

+0

ce qui est ur serveur d'application? vous pouvez le configurer dans la configuration du serveur d'application en définissant la source de données - url de connexion etc – spiderman

+0

@Kiran Je n'ai pas accès à la configuration du serveur. Je ne peux exécuter que des requêtes sur mon db. –

Répondre

2

Voir l'interface ConnectionCustomizer de c3p0. Remplacez la méthode onAcquire(...) de AbstractConnectionCustomizer. onAcquire(...) est appelée une seule fois pour chaque connexion, après qu'elle a été acquise à partir de la base de données, avant qu'elle ne soit disponible pour l'extraction par les clients.

Ou, si vous voulez vous pouvez simplement utiliser intégré dans l'exemple de C3P0 pour tout ce genre de cas d'utilisation, com.mchange.v2.c3p0.example.InitSqlConnectionCustomizer

En c3p0.properties:

c3p0.connectionCustomizerClassName=com.mchange.v2.c3p0.example.InitSqlConnectionCustomizer 
c3p0.extensions.initSql=SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci