【问题标题】:Slow JBoss startup, possibly related to DataSource pointing to Heroku PostgresJBoss 启动缓慢,可能与指向 Heroku Postgres 的 DataSource 有关
【发布时间】:2013-12-01 00:59:40
【问题描述】:

我观察到 JBoss 启动缓慢。具体来说,在部署我的应用程序时启动会冻结,似乎是在 Hibernate 初始化期间:

22:43:00,066 DEBUG [org.hibernate.cfg.Configuration] (ServerService Thread Pool -- 48) Creating tables' unique integer identifiers
22:43:00,066 DEBUG [org.hibernate.cfg.Configuration] (ServerService Thread Pool -- 48) Processing foreign key constraints
22:43:00,075 INFO  [org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator] (ServerService Thread Pool -- 48) HHH000130: Instantiating explicit connection provider: org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider
22:43:00,105 DEBUG [org.jboss.jca.core.connectionmanager.pool.idle.IdleRemover] (ServerService Thread Pool -- 48) Register pool: SemaphoreArrayListManagedConnectionPool@33ff5ccd[pool=HerokuPostgreSQLDS] (interval=1800000)
22:43:00,105 DEBUG [org.jboss.jca.core.connectionmanager.pool.idle.IdleRemover] (ServerService Thread Pool -- 48) About to notify thread: old next: 1384811880105, new next: 1384811880105
22:43:00,106 DEBUG [org.jboss.jca.core.connectionmanager.pool.idle.IdleRemover] (IdleRemover) Notifying pools, interval: 900000
22:43:00,107 DEBUG [org.jboss.jca.core.connectionmanager.pool.strategy.OnePool] (ServerService Thread Pool -- 48) HerokuPostgreSQLDS: getConnection(null, null) [0/10]
22:43:00,109 DEBUG [org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory] (ServerService Thread Pool -- 48) Driver loaded and instance created:org.postgresql.Driver@10340285
22:43:01,311 DEBUG [org.hibernate.engine.jdbc.internal.JdbcServicesImpl] (ServerService Thread Pool -- 48) Database ->
       name : PostgreSQL
    version : 9.1.9
      major : 9
      minor : 1
22:43:01,311 DEBUG [org.hibernate.engine.jdbc.internal.JdbcServicesImpl] (ServerService Thread Pool -- 48) Driver ->
       name : PostgreSQL Native Driver
    version : PostgreSQL 9.1 JDBC4 (build 901)
      major : 9
      minor : 1
22:43:01,312 DEBUG [org.hibernate.engine.jdbc.internal.JdbcServicesImpl] (ServerService Thread Pool -- 48) JDBC version : 4.0
22:43:27,744 DEBUG [org.apache.catalina.session] (ContainerBackgroundProcessor[StandardEngine[jboss.web]]) Start expire sessions StandardManager at 1384811007744 sessioncount 0
22:43:27,744 DEBUG [org.apache.catalina.session] (ContainerBackgroundProcessor[StandardEngine[jboss.web]]) End expire sessions StandardManager processingTime 0 expired sessions: 0
22:43:37,982 DEBUG [org.jboss.ejb.client.txn] (Periodic Recovery) Send recover request for transaction origin node identifier 1 to EJB receiver with node name rocket
22:43:47,987 DEBUG [org.jboss.ejb.client.txn] (Periodic Recovery) Send recover request for transaction origin node identifier 1 to EJB receiver with node name rocket
22:43:59,686 INFO  [org.hibernate.dialect.Dialect] (ServerService Thread Pool -- 48) HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL82Dialect
22:43:59,697 INFO  [org.hibernate.engine.jdbc.internal.LobCreatorBuilder] (ServerService Thread Pool -- 48) HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
22:43:59,699 DEBUG [org.jboss.jca.core.connectionmanager.pool.strategy.OnePool] (ServerService Thread Pool -- 48) HerokuPostgreSQLDS: returnConnection(7bf7b5fc, false) [1/10]
22:43:59,709 DEBUG [org.hibernate.cfg.SettingsFactory] (ServerService Thread Pool -- 48) Automatic flush during beforeCompletion(): disabled

