【问题标题】:configuring hibernate datasource in spring xml在 Spring xml 中配置休眠数据源
【发布时间】:2013-12-08 06:41:15
【问题描述】:

运行我的 Web 应用程序时出现以下错误。我在使用正确的 jar 配置休眠和弹簧时遇到问题。在我工作了几个小时后越过了这个障碍后,我在 hibernate datasource 中遇到了问题。会话工厂和 dao bean 正在由 spring 正确初始化 但是当我在 dao 中访问方法时出现错误...

    INFO:   Attestation_spring_hibernate was successfully deployed in 11,309 milliseconds.
INFO:   before calling rateDAO.getCount()
INFO:   inside getSessionFactory()
WARNING:   StandardWrapperValve[dispatcher]: Servlet.service() for servlet dispatcher threw exception
java.lang.UnsupportedOperationException: Not supported by BasicDataSource
    at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1062)
    at org.hibernate.service.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:141)
    at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:292)
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:214)
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:157)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.connection(StatementPreparerImpl.java:56)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:161)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:182)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:159)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1859)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1836)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1816)
    at org.hibernate.loader.Loader.doQuery(Loader.java:900)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:342)
    at org.hibernate.loader.Loader.doList(Loader.java:2526)
    at org.hibernate.loader.Loader.doList(Loader.java:2512)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2342)
    at org.hibernate.loader.Loader.list(Loader.java:2337)
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:124)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1662)
    at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:374)
    at daoImpl.RateDAO.getRateById(RateDAO.java:149)
    at controller.Controller1.welcome(Controller1.java:47)

下面是我的application context.xml..

   <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/test_amar"/>
    <property name="username" value="root"/>
    <property name="password" value=""/>
    <property name="initialSize" value="2"></property>    
        <property name="maxActive" value="5"></property>    
    <property name="validationQuery" value="SELECT 1"/>
  </bean>

  <!-- Hibernate Session Factory -->
  <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource"/>
    <property name="packagesToScan">
      <array>
        <value>entities</value>
      </array>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="dialect">org.hibernate.dialect.MySQLDialect</prop>
        </props>

    </property>
  </bean>

我使用 spring3 和 hibernate4。我的数据源中似乎存在配置错误。但我找不到它。

从下面的服务器日志中,我看到 dao 和会话工厂 bean 已正确实例化。

INFO:   Loading XML bean definitions from ServletContext resource [/WEB-INF/dispatcher-servlet.xml]
INFO:   JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning
INFO:   JSR-330 'javax.inject.Named' annotation found and supported for component scanning
INFO:   JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
INFO:   Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1020cb7: defining beans [**controller1,rateDAO**,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping#0,urlMapping,viewResolver,indexController,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0]; parent: org.springframework.beans.factory.support.DefaultListableBeanFactory@fca094
INFO:   Mapped URL path [/controller1] onto handler 'controller1'
INFO:   Mapped URL path [/controller1/*] onto handler 'controller1'

请帮助..

【问题讨论】:

    标签: spring hibernate datasource


    【解决方案1】:

    问题

    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

    【讨论】:

      【解决方案2】:

      尝试从 hibernate.cfg.xml 中删除

      <property name="hibernate.connection.password">your-password</property>
      <property name="hibernate.connection.username">your-username</property>
      

      【讨论】:

        【解决方案3】:

        尝试在hibernate属性中添加以下代码

                 <prop key=" hibernate.dialect "> org.hibernate.dialect.MySQLDialect </prop>
                 <prop key="hibernate.show_sql">true</prop>
                 <prop key="hibernate.connection.username">root</prop>
                 <prop key="hibernate.connection.password">root</prop>
        
          </props>
        

        【讨论】:

          【解决方案4】:

          尝试使用 com.mysql.jdbc.jdbc2.optional.MysqlDataSource。

          【讨论】:

          • 您不能将 OracleDataSource 用于 MySQL 数据库
          • 我使用 mySQL 数据库。 oracle.jdbc.pool.OracleDataSource 将用于 oracle db 对吗??
          【解决方案5】:

          根据最新版本,不支持getConnection(user, password)方法,但是hibernate不应该调用该方法。

          您可以使用 MySQL 连接器包中提供的 org.springframework.jdbc.datasource.DriverManagerDataSourcecom.mysql.jdbc.jdbc2.optional.MysqlDataSource 的弹簧。 (http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html)

          【讨论】:

          • 我已将数据源更改为 但是我收到一个奇怪的错误.....没有用户BY NAME 'sa' IN XML OR IN MYSQL .... java.sql.SQLException: Access denied for user 'sa'@'localhost' (using password: NO)
          • 使用org.springframework.jdbc.datasource.DriverManagerDataSource 已经奏效了。但现在我无法使用DBCP。 有没有办法在数据源中使用池???
          • 投票是什么意思?
          • 我的意思是 DBCP 提供的 db 'connection' pooling 服务。 DBCP 维护一个连接池到 db 并在需要时提供它们而不是我们在需要时创建新连接。当我们使用来自 DBCP 的数据源和很受欢迎。我们可以在 DBCP 数据源中设置最大连接数属性。但在这种情况下,我想我们不会得到那个设施。
          • 那么你应该看看 commons-dbcp (commons.apache.org/proper/commons-dbcp),它提供了一个很好的 DataSource 实现和很多池选项
          猜你喜欢
          • 2016-05-06
          • 2010-12-26
          • 2017-07-09
          • 2018-12-16
          • 1970-01-01
          • 2014-11-05
          • 2021-12-17
          • 1970-01-01
          • 2014-06-28
          相关资源
          最近更新 更多