JPA连接超时

时间:2014-09-16 07:23:44

标签: java database jpa entitymanager jdbc-pool

为什么这个超时并且没有响应?

日志:

thufir@dur:~$ 
thufir@dur:~$ cat NetBeansProjects/Legacy/output.log 
[EL Config]: metadata: 2014-09-16 02:03:51.562--ServerSession(18132245)--Thread(Thread[AWT-EventQueue-0,6,main])--The access type for the persistent class [class legacy.database.Clients] is set to [FIELD].
[EL Config]: metadata: 2014-09-16 02:03:51.678--ServerSession(18132245)--Thread(Thread[AWT-EventQueue-0,6,main])--The alias name for the entity class [class legacy.database.Clients] is being defaulted to: Clients.
[EL Info]: 2014-09-16 02:03:52.487--ServerSession(18132245)--Thread(Thread[AWT-EventQueue-0,6,main])--EclipseLink, version: Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd
[EL Fine]: connection: 2014-09-16 02:03:53.762--Thread(Thread[AWT-EventQueue-0,6,main])--Detected database platform: org.eclipse.persistence.platform.database.MySQLPlatform
[EL Config]: connection: 2014-09-16 02:03:53.814--ServerSession(18132245)--Connection(17690514)--Thread(Thread[AWT-EventQueue-0,6,main])--connecting(DatabaseLogin(
    platform=>MySQLPlatform
    user name=> "jdbc"
    datasource URL=> "jdbc:mysql://ix.bounceme.net:3306/legacy?zeroDateTimeBehavior=convertToNull"
))
[EL Config]: connection: 2014-09-16 02:03:54.683--ServerSession(18132245)--Connection(14590431)--Thread(Thread[AWT-EventQueue-0,6,main])--Connected: jdbc:mysql://ix.bounceme.net:3306/legacy?zeroDateTimeBehavior=convertToNull
    User: jdbc@S0106c8fb2677e8ca.vs.shawcable.net
    Database: MySQL  Version: 5.5.38-0ubuntu0.14.04.1
    Driver: MySQL Connector Java  Version: mysql-connector-java-5.1.28 ( Revision: ${bzr.revision-id} )
[EL Info]: connection: 2014-09-16 02:03:54.984--ServerSession(18132245)--Thread(Thread[AWT-EventQueue-0,6,main])--file:/home/thufir/NetBeansProjects/Legacy/dist/Legacy.jar_LegacyDatabasePU login successful
[EL Fine]: sql: 2014-09-16 02:05:15.185--ClientSession(10981153)--Connection(14590431)--Thread(Thread[AWT-EventQueue-0,6,main])--INSERT INTO legacy.clients (address, city, closer1, closer2, company, confirmation, country, date_cancelled, date_created, date_sold, date_updated, description, email, exterior_color, features, interior_color, interior_type, kilometres, make, mileageType, model, name, notes, opener, payment_method, phone1, phone2, postal, price, province, recording, refunded, reg_fee, status, tax_rate, trim, verifier, year) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    bind => [, , , , , , , null, 2014-09-16 02:05:15.044, null, null, , gjkghjkg, , , , , 0, , , , tyuigtyui, , nick, , , , , 0.0, , , 0.0, 0.0, opened1, 0, , , 0]
[EL Fine]: sql: 2014-09-16 02:05:15.327--ClientSession(10981153)--Connection(14590431)--Thread(Thread[AWT-EventQueue-0,6,main])--SELECT LAST_INSERT_ID()
thufir@dur:~$ 

最糟糕的是,它应该重新建立与数据库的连接,即使它缓慢地建立连接。

package legacy.database;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

public enum Queries {

    INSTANCE;
    private final Logger log = Logger.getLogger(Queries.class.getName());
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("LegacyDatabasePU");
    EntityManager em = emf.createEntityManager();

    private EntityManager reconnect() {
        emf = Persistence.createEntityManagerFactory("LegacyDatabasePU");
        em = emf.createEntityManager();
        log.info("em\t" + em.isOpen());
        return em;
    }

    private List<Clients> findAll() {
        reconnect();
        Query q = em.createQuery("select c from Clients c");
        List<Clients> clients = q.getResultList();
        em.close();
        emf.close();
        return clients;
    }

