Java 没有找到合适的司机

Java 没有找到合适的司机,java,oracle,jdbc,liferay,Java,Oracle,Jdbc,Liferay,对于我当前的任务,我必须在liferay门户中部署我们的应用程序。部署本身是成功的,但当应用程序启动时,会引发“无合适的驱动程序”异常 环境: Oracle 10g Express 冬眠4决赛 Liferay 6和Tomcat 7 OJDBC 6 C3P00.9 用maven构建 我们应用程序的一个较旧的.war文件运行时没有任何异常。然而,在环境方面存在一些小的差异 旧环境: Oracle 10g Express 冬眠3决赛 Liferay 6和Tomcat 7 OJDBC 14 Hib

对于我当前的任务,我必须在liferay门户中部署我们的应用程序。部署本身是成功的,但当应用程序启动时,会引发“无合适的驱动程序”异常

环境:

  • Oracle 10g Express
  • 冬眠4决赛
  • Liferay 6和Tomcat 7
  • OJDBC 6
  • C3P00.9
  • 用maven构建
我们应用程序的一个较旧的.war文件运行时没有任何异常。然而,在环境方面存在一些小的差异

旧环境:

  • Oracle 10g Express
  • 冬眠3决赛
  • Liferay 6和Tomcat 7
  • OJDBC 14
  • Hibernate内置连接池
  • 没有maven的构建
我已经尝试过的事情:

  • 将ojdbc.jar从webapp lib文件夹移动到liferay tomcat lib/ext文件夹
  • 在context.xml中强制执行类加载器的“webapp classes/libs/resources first”行为:
  • 移除c3p0再次使用ojdbc14(我认为可能是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-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>

经过三天的调试,我终于找到了解决方案:

在某些情况下,persistence.xml中给定的驱动程序类被hibernate/c3p0忽略,因此,与异常状态一样,找不到合适的驱动程序。为了防止这种情况,我在c3p0-config.xml中添加了以下行:

oracle.jdbc.driver.OracleDriver


我希望它也能帮助其他人:-)

您是否尝试将c3p0与OJDBC14一起使用?我相信您认为它是数据库/hibernate JAR的某种组合是正确的。另外,您可以包含堆栈跟踪吗?OJDBC 14的问题是它不能与hibernate 4一起工作(如果我提醒正确的话)。您是否检查了确保Maven在.war中包含依赖项?(很抱歉提出这些愚蠢的问题,但您永远不知道。)是的,所有依赖项都包含在.war文件中;-)我想我离解决方案更近了一步:当我看到远程调试时,Oracle驱动程序没有被任何人加载。但是,我将它放在与Liferay默认hsqldb驱动程序相同的目录中。所以我认为hsqldb驱动程序是在其他地方加载的。。。此时,我的心情非常糟糕,但随后我在
服务$LazyIterator
类中看到了一些有趣的东西:您可以将配置文件放入
META-INF/services
文件夹,其中包含启动时加载的服务。我创建了文件,但我的驱动程序无法加载。也许我把文件放错地方了。
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)