2014-07-10 104 views
1

不支持最初我用只冬眠Spring + hibernate vs hibernate配置。 UnsupportedOperationException異常的原因:通過的BasicDataSource

而且我下面hibernate.cfg.xml

<hibernate-configuration> 
    <session-factory> 
     <property name="hbm2ddl.auto">create</property>  
     <property name="connection.url">jdbc:mysql://localhost:3306/...</property> 
     <property name="connection.username">root</property> 
     <property name="connection.password">XXX</property> 
     <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 
     <property name="show_sql">true</property> 
     <property name="format_sql">true</property> 
     <property name="connection.pool_size">1</property> 
     <property name="current_session_context_class">thread</property>   

     //mapping 
     ... 

    </session-factory> 
</hibernate-configuration> 

和它的作品好:

我以後包括然後配置看起來如此:

... 
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" 
     destroy-method="close"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://localhost:3306/..." /> 
     <property name="username" value="root" /> 
     <property name="password" value=XXX /> 
    </bean> 

    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
    </bean> 
... 

後,我看到控制檯:

java.lang.UnsupportedOperationException: Not supported by BasicDataSource 
    at org.apache.commons.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1432) 
    at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:139) 

後,我試圖從hibernate.cfg.xml刪除

 <property name="connection.username">root</property> 
     <property name="connection.password">XXX</property> 

,我看不出異常。

你能解釋一下這個問題的原因是什麼?

起初我以爲這個問題,我不應該在不同的配置重複的信息,但現在我看到,例如url定義裏面dataSource和內部hibernate.cfg.xml

請澄清這Spring + Hibernate的魔法。

回答

-1

在最新版本中不支持getConnection(用戶,密碼)方法。

它會幫助你: 更換

org.apache.commons.dbcp2.BasicDataSource 

org.springframework.jdbc.datasource.DriverManagerDataSource 
+0

現在我有一個工作應用程序!我只想了解問題的原因 – gstackoverflow

+5

您的建議是用完全不緩存連接的東西替換完全成熟的連接池。用戶不應該在生產中這樣做。 –

0

我有這個同樣的問題,上述方案後,我得到了一個破壞方法「關閉」未找到錯誤或類似的規定線。

但是,看起來getConnection(用戶,密碼)是這裏的基本問題。當我註釋掉了hibernate.cfg.xml中的connection.username和connection.password時,一切正常。

更正:我要澄清,我移動的用戶名和密碼到appContext像這樣

<bean id="dataSource" 
    class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" 
    p:driverClassName="com.mysql.jdbc.Driver" 
    p:url="jdbc:mysql://127.0.0.1:3306/my_schema" 
    p:username="root" 
    p:password="mypassword"> 
</bean> 
3

注意搭配:

org.springframework.jdbc.datasource.DriverManagerDataSource 

你不提供連接池!

我建議轉移到Tomcat JDBC連接池。

這是現在恕我直言,最有效的一個。

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close"> 

它需要依賴

org.apache.tomcat tomcat-jdbc 

檢查文檔: https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html

1

我有同樣的問題。 BasicDataSource類將使用其自己的url,usernamepassword參數進行連接。會話工廠將使用已配置的數據源。因此,結果url,usernamepassword參數被覆蓋。在hibernate.cfg.xml中丟棄這些連接參數,因爲它們由dataSource bean管理。