6

部署我们的应用程序时出现错误。

环境是:

  • Jboss 7.1.3+休眠4+JPA
  • OJDBC:ojdbc6.jar

堆栈跟踪如下,

09:13:30,703 WARN  [org.hibernate.engine.jdbc.internal.JdbcServicesImpl] (ServerService Thread Pool -- 127) HHH000341: Could not obtain connection metadata : could not turn on auto-commit in an active global transaction
09:13:30,703 INFO  [org.hibernate.engine.jdbc.internal.LobCreatorBuilder] (ServerService Thread Pool -- 127) HHH000422: Disabling contextual LOB creation as connection was null
09:13:30,704 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 127) MSC00001: Failed to start service jboss.persistenceunit."css-ear-0.5.3-SIT.ear/css-submission-0.5.3-SIT.war#css-submission-PU": org.jboss.msc.service.StartException in service jboss.persistenceunit."css-ear-0.5.3-SIT.ear/css-submission-0.5.3-SIT.war#css-submission-PU": java.lang.NullPointerException
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:100) [jboss-as-jpa-7.1.3.Final.jar:7.1.3.Final]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_21]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_21]
    at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_21]
    at org.jboss.threads.JBossThread.run(JBossThread.java:122) [jboss-threads-2.0.0.GA.jar:2.0.0.GA]
Caused by: java.lang.NullPointerException
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:207)
    at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:73)
    at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2279)
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2275)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1744)
    at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:94)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:905)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:890)
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:74)
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.createContainerEntityManagerFactory(PersistenceUnitServiceImpl.java:197) [jboss-as-jpa-7.1.3.Final.jar:7.1.3.Final]
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.access$500(PersistenceUnitServiceImpl.java:57) [jboss-as-jpa-7.1.3.Final.jar:7.1.3.Final]
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:96) [jboss-as-jpa-7.1.3.Final.jar:7.1.3.Final

Standalone.xml 中的数据源配置是,

<xa-datasource jta="true" jndi-name="java:jboss/datasources/PsaDS" pool-name="PsaDS" enabled="true" use-java-context="true" use-ccm="true">
  <xa-datasource-property name="URL">
        jdbc:oracle:thin:@<hsot>
  </xa-datasource-property>
  <driver>oracle</driver>
  <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
  <xa-pool>
        <min-pool-size>2</min-pool-size>
        <max-pool-size>50</max-pool-size>
        <prefill>true</prefill>
  </xa-pool>
  <security>
        <user-name>user</user-name>
        <password>pwd</password>
  </security>

我们正在使用的驱动程序是,

<drivers>
  <driver name="oracle" module="com.oracle.ojdbc6">
        <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
  </driver></drivers>
4

2 回答 2

1

我从未使用过 JBoss + Hibernate。所以我不尝试这种调整。只阅读一些文档。请分别尝试这些调整:

A) 休眠属性

有需要调整hibernate.properties。我在文档中找到了这个可选属性:

hibernate.connection.autocommit

为 JDBC 池连接启用自动提交(不推荐)。

例如真| 错误的

文档链接

B)standalone.xml

<share-prepared-statements>- 目的是解决驱动程序将自动提交语义应用于本地事务的可疑驱动程序行为。启用准备好的语句缓存后,同一事务中的两个请求是否应该返回相同的语句(来自 jboss-4.0.2 - 默认为 false)。

Connection c = dataSource.getConnection(); // auto-commit == false 
PreparedStatement ps1 = c.prepareStatement(...);    
ResultSet rs1 = ps1.executeQuery();    
PreparedStatement ps2 = c.prepareStatement(...);    
ResultSet rs2 = ps2.executeQuery();

假设准备好的语句是相同的。对于某些驱动程序,ps2.executeQuery() 会自动关闭 rs1,因此我们实际上需要两个真正的幕后准备好的语句。这应该仅适用于自动提交语义,其中重新运行查询会自动启动新事务。对于遵循规范的驱动程序,您可以将其设置为 true 以共享相同的真实准备好的语句。

文档链接

于 2013-10-24T13:32:16.677 回答
1

<xa-datasource>尝试在您的定义标签中对您的standalone.xml 进行以下更改:

<xa-pool>在标签内添加以下内容:

<is-same-rm-override>false</is-same-rm-override>
<no-tx-separate-pools>true</no-tx-separate-pools>

根据文档:

no-tx-separate-pools:此元素的存在表明需要两个连接池来隔离使用 JTA 事务的连接和不使用 JTA 事务的连接。游泳池在第一次使用时是懒惰的。它的用例适用于不喜欢使用带有和不带有 JTA 事务的 XA 连接的 Oracle(可能还有其他供应商)XA 实现。

如果这不能使其单独工作,请尝试在您的<xa-datasource>定义中添加它:

<validation>
      <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/>
      <stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleStaleConnectionChecker"/>
      <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"/>
</validation>
于 2013-12-18T03:59:44.113 回答