2012-11-09 73 views
1

我已經設置了一個訪問遠程Oracle數據庫的Spring項目,但前提是我在本地Tomcat上運行了這個Spring項目。如果我部署到CF無論是作爲的JavaWeb或Spring項目,我總是得到同樣的錯誤信息:使用JDBC連接到外部Oracle數據庫

根源

org.springframework.transaction.CannotCreateTransactionException: 無法打開JPA EntityManager的事務;嵌套的例外是 javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException:無法打開連接 org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:3 ....

這是我的配置:

<bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource"> 
    <property name="driverType"> 
     <value>oracle.jdbc.driver.OracleDriver</value> 
    </property> 
    <property name="URL"> 
     <value>${jdbc.url}</value> 
    </property> 
    <property name="user"> 
     <value>${jdbc.username}</value> 
    </property> 
    <property name="password"> 
     <value>${jdbc.password}</value> 
    </property> 
</bean> 

<bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" p:dataSource-ref="dataSource"> 
    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml"/> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" p:showSql="true" 
       p:generateDdl="true"> 
     </bean> 
    </property> 
    <property name="jpaProperties"> 
     <value> 
      hibernate.ejb.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy 
      hibernate.dialect=${hibernate.dialect} 
      hibernate.hbm2ddl.auto=${hibernate.hbm2ddl.auto} 
     </value> 
    </property> 
</bean> 

我試着使用,而不是oracle.jdbc.driver.OracleDriver oracle.jdbc.OracleDriver我試着使用<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"...,與相應的屬性名稱。此外,我已經試過:

<bean id="dataSource" class="org.springframework.jdbc.datasource.SingleConnectionDataSource"> 
    <property name="driverClassName"> 
     <value>${database.driverClassName}</value> 
    </property> 
    <property name="url"> 
     <value>${jdbc.url}</value> 
    </property> 
    <property name="username"> 
     <value>${jdbc.username}</value> 
    </property> 
    <property name="password"> 
     <value>${jdbc.password}</value> 
    </property> 
    <property name="suppressClose" value="true"/> 
    <property name="autoCommit" value="true"/> 
</bean> 

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName"> 
     <value>${database.driverClassName}</value> 
    </property> 
    <property name="url"> 
     <value>${jdbc.url}</value> 
    </property> 
    <property name="username"> 
     <value>${jdbc.username}</value> 
    </property> 
    <property name="password"> 
     <value>${jdbc.password}</value> 
    </property> 
</bean> 

沒有什麼工作,我總是得到同樣的錯誤。

我試着使用HSQL與此配置

這些jdbc.properties:

# HSQL 
database.driverClassName = org.hsqldb.jdbcDriver 
#jdbc.url = jdbc:hsqldb:file:target/zktodo2test.dat 
jdbc.url = jdbc:hsqldb:file:zktodo2test.dat 
jdbc.username = sa 
jdbc.password = 

hibernate.dialect = org.hibernate.dialect.HSQLDialect 
hibernate.hbm2ddl.auto = update 

...和它的工作但是當使用這些jdbc.properties:

# Oracle Credentials 
database.driverClassName = oracle.jdbc.OracleDriver 
jdbc.url = jdbc:oracle:thin:@dev.example.com:1521:dev 
jdbc.username = epvin 
jdbc.password = my_password 

hibernate.dialect = org.hibernate.dialect.OracleDialect 
hibernate.hbm2ddl.auto = update 

我得到上面提到的錯誤。

+1

您是否確認通過打印設置爲debug的spring軟件包的日誌級別的數據源屬性來查看登錄名/密碼是否被正確替換? – Vikdor

+1

在您的情況下,始終將應用程序部署爲JavaWeb而不是Spring,因爲後者將重新編寫數據源屬性。你應該知道這裏的文檔:http://docs.cloudfoundry.com/frameworks/java/spring/spring.html。正如Vikdor所問,打印這些屬性的值是一個好主意。 –

+0

我已經用實際值替換了$ {jdbc.values}。所以這些值應該是正確的。此外,我還添加了William給我的頁面中缺少的指令。還是一樣的錯誤。 – Alex

回答

1

這是一個奇怪的Oracle特定身份驗證問題。對在同一臺服務器上運行的MySQL服務進行身份驗證可以正常工作。

+0

嘿,在這種情況下你會嘗試部署到本地服務器並連接到相同的Orcacle數據源進行測試嗎? –