2011-01-14 6 views
0

J'utilise le printemps avec plusieurs sources de données (restauration de plusieurs db mysql) et l'utilisation de tomcat dbcp. Je reçois quelques exceptions étranges commeSpring JDBC avec Tomcat DBCP et plusieurs sources de données

    procédure
  • not found - lorsque le proc est certainement présent dans le db
  • ne peut pas emprunter de la piscine - la configuration dev locale, donc sans aucun doute la piscine est pas plein

le problème que je me sens peut-être cela, ont besoin d'intrants de tout le monde:

J'ai un objet jdbcTemplate défini dans mon spring.xml, sur toutes les requêtes que je dois tirer, je l'appelle jdbcTemplate.setDataSource() pour définir le da approprié tasource puis utilisez simplejdbccall(jdbctemplate) pour exécuter le proc. Dois-je définir également plusieurs objets jdbcTemplate, c'est-à-dire un pour chaque source de données définie?

Le bean d'où je mets la source de données sur le jdbctemplate et l'exécution du proc stocké est défini comme prototype.

+0

Si vous ne fournissez pas la synchronisation autour des opérations d'accès aux données lorsque vous modifiez la source de données, c'est horriblement fil dangereux. –

Répondre

5

Vous ne devriez certainement pas utiliser un partagé JdbcTemplate si vous continuez à changer DataSource. Réglez le DataSource une fois, et laissez-le tranquille. Cela signifie soit plusieurs JdbcTemplate beans, un pour chaque DataSource, ou créer de nouveaux objets JdbcTemplate manuellement, sur demande, et ne pas les partager. Il n'y a pas de frais généraux significatifs pour la création de nouveaux, ce n'est pas un problème.

Vous pouvez les définir comme prototype, bien sûr, mais il n'y a pas grand-chose si vous allez injecter le DataSource manuellement. Pourrait également instancier JdbcTemplate en utilisant new.

0

Merci pour la réponse. J'ai passé ces erreurs en créant une nouvelle instance de jdbctemplate à chaque fois. J'ai également mis à jour vers le dernier mysql jconnector jsr (5.1.14) La conception de la classe est maintenant assez simple. J'ai un dao de base qui utilise une nouvelle instance d'un wrapper print jdbc personnalisé qui instancie à son tour un objet jdbcTemplate en tant que variable d'instance. Cette variable d'instance est utilisée dans une nouvelle instance d'un SimpleJdbcCall pour chaque requête. toutes mes classes de dao héritent de cette base dao.

Cependant, il y a quelques erreurs intermittentes comme ceci:

org.springframework.jdbc.support.MetaDataAccessException: Erreur lors de l'extraction DataBaseMetaData .... . . . provoqué par: org.apache.tomcat.dbcp.dbcp.PoolingDataSource.checkConnection(): La connexion est fermée. Je ne vois pas de motif pour cette erreur. J'ai une initialisation de 10 pour chacune des sources de données & un maximum de 100. des conseils concernant ce qui pourrait être le problème ici? Spring a un certain niveau de support natif pour basculer les sources de données de façon dynamique.

Questions connexes