4

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 を持つ同じ 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>
4

2 に答える 2

0

原因がわかりました。答えは、上に貼り付けたリストに隠されていました。3 か月前、同じアプリケーションを Glassfish にデプロイしました。それから私は初めてGlassfishを使いました。いくつかのブログで、データソースを設定する方法を見つけました (localhost:4848)。私のデータソースの名前がjdbc/PostgreSQL. 次に、glassfish cannot find datasource という例外が発生しますjdbc/PostgreSQL__pm。インターネットのどこかで、接尾辞__pmが必要であるという情報を見つけました。次の例外は suffix について__nontxでした。名前を変更したら、アプリケーションが起動しました。しかし、非常に低いパフォーマンスでもあります。

という名前のデータソースを追加jdbc/PostgreSQLすると、優れたパフォーマンスで動作し始めます! データソースの名前が間違っていた可能性があり、それにもかかわらず (ゆっくりと) 動作していた可能性はありますか?

于 2012-10-09T14:26:46.700 に答える
0

トランザクションは読み取り専用モードですか。セッションに多くのオブジェクトが含まれている場合、休止状態は自動ダーティ チェックを実行するのに非常に時間がかかる場合があります。おそらく、トランザクションは tomcat/jboss では読み取り専用モードですが、glassfish ではそうではありません

于 2012-10-09T12:47:53.487 に答える