`
jinnianshilongnian
  • 浏览: 21513625 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2420447
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:3010220
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5640568
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:260217
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1597925
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:250368
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5860558
Group-logo
跟我学Nginx+Lua开...
浏览量:702867
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:785734
社区版块
存档分类
最新评论

混合jpa和jdbc集成测试时Connection第二次执行sql时被关闭原因及解决方案

 
阅读更多

在继承AbstractTransactionalJUnit4SpringContextTests 并使用如下代码进行集成测试时:

 

    @Before
    public void setUp() {
        setSqlScriptEncoding("utf-8");
        executeSqlScript("classpath:sql/intergration-test-data.sql", false);
    }

 可能得到如下异常:

写道
20:53:42.375 [main] WARN o.s.j.support.SQLErrorCodesFactory - Error while extracting database product name - falling back to empty error codes
org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is java.sql.SQLException: Couldn't perform the operation getMetaData: You can't perform a getMetaData operation after the connection has been closed

 

写道

org.springframework.jdbc.UncategorizedSQLException: StatementCallback; uncategorized SQLException for SQL [delete from `sys_job`]; SQL state [null]; error code [0]; Couldn't perform the operation createStatement: You can't perform a createStatement operation after the connection has been closed; nested exception is java.sql.SQLException: Couldn't perform the operation createStatement: You can't perform a createStatement operation after the connection has been closed
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at org.springframework.jdbc.core.Jdb

 

这是因为内部的JdbcTemplate在调用DataSourceUtils.releaseConnection(con, getDataSource());释放连接时,是调用的:org.springframework.orm.jpa.vendor.HibernateJpaDialect的HibernateConnectionHandle

 

		public void releaseConnection(Connection con) {
			JdbcUtils.closeConnection(con);
		}
    public static void closeConnection(Connection con) {
		if (con != null) {
			try {
				con.close();
			}
			catch (SQLException ex) {
				logger.debug("Could not close JDBC Connection", ex);
			}
			catch (Throwable ex) {
				// We don't trust the JDBC driver: It might throw RuntimeException or Error.
				logger.debug("Unexpected exception on closing JDBC Connection", ex);
			}
		}
	}

  

 

即con.close();直接关闭连接。

 

此时我们应该使用TransactionAwareDataSourceProxy代理之:

 

<bean id="dataSource" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
        <property name="targetDataSource">
            <bean class="org.logicalcobwebs.proxool.ProxoolDataSource">
                <property name="driver" value="${connection.driver_class}"/>
                <property name="driverUrl" value="${connection.url}"/>
                <property name="user" value="${connection.username}"/>
                <property name="password" value="${connection.password}"/>

                <property name="alias" value="${proxool.alias}"/>
                <property name="trace" value="${proxool.trace}"/>
                <property name="maximumConnectionCount" value="${proxool.maximum.connection.count}"/>
                <property name="minimumConnectionCount" value="${proxool.minimum.connection.count}"/>
                <property name="statistics" value="${proxool.statistics}"/>
                <property name="simultaneousBuildThrottle" value="${proxool.simultaneous.build.throttle}"/>
            </bean>
        </property>
    </bean>

 

 

此时在调用DataSources.doGetConnection获取ConnectionHolder时,内部使用SimpleConnectionHandle而非HibernateConnectionHandle,即releaseConnection并没有释放连接:

        public void releaseConnection(Connection con) {
 	}

 即此时并没有真正关闭实际的连接。 

 

即谁打开的连接谁负责关闭。

9
0
分享到:
评论
1 楼 飞天奔月 2013-05-12  
谁打开的连接谁负责关闭

相关推荐

    Spring和openJPA集成

    在与 OpenJPA 集成时,Spring 可以作为容器管理OpenJPA的实体管理和数据访问对象(DAO)。 OpenJPA 是基于 JPA 规范的实现,它提供了一种标准的方式来处理数据库操作,将对象模型与关系型数据库模型进行映射。通过...

    jpa应用及介绍

    ### JPA应用及介绍 #### 1. JPA概述 ##### 1.1 什么是JPA? JPA,即Java Persistence API(Java持久化API),是Sun公司在Java EE 5规范中提出的一种Java持久化接口。JPA的目标是提供一种标准化的方式,用于简化...

    jdbc-jpa-spring-sample:JDBC、JPA 和 Spring 的示例代码

    6. **测试**:单元测试或集成测试,验证JDBC、JPA和Spring的组合使用是否正确。 这个项目对于初学者来说是一个很好的学习资源,它将帮助理解如何在实际项目中整合这三个强大的工具,实现高效且可维护的数据访问层。...

    Spring boot连接oracle数据库JDBC配置步骤

    Spring Boot 连接 Oracle 数据库 JDBC 配置步骤 在本文中,我们将详细介绍如何使用 Spring Boot 连接 Oracle 数据库,配置 JDBC 驱动程序,并实现数据库的基本操作。 Step 1: 添加依赖项 在 Spring Boot 项目中,...

    SQL.zip_C5UR_eclipse sql_previouss87

    它支持ACID事务,SQL:2003标准,以及JDBC和JPA接口。 2. **Eclipse IDE与数据库集成**:Eclipse作为一个强大的Java开发工具,提供了丰富的插件支持,如Data Tools Platform (DTP) 插件,使得开发者可以方便地在IDE...

    Java开发相关安装包 SQL Server-中文开发版-Servers文件夹

    SQL Server的中文开发版是专为开发者设计的版本,它提供了全套的数据库功能,但通常有使用时间和功能上的限制,适合于开发和测试环境。开发版支持创建复杂的数据库结构,执行SQL查询,进行数据操作,并且包含一系列...

    基于Java的数据库访问

    2. 驱动程序类型:JDBC驱动有四种类型,分别是Type 1(纯Java驱动)、Type 2(混合驱动)、Type 3(网络协议驱动)和Type 4(纯Java的高性能驱动)。其中,Type 4驱动最常用,如Oracle JDBC Thin Driver,它直接与...

    2 j2ee环境搭建之SQLServer数据库.rar

    总结,搭建J2EE环境并配置SQL Server数据库涉及多个步骤,包括安装SQL Server、配置JDBC驱动、设置数据源、编写Java代码以使用数据源,以及测试和集成到实际应用中。通过遵循这些步骤,你可以顺利地在J2EE环境中利用...

    Java测试题.zip

    在Java测试中,我们通常会涉及到各种概念和技术,包括单元测试、集成测试、异常处理、数据持久化等。这里我们将主要关注`DataSave.java`这个文件,它可能涉及到了数据存储或数据库操作的相关知识。 `DataSave.java`...

    Java数据库实例,java,java初学者

    4. Statement和PreparedStatement:Statement用于执行静态SQL语句,而PreparedStatement则用于预编译SQL语句,提供更好的性能和安全性,因为它可以防止SQL注入攻击。 5. ResultSet:当执行查询时,结果通常返回为...

    struts2+spring3.x+JPA1.0框架整合步骤

    ##### 步骤1:集成Hibernate及引入JPA 1. **新建项目**:在IDE中创建一个新的Java Web项目。 2. **拷贝所需JAR包**:将Hibernate所需的JAR包以及Hibernate对JPA的支持库拷贝到项目的`lib`目录中。 3. **配置JPA属性...

    Maven前后端的数据展示与操作项目源码.zip

    开发者通过编写SQL查询语句,利用JDBC的Connection、Statement或PreparedStatement对象执行SQL,从而实现对数据库的读写操作。 **Spring框架** Spring是一个全面的Java企业级应用开发框架,提供了依赖注入、面向切...

    《java 数据库编程实例》 源代码

    在JBuilder工程文件中,可以看到项目的结构和配置,包括源代码文件、类路径设置、构建脚本等,这对于在集成开发环境中复现和运行实例非常有用。 数据库部分可能包含了创建和填充数据的脚本,以及用于测试的示例数据...

    MySQL 和 NetBeans链接实例

    MySQL 和 NetBeans 链接实例是一个典型的数据库管理和开发场景,涉及到如何在Java集成开发环境中(IDE)使用MySQL数据库。这个实例将展示如何在NetBeans IDE中创建一个连接到MySQL数据库的应用程序,以便进行数据...

    java常用包集合(包括各种数据库连接包)

    在Java的`java.sql`包中,包括了`Connection`(数据库连接)、`Statement`(执行SQL语句)、`PreparedStatement`(预编译SQL语句)和`ResultSet`(存储查询结果)等核心接口。此外,还有`DriverManager`用于注册和...

    HSQLDB

    - **开发和测试**:HSQLDB常用于开发环境中的单元测试和集成测试,因为它快速启动、无需额外配置,且能模拟多种数据库行为。 - **嵌入式系统**:在资源有限的嵌入式设备上,HSQLDB作为内置数据库,能够提供高效的...

    一个使用myeclipse 和oracle 结合使用的案例

    包括加载驱动、创建Connection、Statement或PreparedStatement对象,执行SQL语句,最后关闭连接。示例代码如下: ```java Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.get...

    h2 数据库 在java web中的代码 demo

    在Java Web开发中,H2数据库是一个轻量级、高性能的关系型数据库,广泛用于测试和开发环境。H2数据库支持多种模式,包括内存模式、单文件模式和服务器模式,这使得它非常适合快速启动和集成到Java应用程序中。下面将...

Global site tag (gtag.js) - Google Analytics