Internal Exception: java.sql.SQLException: état non Valide, l'objet de Connexion est fermée

J'ai un JSF application qui utilise Eclipse Services de Persistance - 2.1.1.v20100817-r8050, et parfois, j'ai l'erreur suivante:

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.1.1.v20100817-r8050):    org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Invalid state, the Connection object is closed.
Error Code: 0
Call: SELECT XXXXX FROM XXXXX
bind => [/Home/Footer/]
Query: ReadAllQuery(name="WWW.find" referenceClass=WWW sql="SELECT XXXXX FROM XXXXX")

Je n'ai aucune idée de ce qui en est la cause. L'exception est levée dans la fonction suivante sur le "retour de q.getResultList();" la ligne.

public List<WWW> find(String url) {
    }
    EntityManager em = getEntityManager();
    try {
        Query q = em.createNamedQuery("WWW.find");
        q.setParameter("url", url);
        return q.getResultList();
    } finally {
        em.close();
    }
}

Nous avons SQL Server 2005 et la base de données n'est pas vers le bas. Ce n'est plus quelque chose de récent, de toujours se produire. Ci-dessous les propriétés que nous avons définies dans la persistence.xml fichier. Tous les commentaires sur ce qui devrait changer dans cette?

<properties>
  <property name="javax.persistence.jdbc.password" value="password"/>
  <property name="javax.persistence.jdbc.user" value="user"/>
  <property name="javax.persistence.jdbc.driver" value="net.sourceforge.jtds.jdbc.Driver"/>
  <property name="javax.persistence.jdbc.url" value="jdbc:jtds:sqlserver://SERVER:1433/DB"/>
  <property name="eclipselink.ddl-generation" value="none"/>
  <property name="eclipselink.jdbc.timeout" value="20"/>
  <property name="eclipselink.jdbc.connections.wait-timeout" value="20"/>
  <property name="javax.persistence.query.timeout" value="20"/>
  <property name="eclipselink.allow-zero-id" value="true"/>
</properties>

Voici mon édité classe
public class WWWJpaController {

public WWWWJpaController() {
    emf = Persistence.createEntityManagerFactory("properties");
}

public WWWWJpaController(String unitName) {
    emf = Persistence.createEntityManagerFactory(unitName);
}

private EntityManagerFactory emf = null;

public EntityManager getEntityManager() {
    return emf.createEntityManager();
}

public List<WWW> find(String url) {
    EntityManager em = getEntityManager();
    try {
        Query q = em.createNamedQuery("WWW.find");
        q.setParameter("url", url);
        return q.getResultList();
    }finally{
        em.close();
    }
}

}
Montrez votre getEntityManager(). Btw: pourquoi n'utilisez-vous pas @PersistenceContext? De cette façon, vous ne jamais avoir à créer ou à proximité vous-même.
Ajouté mon getEntityManager(). Avez-vous des liens vers des exemples de l'utilisation de @PersistenceContext? Je n'ai jamais utilisé avant.
Je viens de découvrir que ces problèmes se produisent lorsque la sauvegarde de notre serveur est fait. Nous sommes en cours d'exécution sur un serveur virtuel et lorsque le serveur est sauvegardé, il entre en "mode économie". Cela aurait-il un quelconque effet?
C'est tout à fait possible si ce problème est causé parce que l'autre extrémité de la connexion brusquement fermé la connexion alors qu'il est encore en usage. Vous aurez besoin de chercher à savoir pourquoi ce qui se passe au cours de la sauvegarde. Est-il redémarrer le serveur et/ou du pool de connexion pour une raison quelconque?
L'erreur qui s'est passé une fois de plus sur le week-end, quand pas de sauvegardes ont été exécutés. Je pense donc qu'il exclut de fait les sauvegardes des problèmes liés à la cause. Pouvez-vous suggérer un peu de code qui permet de vérifier la connexion avant l'exécution de la sélectionner. Et si la connexion n'existe pas de se reconnecter.

OriginalL'auteur CaptainMorgan | 2012-06-01