【问题标题】:Very low performance with Glassfish 3.1.2 and Java EE + HibernateGlassfish 3.1.2 和 Java EE + Hibernate 的性能非常低
【发布时间】:2012-09-21 14:00:33
【问题描述】:

我在 Glassfish 3.1.2 上遇到了 Java EE (EJB + JSF) 应用程序和 Hibernate(3.6.8.Final 和 4.1.7.Final)的性能非常低的问题。发送大约 300 个选择查询大约需要 20 秒。这是不可接受的。

我在 JBoss 和 TomEE 上部署了完全相同的应用程序。在那里,同样的 300 个选择查询大约需要 1.5 秒。

我在谷歌上找到了一些答案,可能hibernate.show_sql 是true 或hibernate.hbm2ddl 使应用程序太慢了。但事实并非如此。我关闭了hibernate.show_sql 但没关系。此外,这些选项在 JBoss 和 TomEE 版本中都是正确的,并且运行速度快了 10 倍以上! 我认为这是 Glasfish 和 Hibernate 之间的问题。但是我有下一个具有相同业务逻辑的应用程序,与 Hibernate 提供的 EntityManager 相同但使用 Spring 配置的 DAO。而且性能很棒。这很奇怪,不是吗?

persistence.xml 来自缺陷版本:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0"
  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
  http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">

   <persistence-unit name="jee_project" transaction-type="JTA">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <jta-data-source>jdbc/PostgreSQL</jta-data-source>
      <properties>
         <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
         <property name="hibernate.hbm2ddl.auto" value="update"/>
         <property name="hibernate.show_sql" value="false"/>
         <property name="current_session_context_class" value="thread"/>
      </properties>
   </persistence-unit>

</persistence>

Glassfish JDBC 配置

<jdbc-connection-pool driver-classname="" datasource-classname="org.postgresql.ds.PGConnectionPoolDataSource" res-type="javax.sql.ConnectionPoolDataSource" description="" name="PostgreSQLPool">
      <property name="User" value="postgresql"></property>
      <property name="DatabaseName" value="qazxsw"></property>
      <property name="LogLevel" value="0"></property>
      <property name="Password" value="1234"></property>
      <property name="ServerName" value="localhost"></property>
      <property name="Ssl" value="false"></property>
      <property name="ProtocolVersion" value="0"></property>
      <property name="TcpKeepAlive" value="false"></property>
      <property name="SocketTimeout" value="0"></property>
      <property name="PortNumber" value="5432"></property>
      <property name="LoginTimeout" value="0"></property>
      <property name="UnknownLength" value="2147483647"></property>
      <property name="PrepareThreshold" value="5"></property>
    </jdbc-connection-pool>
    <jdbc-resource pool-name="PostgreSQLPool" description="" jndi-name="jdbc/PostgreSQL__pm"></jdbc-resource>
    <jdbc-resource pool-name="PostgreSQLPool" description="" jndi-name="jdbc/PostgreSQL__nontx"></jdbc-resource>

【问题讨论】:

  • 池中连接的最小/最大 nb 是多少?
  • 初始和最小池大小:8,初始和最小池大小:32
  • 我相信文件是persistence.xml 而不是persistance.xml。

标签: java performance hibernate jakarta-ee glassfish


【解决方案1】:

您的事务是否处于只读模式。当您的会话包含大量对象时,休眠可能会花费大量时间进行自动脏检查。也许您的事务在 tomcat/jboss 下处于只读模式,但在 glassfish 下不处于只读模式

【讨论】:

    【解决方案2】:

    我找到了原因。答案隐藏在我上面粘贴的列表中。三个月前,我在 Glassfish 上部署了相同的应用程序。然后我第一次使用 Glassfish。我在一些博客上找到了如何设置数据源(在 localhost:4848)。假设我的数据源被命名为jdbc/PostgreSQL。然后我得到了 glassfish 找不到数据源jdbc/PostgreSQL__pm 的异常。在 Internet 的某个地方,我发现需要后缀 __pm 的信息。下一个例外是关于后缀__nontx。更改名称后,应用程序启动。但性能也非常低。

    现在我添加了名为 jdbc/PostgreSQL 的数据源,它开始以良好的性能工作! 数据源的名称怎么可能是错误的,尽管它正在(缓慢地)工作?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-02
      相关资源
      最近更新 更多