Java JPA连接超时
为什么会出现超时和无响应 日志: 在最坏的情况下,它应该重新建立到数据库的连接,即使这样做很慢Java JPA连接超时,java,database,jpa,entitymanager,jdbc-pool,Java,Database,Jpa,Entitymanager,Jdbc Pool,为什么会出现超时和无响应 日志: 在最坏的情况下,它应该重新建立到数据库的连接,即使这样做很慢 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; im
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的
另见:
呃,你在为每一个呼叫创建一个EMF?让我们慢下来?一个EM-per-call很好,但不是EMFI一开始没有这样做,但看到一些人这样做。我不在乎性能,只是它不会超时。连接需要5秒钟还是5分钟并不重要。我把EM作为场,结果是一样的。像豆子一样试过这门课,同样的结果……如果有人跳下悬崖,我不会照搬;只要有一个单一的电动势,并减少了特别的痛苦。至于为什么有些事情需要时间,你可以查看JPA提供商的日志,看看发生了什么事情Git不需要时间,有时它永远不会完成。通常,它工作正常,有时只是挂起。这是针对JavaSE的,您指的是哪个日志?上面写的是登录,按照这些思路。你的案例与链接问题中的NPE完全不同。你必须看日志才能理解它说的“忘记日志”是说我不能为这些事情烦恼。你是唯一知道你的JPA实现是什么的人,所以没有人可以冒险猜测可能的原因——我的水晶球现在不起作用了。您必须首先修复代码,使其具有单个EMF,并且每个调用具有一个EM,所有这些都需要在最终完成时关闭。
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();
}
}