2010-02-03 5 views
1

J'ai une simple application web écrite en java qui a accès servlets la base de données Mysql pour générer des rapports. La génération de rapports arrive très fréquemment. J'utilise le commun apache DBCP pour obtenir des connexions au DB. Je ferme également la connexion explicite dans le bloc finally toujours. Mais je ne ferme pas explicitement les instructions et les ResultSets que je crée.Comment surmonter l'exception "java.sql.SQLException: Trop de connexions"?

Je suis obligé de redémarrer l'instance tomcat chaque fois que j'obtiens l'Exception qui dit "java.sql.SQLException: Trop de connexions".

Comment puis-je surmonter cela .... ai-je besoin d'augmenter les connexions max dans Mysql?

Toute aide est appréciée.

+0

Êtes-vous sûr que votre connexion est fermée? –

+0

avez-vous essayé ConnectionPool? – bhups

Répondre

1
  • Oui, vous devez fermer votre Statement s/s ResultSet - Ceux-ci seront généralement référence à la première JDBC Connection plutôt que le PooledConnection proxy Connection retourné par le DBCP PooledDataSource.
  • Pensez à utiliser C3P0 plutôt que DBCP. Envisagez d'utiliser Spring pour gérer vos opérations JDBC et vous n'aurez jamais à vous soucier de ce genre de choses.
+0

Oui. Je pense que le vrai problème est le rapport/ResultSets, à cause du premier point. Lorsque vous fermez la connexion déléguée (celle qui revient en fait au pool), elle ne ferme pas sa connexion sous-jacente (elle veut la garder). Donc les RS et ST ne se ferment jamais et les ressources sont épuisées. Je ne sais pas si C3P0 a quelque chose à surmonter automatiquement, mais si vous en prenez soin, cela doit fonctionner très bien. Avec DBCP. – helios

+0

Désolé - Mon deuxième point à propos de C3P0 n'était pas lié; vous devez toujours fermer la connexion et toutes les instructions/ResultSets correctement. Il semble juste préférable à DBCP (si vous recherchez DBCP C3P0, vous verrez ce que je veux dire). – Adamski

0

J'ai rencontré le même problème. Adamski mentionne l'utilisation de Spring pour gérer les connexions JDBC.

J'utilise le @Autowired EntityManager em Voici mon exemple de code DAO:

@Transactional(rollbackOn={Exception.class}) 
@Component 
public class CustomerDao { 
    private static final Logger LOGGER = LoggerFactory.getLogger(UserDao.class); 

    @Autowired 
    private EntityManager em; 

public Customer saveOrUpdateCustomer(Customer customer) { 

    Session session = em.unwrap(Session.class); 

    session.saveOrUpdate(customer); 

    return customer; 
    } 

Mysql max_connection est 151. testé sur les utilisateurs simultanés de 300. Je reçois toujours le trop grand nombre de connexions exception.

Questions connexes