Java Tomcat 8、Hibernate 5.2、MSSQL、HikariCP标准搜索返回空值
目前,我们正在对应用程序的DB CRUD功能进行性能评估和改进,其中一项评估是使用Hikari连接池以及Hibernate和Hibernate HikariCP的更高版本进行测试 我们将Hibernate版本从5.2.10升级到5.2.16,Hikari版本为3.1.0。使用Tomcat 8和MSSQL 2016对整个练习进行了测试 为了简单起见,我们使用实体用户对一个简单搜索和一个搜索条件进行了测试 休眠XML配置:Java Tomcat 8、Hibernate 5.2、MSSQL、HikariCP标准搜索返回空值,java,sql-server,hibernate,hikaricp,Java,Sql Server,Hibernate,Hikaricp,目前,我们正在对应用程序的DB CRUD功能进行性能评估和改进,其中一项评估是使用Hikari连接池以及Hibernate和Hibernate HikariCP的更高版本进行测试 我们将Hibernate版本从5.2.10升级到5.2.16,Hikari版本为3.1.0。使用Tomcat 8和MSSQL 2016对整个练习进行了测试 为了简单起见,我们使用实体用户对一个简单搜索和一个搜索条件进行了测试 休眠XML配置: <hibernate-configuration> <
<hibernate-configuration>
<session-factory>
<property name = "hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
<property name="show_sql">true</property>
<!-- Hikari specific properties -->
<property name="hibernate.connection.provider_class">com.zaxxer.hikari.hibernate.HikariConnectionProvider</property>
<property name="hikari.maximumPoolSize">30</property>
<property name="hikari.idleTimeout">300000</property>
<property name="hikari.maxLifetime">1800000</property>
<!-- Database connection properties -->
<property name="hibernate.hikari.dataSourceClassName">com.microsoft.sqlserver.jdbc.SQLServerDataSource</property>
<property name="hibernate.connection.url">jdbc:sqlserver://192.168.0.102:1433;databaseName=migration1;user=sun;password=p@ssw0rd;</property>
<property name = "hibernate.connection.username">sun</property>
<property name = "hibernate.connection.password">p@ssw0rd</property>
<mapping class="com.hib.model.Outlet"/>
<mapping class="com.hib.model.Receipt"/>
<mapping class="com.hib.model.Cashier"/>
<mapping class="com.hib.model.Category"/>
<mapping class="com.hib.model.Item"/>
<mapping class="com.hib.model.PayMethodName"/>
<mapping class="com.hib.model.Pos"/>
<mapping class="com.hib.model.Purchase"/>
<mapping class="com.hib.model.User"/>
</session-factory>
</hibernate-configuration>
String sql = "SELECT * FROM USER_LOG WHERE id = :number_id";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(User.class);
query.setParameter("number_id", id);
result = query.list();
带注释的用户实体,不包括getter/setter:
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Version;
import javax.validation.constraints.NotNull;
import javax.xml.bind.annotation.XmlRootElement;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.UpdateTimestamp;
@Entity
@Table(name = "User")
@XmlRootElement
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@Column(name = "id")
@NotNull
@GeneratedValue(generator="`id`")
@GenericGenerator(name="`id`", strategy = "increment")
private Integer id;
@NotNull
@Column(name = "FullName")
private String fullName;
@Column(name = "NickName")
private String nickName;
@Column(name = "Tel")
private String tel;
@Column(name = "Rank")
private String rank;
@NotNull
@Column(name = "Email")
private String email;
@NotNull
@Column(name = "Password")
private String password;
@Lob
@Column(name = "PhotoUpload")
private String photoUpload;
@Version
@Column(name = "CreateDate")
@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date createDate;
@Version
@Column(name = "EditDate")
@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date editDate;
@Column(name = "CreateBy")
private String createBy;
@Column(name = "ActiveInd")
private String activeInd;
@Column(name = "LastLogin")
@Temporal(TemporalType.TIMESTAMP)
private Date lastLogin;
@Column(name = "tenant_id")
private String tenantId;
@NotNull
@Column(name = "group_id")
private String groupId;
public User() {
}
public User(Integer id, String fullName,String nickName,String tel,String rank,String email,String password,String photoUpload,Date createDate,Date editDate,String createBy,String activeInd,Date lastLogin, String tenantId, String groupId) {
this.id = id;
this.fullName = fullName;
this.nickName = nickName;
this.tel =tel;
this.rank=rank;
this.email =email;
this.password = password;
this.photoUpload = photoUpload;
this.createDate =createDate;
this.editDate =editDate;
this.createBy =createBy;
this.activeInd = activeInd;
this.lastLogin=lastLogin;
this.tenantId= tenantId;
this.groupId =groupId;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof User)) {
return false;
}
User other = (User) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "com.example.dao.User[ id=" + id + " ]";
}
搜索特定用户的功能在用户服务类的此方法中:
@Override
public List<User> getUserById(Integer id) {
List<User> result = null;
Session session = getSession();
try {
Criteria criteria = getSession().createCriteria(User.class);
Criteria criteria = getSession().(User.class);
criteria.add(Restrictions.eq("id", id));
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
result = query.getResultList();
}catch (HibernateException e){
userLogger.error("Error found: " + e);
}finally {
if (session != null)
session.close();
}
return result;
}
由于HikariCP对其他本机查询做了很多改进,我们认为如果我们仍然能够继续使用该CP来支持C3P0池,那就更好了。然而,我们仍然无法确定服务类方法中的哪种方法是最好的
我们感谢您在这方面提供的任何帮助。谢谢。您是否将
User
添加到persistence.xml
文件中?@RodrigoMartinTatoRothamel是的。
TypedQuery<User> query = session.createQuery("select u from "+User.class.getSimpleName()+" u",User.class) ;
result = query.getResultList();
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(User.class);
Root<User> root = cq.from(User.class);
cq.select(root);
Query<User> q = session.createQuery(cq);
result = q.getResultList();
String sql = "SELECT * FROM USER_LOG WHERE id = :number_id";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(User.class);
query.setParameter("number_id", id);
result = query.list();