在 22:43:01 和 22:43:59 之间是长时间的冻结,我不明白。有人可以帮我理解这种冻结吗?

我正在尝试将 Heroku Postgres 数据库与部署到 JBoss 的 JavaEE 应用程序一起使用。

我在standalone.xml 中配置了一个数据源,如下所示:

       <subsystem xmlns="urn:jboss:domain:datasources:1.1">
            <datasources>
                <datasource jndi-name="java:jboss/datasources/HerokuPostgreSQLDS" pool-name="HerokuPostgreSQLDS" enabled="true" use-java-context="true" use-ccm="true">
                    <connection-url>${env.HEROKU_POSTGRESQL_DB_URL}</connection-url>
                    <driver>postgresql</driver>
                    <pool>
                        <min-pool-size>1</min-pool-size>
                        <max-pool-size>10</max-pool-size>
                        <prefill>false</prefill>
                        <flush-strategy>IdleConnections</flush-strategy>
                    </pool>
                </datasource>
                <drivers>
                    <driver name="postgresql" module="org.postgresql">
                        <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
                    </driver>
                </drivers>
            </datasources>
        </subsystem>

我已将环境变量 HEROKU_POSTGRESQL_DB_URL 设置为:

jdbc:postgresql://ec2-23-21-204-85.compute-1.amazonaws.com:5432/mydatabase?user=myuser&password=mypassword0&ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory

服务器启动后,一切正常。

我认为将 DataSource 初始化为 Heroku 需要很长时间。但为什么? 当我使用普通 JDBC 直接从独立 Java 程序连接到数据库时,一切都很快...... 我可以以某种方式加快数据源的创建吗?我还尝试不指定&lt;xa-datasource-class&gt;,而是指定一个普通的驱动程序类,如&lt;xa-datasource-class&gt;org.postgresql.Driver&lt;/xa-datasource-class&gt;。但这确实导致了同样的行为......

还有其他人在 JBoss 中使用指向 Heroku 的 Java EE 数据源吗?需要这么长时间正常吗?

为了完整起见,这是我的持久性单元(来自 persistence.xml):

<persistence-unit name="admin" transaction-type="JTA">
    <jta-data-source>java:jboss/datasources/HerokuPostgreSQLDS</jta-data-source>
    <class>org.jbfirst.entities.BCUser</class>
    <properties>
        <property name="hibernate.show_sql" value="true" />
        <!--<property name="hibernate.hbm2ddl.auto" value="create" />-->
    </properties>
</persistence-unit>

【问题讨论】:

  • 你的 persistence.xml / hibernate.cfg.xml 配置看起来如何?
  • @ctomc 我认为这并不重要,因为我认为在初始化数据源本身而不是初始化持久性单元时需要时间……但也许我错了。 ..所以我将persistence.xml添加到上面的问题中。
  • 添加 有什么帮助吗?

标签: java hibernate postgresql jboss jboss7.x


【解决方案1】:

您是否彻底关闭了您的 JBoss 实例?我能找到的所有与缓慢定期恢复相关的线程都与不正常的关闭和启动有关。我还建议更新到最新的 PostgreSQL JDBC 驱动程序,因为至少有一个与事务恢复相关的修复。

【讨论】:

  • 谢谢。我更新了问题:我现在使用的是最新版本的 PostgreSQL 驱动程序 (9.1-901-1.jdbc4)。同样的行为......
  • 其实我觉得和周期性恢复没有关系。我认为在数据源初始化期间发生恢复只是巧合......我怀疑问题是创建数据源需要很长时间......
  • 我不认为这是周期性恢复,但似乎也不太可能是 DataSource 初始化。池最小值设置为 1,与远程主机建立 ssl 连接最多不应该超过几秒钟。我在想还有很多没有记录的 Hibernate 初始化正在运行。我会尝试将日志记录设置为 TRACE 级别,看看您是否可以发现暂停时发生的其他情况。
【解决方案2】:

我遇到了同样的问题,这是因为休眠尝试从连接元数据中确定方言。为避免此过程,请在您的 persistence.xml 中设置以下属性:

<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" />

另请参阅:Hibernate Slow to Acquire Postgres Connection

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 2015-04-20
    相关资源
    最近更新 更多