在继承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.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) { }
即此时并没有真正关闭实际的连接。
即谁打开的连接谁负责关闭。
相关推荐
在与 OpenJPA 集成时,Spring 可以作为容器管理OpenJPA的实体管理和数据访问对象(DAO)。 OpenJPA 是基于 JPA 规范的实现,它提供了一种标准的方式来处理数据库操作,将对象模型与关系型数据库模型进行映射。通过...
### JPA应用及介绍 #### 1. JPA概述 ##### 1.1 什么是JPA? JPA,即Java Persistence API(Java持久化API),是Sun公司在Java EE 5规范中提出的一种Java持久化接口。JPA的目标是提供一种标准化的方式,用于简化...
6. **测试**:单元测试或集成测试,验证JDBC、JPA和Spring的组合使用是否正确。 这个项目对于初学者来说是一个很好的学习资源,它将帮助理解如何在实际项目中整合这三个强大的工具,实现高效且可维护的数据访问层。...
Spring Boot 连接 Oracle 数据库 JDBC 配置步骤 在本文中,我们将详细介绍如何使用 Spring Boot 连接 Oracle 数据库,配置 JDBC 驱动程序,并实现数据库的基本操作。 Step 1: 添加依赖项 在 Spring Boot 项目中,...
它支持ACID事务,SQL:2003标准,以及JDBC和JPA接口。 2. **Eclipse IDE与数据库集成**:Eclipse作为一个强大的Java开发工具,提供了丰富的插件支持,如Data Tools Platform (DTP) 插件,使得开发者可以方便地在IDE...
SQL Server的中文开发版是专为开发者设计的版本,它提供了全套的数据库功能,但通常有使用时间和功能上的限制,适合于开发和测试环境。开发版支持创建复杂的数据库结构,执行SQL查询,进行数据操作,并且包含一系列...
2. 驱动程序类型:JDBC驱动有四种类型,分别是Type 1(纯Java驱动)、Type 2(混合驱动)、Type 3(网络协议驱动)和Type 4(纯Java的高性能驱动)。其中,Type 4驱动最常用,如Oracle JDBC Thin Driver,它直接与...
总结,搭建J2EE环境并配置SQL Server数据库涉及多个步骤,包括安装SQL Server、配置JDBC驱动、设置数据源、编写Java代码以使用数据源,以及测试和集成到实际应用中。通过遵循这些步骤,你可以顺利地在J2EE环境中利用...
在Java测试中,我们通常会涉及到各种概念和技术,包括单元测试、集成测试、异常处理、数据持久化等。这里我们将主要关注`DataSave.java`这个文件,它可能涉及到了数据存储或数据库操作的相关知识。 `DataSave.java`...
4. Statement和PreparedStatement:Statement用于执行静态SQL语句,而PreparedStatement则用于预编译SQL语句,提供更好的性能和安全性,因为它可以防止SQL注入攻击。 5. ResultSet:当执行查询时,结果通常返回为...
##### 步骤1:集成Hibernate及引入JPA 1. **新建项目**:在IDE中创建一个新的Java Web项目。 2. **拷贝所需JAR包**:将Hibernate所需的JAR包以及Hibernate对JPA的支持库拷贝到项目的`lib`目录中。 3. **配置JPA属性...
开发者通过编写SQL查询语句,利用JDBC的Connection、Statement或PreparedStatement对象执行SQL,从而实现对数据库的读写操作。 **Spring框架** Spring是一个全面的Java企业级应用开发框架,提供了依赖注入、面向切...
在JBuilder工程文件中,可以看到项目的结构和配置,包括源代码文件、类路径设置、构建脚本等,这对于在集成开发环境中复现和运行实例非常有用。 数据库部分可能包含了创建和填充数据的脚本,以及用于测试的示例数据...
MySQL 和 NetBeans 链接实例是一个典型的数据库管理和开发场景,涉及到如何在Java集成开发环境中(IDE)使用MySQL数据库。这个实例将展示如何在NetBeans IDE中创建一个连接到MySQL数据库的应用程序,以便进行数据...
在Java的`java.sql`包中,包括了`Connection`(数据库连接)、`Statement`(执行SQL语句)、`PreparedStatement`(预编译SQL语句)和`ResultSet`(存储查询结果)等核心接口。此外,还有`DriverManager`用于注册和...
- **开发和测试**:HSQLDB常用于开发环境中的单元测试和集成测试,因为它快速启动、无需额外配置,且能模拟多种数据库行为。 - **嵌入式系统**:在资源有限的嵌入式设备上,HSQLDB作为内置数据库,能够提供高效的...
包括加载驱动、创建Connection、Statement或PreparedStatement对象,执行SQL语句,最后关闭连接。示例代码如下: ```java Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.get...
在Java Web开发中,H2数据库是一个轻量级、高性能的关系型数据库,广泛用于测试和开发环境。H2数据库支持多种模式,包括内存模式、单文件模式和服务器模式,这使得它非常适合快速启动和集成到Java应用程序中。下面将...