2012-09-30 33 views
4

Glassfish 3.1上的Java EE(EJB + JSF)應用程序和Hibernate(3.6.8.Final和4.1.7.Final)的性能非常低下0.2。發送大約300個選擇查詢大約需要20秒。這是無法接受的。Glassfish 3.1.2和Java EE + Hibernate的性能很低

我在JBoss和TomEE上部署了完全相同的應用程序。在那裏,同樣的300個選擇查詢大約需要1.5秒。

我在谷歌搜索一些答案,也許hibernate.show_sqltruehibernate.hbm2ddl使應用程序很慢。但事實並非如此。我關掉了hibernate.show_sql但是沒關係。而且,這些選項在JBoss和TomEE版本中都是正確的,它的工作速度提高了10倍! 我認爲這是Glasfish和Hibernate之間的問題。但是我有下一個具有相同業務邏輯的應用程序,與Hibernate提供的EntityManager相同的DAO,但是使用Spring進行配置。而且表現很棒。這很奇怪,不是嗎?

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> 
+0

池中連接的最小/最大數量是多少? – ewernli

+0

初始和最小池大小:8,初始和最小池大小:32 – LancerX

+0

我相信該文件是'persistence.xml'而不是'persistance.xml'。 –

回答

0

我找到了原因。答案隱藏在上面粘貼的列表中。三個月前,我在Glassfish上部署了相同的應用程序。然後我第一次使用Glassfish。我在一些博客中發現如何設置數據源(在localhost:4848)。假設我的數據源被命名爲jdbc/PostgreSQL。然後我得到glassfish無法找到數據源jdbc/PostgreSQL__pm的例外。在互聯網的某個地方,我發現需要後綴__pm的信息。下一個例外是關於後綴__nontx。更改名稱後,應用程序啓動。而且性能非常低。

現在我添加了一個名爲jdbc/PostgreSQL的數據源,它開始工作,性能很好! 數據源的名稱有可能是錯誤的,儘管所有數據源都在工作(緩慢)?

0

是在只讀模式您的交易。當你的會話包含很多對象時,hibernate可能需要很長時間才能進行自動髒檢查。也許你的交易處於tomcat/jboss下的只讀模式,但不是在glassfish下。