无法为事务打开 Hibernate Session;嵌套异常是 org.hibernate.exception.JDBCConnectionException:无法打开连接
Posted
技术标签:
【中文标题】无法为事务打开 Hibernate Session;嵌套异常是 org.hibernate.exception.JDBCConnectionException:无法打开连接【英文标题】:Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Could not open connection 【发布时间】:2017-07-08 03:19:54 【问题描述】:我是 Spring-MVC 和 Hibernate 的新手。尝试使用 Spring-MVC(4.0.3) 、 Hibernate(4.3.5) 并使用 MySQL 作为后端创建测试 Web 应用程序.
连接到数据库没有问题,因为我尝试使用简单的 JDBC 连接语句从示例 testJavaClass 中的同一数据库中获取数据,并且我能够获取记录。
错误日志:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Could not open connection
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
root cause
org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Could not open connection
org.springframework.orm.hibernate4.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:515)
org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373)
org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:420)
org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:257)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
com.sun.proxy.$Proxy130.listPersons(Unknown Source)
com.journeldev.spring.PersonController.listPersons(PersonController.java:29)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
这是我的 pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.raju.spring</groupId>
<artifactId>spring-mvc-hibernate</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<java-version>1.7</java-version>
<org.springframework-version>4.0.3.RELEASE</org.springframework-version>
<org.aspectj-version>1.7.4</org.aspectj-version>
<org.slf4j-version>1.7.5</org.slf4j-version>
<hibernate.version>4.3.5.Final</hibernate.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>$org.springframework-version</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>$org.springframework-version</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>$org.springframework-version</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>$hibernate.version</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>$hibernate.version</version>
</dependency>
<!-- Apache Commons DBCP -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- Spring ORM -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>$org.springframework-version</version>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>$org.aspectj-version</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>$org.slf4j-version</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>$org.slf4j-version</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>$org.slf4j-version</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
<!-- @Inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<additionalProjectnatures>
<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
</additionalProjectnatures>
<additionalBuildcommands>
<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
</additionalBuildcommands>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass>org.test.int1.Main</mainClass>
</configuration>
</plugin>
</plugins>
<finalName>$project.artifactId</finalName>
</build>
</project>
Eclipse 中的项目结构:
servlet-context.xml:(根据@Maciej Kowalski 的回答更新,我仍然看到同样的问题)
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing
infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving
up static resources in the $webappRoot/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources
in the /WEB-INF/views directory -->
<beans:bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
<beans:property name="url"
value="jdbc:mysql://localhost:3307/rajuDB" />
<beans:property name="username" value="raju" />
<beans:property name="password" value="raju" />
</beans:bean>
<!-- Hibernate 4 SessionFactory Bean definition -->
<beans:bean id="hibernate4AnnotatedSessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<beans:property name="dataSource" ref="dataSource" />
<beans:property name="annotatedClasses">
<beans:list>
<beans:value>com.journeldev.spring.model.Person</beans:value>
</beans:list>
</beans:property>
<beans:property name="hibernateProperties">
<beans:props>
<beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect
</beans:prop>
<beans:prop key="hibernate.show_sql">true</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
<beans:bean id="personDAO" class="com.journeldev.spring.dao.PersonDAOImpl">
<beans:property name="sessionFactory" ref="hibernate4AnnotatedSessionFactory" />
</beans:bean>
<beans:bean id="personService" class="com.journeldev.spring.service.PersonServiceImpl">
<beans:property name="personDAO" ref="personDAO"></beans:property>
</beans:bean>
<!-- the transactional advice (what 'happens'; see the <aop:advisor/> bean below) -->
<context:component-scan base-package="com.journeldev.spring" />
<tx:annotation-driven transaction-manager="transactionManager"/>
<beans:bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<beans:property name="sessionFactory" ref="hibernate4AnnotatedSessionFactory" />
</beans:bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- the transactional semantics... -->
<tx:attributes>
<!-- all methods starting with 'get' are read-only -->
<tx:method name="get*" read-only="true"/>
<!-- other methods use the default transaction settings (see below) -->
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- ensure that the above transactional advice runs for any execution
of an operation defined by the FooService interface -->
<aop:config>
<aop:pointcut id="personServiceOperation" expression="execution(* com.journeldev.spring.service.PersonServiceImpl.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="personServiceOperation"/>
</aop:config>
</beans:beans>
我检查了互联网上的许多其他线程并尝试更改我的servlet-context.xml
文件但没有解决我的问题。
例如:尝试按照 *** Thread 添加额外参数,如下所示
<beans:property name="initialSize" value="7"/>
<beans:property name="maxActive" value="7"/>
<beans:property name="maxWait" value="10000"/>
<beans:property name="validationQuery" value="SELECT 1" />
<beans:property name="validationQueryTimeout" value="34000" />
<beans:property name="testOnBorrow" value="true" />
结果:问题依旧:
Ex 2:尝试按照*** Thread 更改数据源,如下所示
<beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
<beans:property name="url"
value="jdbc:mysql://localhost:3307/rajuDB" />
<beans:property name="username" value="raju" />
<beans:property name="password" value="raju" />
</beans:bean>
结果:问题依旧
根据@James Jithin 的评论更新:2017 年 2 月 19 日
try
Class.forName("com.mysql.jdbc.Driver");
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3307/rajuDB", "raju", "raju");
Statement state=conn.createStatement();
ResultSet rs=state.executeQuery("select * from Person");
if(rs!=null && rs.next())
System.out.println("conn connected");
else
System.out.println("not connected");
catch(Exception e)
【问题讨论】:
我在 PersonServiceImpl 方法的所有方法中添加了“Transactional”注释,该方法在类级别再次使用“@Service”注释。 推荐阅读:How to create a Minimal, Complete, and Verifiable example 请分享您尝试过的示例 Java JDBC 连接。 【参考方案1】:如果你发现你的连接代码的每一点都是正确的,那么你应该检查你的 Mysql 版本应该与 Spring 兼容。 一些旧版本不适用于 Spring 最新版本。
【讨论】:
谢谢。我的问题得到了解决,我分享了我所犯的错误。我建议您将您的回复添加为评论而不是添加为答案,因为您没有给出潜在的解决方案。【参考方案2】:这是我犯的一大错误。!我很抱歉。代码和xml配置文件没有问题。
初始计划:我在虚拟机中设置了 MySql,并在端口 3306 下运行。计划是从运行在我的主机上的 tomcat 实例运行应用程序。因此,我使用端口 3307->3306 启动了从主机到 VM 的端口转发,并在 MYSql 中创建了一个远程用户“raju”,以便能够从我的主机(在主机中运行的 tomcat)连接。
错误:(由于一些无法解释的原因)。我决定 在一个单独的 tomcat 实例中运行应用程序,该实例正在运行 我的虚拟机。在这种情况下,tomcat 和 MySQL 都将运行 在同一台机器上。
1:所以不需要我应该直接使用的 PORT FORWARDING 3306端口。
2: 我已授予当前远程用户 ('raju') 的权限 具有本地连接的能力
grant all privileges on rajuDB.* to 'raju'@'localhost' identified by 'XXXX';
最终结果:现在我可以从数据库中获取详细信息。一切都按预期工作。
【讨论】:
【参考方案3】:你应该相信错误信息:
org.hibernate.exception.JDBCConnectionException:无法打开 连接
仅仅因为您可以使用 mySql 客户端应用程序连接到数据库,并不意味着您可以通过 TCP 访问数据库。 MySQL 可以通过 TCP 端口连接,也可以使用管道连接。您的 mySql 客户端可能正在使用命名管道连接到数据库。
https://dev.mysql.com/doc/refman/5.7/en/connecting.html
【讨论】:
我让 MySQL WorkBench 建立了与数据库的连接,并通过标准(TCP/IP)连接方法进行连接。 我没有在我的 aws 环境中输入正确的服务器地址。这帮助我弄清楚我做错了什么。【参考方案4】:您已在 xml 文件中定义了 personService
,但您尝试通过注释向其中添加事务行为。不是 100% 肯定,但我会一直坚持使用 xml 定义并在那里添加事务配置:
<!-- the transactional advice (what 'happens'; see the <aop:advisor/> bean below) -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<!-- the transactional semantics... -->
<tx:attributes>
<!-- all methods starting with 'get' are read-only -->
<tx:method name="get*" read-only="true"/>
<!-- other methods use the default transaction settings (see below) -->
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- ensure that the above transactional advice runs for any execution
of an operation defined by the FooService interface -->
<aop:config>
<aop:pointcut id="personServiceOperation" expression="execution(* com.journeldev.spring.service.PersonServiceImpl.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="personServiceOperation"/>
</aop:config>
为了以防万一,还要从服务中删除 @Transactional 注释。
示例基于:Spring Transaction Management Article。它包含有关如何使用 xml 配置使整个服务层事务化的信息。
【讨论】:
或者只是从 XML 中删除personService
bean 定义。他已经用@Service
对其进行了注释,并设置了组件扫描。根据他的配置,他不应该做任何其他事情。
@Naros:我已经从 xml 中删除了“personService”bean 并尝试运行。我收到一个错误。 “personController”类期望“personService”自动装配。
@Maciej Kowalski:我将尝试根据您的 cmets 更新我的代码,并将我的 cmets 发布在这里。
@Maciej Kowalski:我已经删除了 PersonService 的“事务”注释并更新了我的 'servlet-context.xml' 如上所述。我仍然看到同样的问题。 MySql DB 点是否需要进行任何更改。
@GhostRider <context:component-scan base-package="com.journeldev.spring" />
基本上告诉 spring 找到任何带注释的 @Component
或其派生类并将它们创建为 bean。这就是为什么您不需要在 XML 中列出它们,除非您的 Spring 设置有其他问题。以上是关于无法为事务打开 Hibernate Session;嵌套异常是 org.hibernate.exception.JDBCConnectionException:无法打开连接的主要内容,如果未能解决你的问题,请参考以下文章
无法打开 JPA EntityManager 进行事务处理;嵌套异常是 org.hibernate.exception.SQLGrammarException:无法获取 JDBC 连接