TypedQuery in JPA very slow

1

I am starting to create a project with JSF and JPA, for the moment I have made a simple login (with pending improvements) but I have found that the query it takes takes about 3 seconds, something quite high considering that the base of data for now it only has a table and a single result in it, and if I execute that same query in my DB manager takes 0.0005 seconds, it is a MySQL database and my server is an Apache Tomcat.

UserDAO.java

package com.ryc.dao;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.NoResultException;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;

import com.ryc.entities.User;

public class UserDAO {

private static final String PERSISTENCE_UNIT_NAME = "TestPersistence";
private static EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
private static EntityManager entityMgrObj = entityManagerFactory.createEntityManager();
private static EntityTransaction entityTransaction = entityMgrObj.getTransaction();

public static User login(User user){
    User userFound = null;

    try{
        TypedQuery<User> query = entityMgrObj.createQuery("SELECT u FROM User u WHERE u.userName = :userName and u.password = :password", User.class);
        query.setParameter("userName", user.getUserName());
        query.setParameter("password", user.getPassword());
        userFound = (User)query.getSingleResult();

    }catch(NoResultException e){

    }


    return userFound;

}

}

UserController.java

import java.io.IOException;

import javax.faces.bean.ManagedBean;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;

import com.ryc.dao.UserDAO;
import com.ryc.entities.User;


@ManagedBean(name = "user")
@ViewScoped
public class UserController {

boolean isUsernameValid = false;
boolean validationComplete = false;
boolean isPasswordValid = false;
String userName;
String password;
UserDAO userDAO;

public void login() {
    User userFound = null;
    User userRequest = new User();
    userDAO = new UserDAO();
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();


    userRequest.setUserName(userName);
    userRequest.setPassword(password);

    userFound = UserDAO.login(userRequest);

    if(userFound != null){
        try {
            ec.redirect(ec.getRequestContextPath() + "/success.xhtml");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } else {
        try {
            ec.redirect(ec.getRequestContextPath() + "/login.xhtml");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


}

/** * @return the isUsernameValid */
public boolean getIsUsernameValid() {
    return isUsernameValid;
}

/** * @paramisUsernameValid the isUsernameValid to set */
public void setUsernameValid(boolean isUsernameValid) {
    this.isUsernameValid = isUsernameValid;
}

/** * @return the isPasswordValid */
public boolean getIsPasswordValid() {
    return isPasswordValid;
}

/** * @paramisPasswordValid the isPasswordValid to set */
public void setPasswordValid(boolean isPasswordValid) {
    this.isPasswordValid = isPasswordValid;
}

/** * @return the validationComplete */
public boolean getValidationComplete() {
    return validationComplete;
}

/** * @paramvalidationComplete the validationComplete to set */
public void setValidationComplete(boolean validationComplete) {
    this.validationComplete = validationComplete;
}

public String getUserName() {
    return userName;
}

public void setUserName(String userName) {
    this.userName = userName;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

}

User.java

package com.ryc.entities;


import java.io.Serializable;
import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="user")
public class User implements Serializable{

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String userName;
private String email;
private String password;
private String passwordSalt;
private Date creationDate;

public String getUserName() {
    return userName;
}
public void setUserName(String userName) {
    this.userName = userName;
}
public String getPassword() {
    return password;
}
public void setPassword(String password) {
    this.password = password;
}
public String getEmail() {
    return email;
}
public void setEmail(String email) {
    this.email = email;
}
public String getPasswordSalt() {
    return passwordSalt;
}
public void setPasswordSalt(String passwordSalt) {
    this.passwordSalt = passwordSalt;
}
public Date getCreationDate() {
    return creationDate;
}
public void setCreationDate(Date creationDate) {
    this.creationDate = creationDate;
}

@Override
public String toString() {
    StringBuilder builder = new StringBuilder();
    builder.append("User [id=");
    builder.append(id);
    builder.append(", userName=");
    builder.append(userName);
    builder.append(", email=");
    builder.append(email);
    builder.append(", password=");
    builder.append(password);
    builder.append(", passwordSalt=");
    builder.append(passwordSalt);
    builder.append(", creationDate=");
    builder.append(creationDate);
    builder.append("]");
    return builder.toString();
}


}

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence 
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="TestPersistence"
    transaction-type="RESOURCE_LOCAL">

    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <class>com.ryc.entities.User</class> 

    <properties>
        <property name="javax.persistence.jdbc.driver" 
value="com.mysql.jdbc.Driver" />
        <property name="javax.persistence.jdbc.url" 
value="jdbc:mysql://localhost:3306/jsftest" />
        <property name="javax.persistence.jdbc.user" value="root" />
        <property name="javax.persistence.jdbc.password" value="" />
    </properties>
</persistence-unit>
</persistence>
    
asked by NeoChiri 02.03.2018 в 23:49
source

0 answers