    public List<Clients> selectByCriteria(Criteria criteria) {
        log.info(criteria.toString());
        reconnect();
        CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
        CriteriaQuery<Clients> clientCriteriaQuery = criteriaBuilder.createQuery(Clients.class);
        Root<Clients> clientRoot = clientCriteriaQuery.from(Clients.class);
        clientCriteriaQuery.select(clientRoot);
        List<Predicate> predicates = new ArrayList<>();
        predicates.add(criteriaBuilder.like(clientRoot.get(Clients_.name), "%" + criteria.getName() + "%"));
        predicates.add(criteriaBuilder.like(clientRoot.get(Clients_.phone1), "%" + criteria.getPhone1() + "%"));
        predicates.add(criteriaBuilder.like(clientRoot.get(Clients_.email), "%" + criteria.getEmail() + "%"));
        if (!criteria.getOpener().equalsIgnoreCase("all")) {
            predicates.add(criteriaBuilder.like(clientRoot.get(Clients_.opener), "%" + criteria.getOpener() + "%"));
        }
        if (!criteria.getCloser1().equalsIgnoreCase("all")) {
            predicates.add(criteriaBuilder.like(clientRoot.get(Clients_.closer1), "%" + criteria.getCloser1() + "%"));
        }
        if (!criteria.getStatus().equalsIgnoreCase("all")) {
            predicates.add(criteriaBuilder.like(clientRoot.get(Clients_.status), "%" + criteria.getStatus() + "%"));
        }
        clientCriteriaQuery.where(predicates.toArray(new Predicate[0]));
        List<Clients> clients = em.createQuery(clientCriteriaQuery).getResultList();
        em.close();
        emf.close();
        return clients;
    }

    public Clients findById(int id) {
        reconnect();
        Clients client = em.find(Clients.class, id);
        em.close();
        emf.close();
        return client;
    }

    public void send(int id) {
        reconnect();
        Clients c = em.find(Clients.class, id);
        java.util.Date date = new java.util.Date();
        Timestamp t = new Timestamp(date.getTime());
        em.getTransaction().begin();
        c.setDateUpdated(t.toString());
        em.getTransaction().commit();
        em.close();
        emf.close();
    }

    private Timestamp stamp() {
        Date d = new Date();
        return new Timestamp(d.getTime());
    }

    public int persistClient(Clients client) {
        reconnect();
        client.setDateCreated(stamp().toString());
        em.getTransaction().begin();
        em.persist(client);
        em.getTransaction().commit();
        log.fine(client.getTrim());
        em.close();
        emf.close();
        return client.getId();
    }

    public int update(Clients newClient) {
        reconnect();
        Clients oldClient = em.find(Clients.class, newClient.getId());
        em.getTransaction().begin();
        oldClient.setAddress(newClient.getAddress());
        oldClient.setCity(newClient.getCity());
        oldClient.setCloser1(newClient.getCloser1());
        oldClient.setCloser2(newClient.getCloser2());
        oldClient.setCountry(newClient.getCountry());
        oldClient.setCompany(newClient.getCompany());
        oldClient.setDateCancelled(newClient.getDateCancelled());
        oldClient.setDateSold(newClient.getDateSold());
        if ((oldClient.getDateCreated().length() < 3) || (oldClient.getDateCreated() == null)) {
            oldClient.setDateCreated(stamp().toString());
        }
        oldClient.setDateUpdated(stamp().toString());
        oldClient.setDescription(newClient.getDescription());
        oldClient.setEmail(newClient.getEmail());
        oldClient.setExteriorColor(newClient.getExteriorColor());
        oldClient.setFeatures(newClient.getFeatures());
        //no id set
        oldClient.setInteriorColor(newClient.getInteriorColor());
        oldClient.setInteriorType(newClient.getInteriorType());
        oldClient.setKilometres(newClient.getKilometres());
        oldClient.setMake(newClient.getMake());
        oldClient.setMileageType(newClient.getMileageType());
        oldClient.setModel(newClient.getModel());
        oldClient.setNotes(newClient.getNotes());
        oldClient.setOpener(newClient.getOpener());
        oldClient.setPaymentMethod(newClient.getPaymentMethod());
        oldClient.setPhone1(newClient.getPhone1());
        oldClient.setPhone2(newClient.getPhone2());
        oldClient.setPostal(newClient.getPostal());
        oldClient.setPrice(newClient.getPrice());
        oldClient.setProvince(newClient.getProvince());
        oldClient.setRecording(newClient.getRecording());
        oldClient.setRefunded(newClient.getRefunded());
        oldClient.setRegFee(newClient.getRegFee());
        oldClient.setStatus(newClient.getStatus());
        oldClient.setTaxRate(newClient.getTaxRate());
        oldClient.setTrim(newClient.getTrim());
        oldClient.setVerifier(newClient.getVerifier());
        oldClient.setYear(newClient.getYear());
        em.getTransaction().commit();
        em.close();
        emf.close();
        return newClient.getId();
    }
}

这适用于JavaSE。

另见:

https://codereview.stackexchange.com/questions/62890/javase-client-is-this-how-to-get-a-new-jpa-entitymanager-each-time-dao

0 个答案:

没有答案