2

現在のタスクでは、アプリケーションを liferay ポータルにデプロイする必要があります。デプロイ自体は成功しましたが、アプリケーションの起動時に「適切なドライバーがありません」という例外がスローされます。

環境:

  • オラクル 10g エクスプレス
  • ハイバネート4ファイナル
  • Liferay 6 と Tomcat 7
  • OJDBC 6
  • c3p0 0.9
  • Mavenでビルド

アプリの古い .war ファイルは例外なく実行されます。ただし、環境にはいくつかの小さな違いがあります。

古い環境:

  • オラクル 10g エクスプレス
  • ハイバネート3ファイナル
  • Liferay 6 と Tomcat 7
  • OJDBC 14
  • 接続プールでの Hibernate ビルド
  • Mavenなしでビルド

私がすでに試したこと:

  • ojdbc.jar を webapp lib フォルダーから liferay tomcat lib/ext フォルダーに移動します。
  • context.xml で Class Loader の「webapp classes/libs/resources first」動作を強制します。
  • ojdbc14を再度使用するためにc3p0を削除します(ojdbc6が原因である可能性があると思いました)
  • 古いビルドで ojdbc14 を ojdbc6 と交換します (動作します)。

新しい persistence.xml:

<persistence-unit name="ipointdefault">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<mapping-file>META-INF/hbm.xml</mapping-file>
<class>Entity declaration...</class>
<properties>
    <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver" />
    <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@HOST:PORT:DB" />
    <property name="javax.persistence.jdbc.user" value="user" />
    <property name="javax.persistence.jdbc.password" value="pw" />
    <property name="hibernate.hbm2ddl.auto" value="update" />

    <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
    <property name="hibernate.archive.autodetection" value="class" />
    <property name="hibernate.current_session_context_class" value="thread" />
    <property name="hibernate.connection.pool_size" value="10" />
    <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
    <property name="hibernate.bytecode.use_reflection_optimizer" value="true" />
    <property name="hibernate.c3p0.acquire_increment" value="3" />
    <property name="hibernate.c3p0.min_size" value="3" />
    <property name="hibernate.c3p0.max_size" value="5" />
    <property name="hibernate.c3p0.timeout" value="10800" />
    <property name="hibernate.c3p0.idleConnectionTestPeriod" value="1800" />
    <property name="hibernate.c3p0.max_statements" value="0" />
</properties>

古いpersistence.xml:

<persistence-unit name="ipointdefault">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>Entity declaration...</class>
<properties>
    <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver" />
    <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@HOST:PORT:DB" />
    <property name="javax.persistence.jdbc.user" value="user" />
    <property name="javax.persistence.jdbc.password" value="pw" />
    <property name="hibernate.default-access" value="property" />
    <property name="hibernate.hbm2ddl.auto" value="update" />
    <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
    <property name="hibernate.archive.autodetection" value="class" />
    <property name="hibernate.current_session_context_class" value="thread" />
    <property name="hibernate.connection.pool_size" value="10" />
    <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
    <property name="hibernate.bytecode.use_reflection_optimizer" value="true" />
</properties>

問題を解決する方法、または根本的な原因を見つける方法はありますか?

前もって感謝します。

編集:

スタックトレース:

java.sql.SQLException: No suitable driver
    at java.sql.DriverManager.getDriver(DriverManager.java:264)
    at com.mchange.v2.c3p0.DriverManagerDataSource.driver(DriverManagerDataSource.java:224)
    at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:135)
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182)
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137)
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)
    at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
    at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
4

1 に答える 1

5

3日間のデバッグの後、私はついに解決策を見つけました。

特定の状況下では、persistence.xml内の指定されたドライバークラスがhibernate / c3p0によって無視されたため、例外状態のように、適切なドライバーが見つかりませんでした。これを防ぐために、c3p0-config.xmlに次の行を追加しました。

<property name="driverClass">oracle.jdbc.driver.OracleDriver</property>

私はそれが他の人にも役立つことを願っています:-)

于 2012-06-05T14:38:00.270 に答える