Spring + hibernate vs hibernate配置。 UnsupportedOperationException的原因:BasicDataSource不支持

时间:2014-07-10 09:13:21

标签: java spring hibernate configuration datasource

最初我只使用了休眠

我跟随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>

它运作良好:

在我包含 Spring 然后配置看起来如此:

...
<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)

我试图删除后

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

来自hibernate.cfg.xml,我没有看到异常。

你能解释这个问题的原因是什么吗?

最初我认为这个问题我不应该在不同的配置中复制信息,但现在我看到url定义在dataSource内部和hibernate.cfg.xml内部

请澄清这个 Spring + Hibernate 魔法。

4 个答案:

答案 0 :(得分: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 :(得分:1)

我遇到了同样的问题。 BasicDataSource课程将使用自己的urlusernamepassword参数进行连接。会话工厂将使用已配置的数据源。因此,结果会覆盖urlusernamepassword参数。只需删除hibernate.cfg.xml中的连接参数,因为它们由dataSource bean管理。

答案 2 :(得分:0)

我有同样的问题,经过上面的解决方案后,我得到了一种破坏方法&#39;关闭&#39;没有找到错误或类似的东西。

但是,看起来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 :(得分:-1)

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

它会帮助你: 替换

org.apache.commons.dbcp2.BasicDataSource

org.springframework.jdbc.datasource.DriverManagerDataSource