我们都知道,无论何时连接到数据库,都需要使用连接池。 所有使用JDBC 4类的现代驱动程序都支持它。 在本文中,我们将概述Spring应用程序中的连接池,以及如何在非JEE环境(例如测试)中处理相同的上下文。

在Spring,大多数连接数据库的示例都是使用DriverManagerDataSource完成的。如果您没有正确阅读文档,那么您将错过非常重要的一点。

注意: 此类不是实际的连接池; 它实际上并不合并连接。 它只是对成熟的连接池的简单替代,实现了相同的标准接口,但是在每个呼叫上都创建了新的Connections。

对于J2EE容器外部的测试或独立环境很有用,可以作为相应ApplicationContext中的DataSource bean,也可以与简单的JNDI环境结合使用。 假定使用池的Connection.close()调用将简单地关闭Connection,因此任何可识别DataSource的持久性代码都应起作用。

是的,默认情况下,spring应用程序不使用池连接。 有两种方法可以实现连接池。 取决于谁在管理池。 如果您在JEE环境中运行,则最好使用容器。 在非JEE设置中,有一些库可以帮助应用程序管理连接池。 让我们在下面详细讨论它们。

1.服务器(容器)管理的连接池(使用JNDI)

当应用程序连接到数据库服务器时,建立物理实际连接所花费的时间远远超过了脚本的执行。 连接池是数据库供应商率先采用的一种技术,它允许多个客户端共享一组提供对数据库资源访问权限的缓存的连接对象。 JavaWorld文章对此进行了很好的概述。

在J2EE容器中,建议使用容器提供的JNDI数据源。 这样的数据源可以通过JndiObjectFactoryBean在Spring ApplicationContext中作为数据源bean公开,以实现与此类之类的本地数据源bean之间的无缝切换。

以下文章帮助我在JBoss AS中设置数据源。

  1. DebaJava发布
  2. JBoss安装指南
  3. JBoss维基

下一步是使用服务器从应用程序创建的这些连接。 如文档中所述,您可以为此使用JndiObjectFactoryBean 。 如下所示

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"><property name="jndiName" value="java:/my-ds"/>
</bean>

如果要使用springs“ SpringJUnit4ClassRunner”编写任何测试,则将无法加载上下文,因为JNDI资源将不可用。

对于测试,您可以通过Spring的SimpleNamingContextBuilder设置模拟JNDI环境,或者将Bean定义切换到本地DataSource(因此更简单)。

当我在寻找一个很好的解决方案(我不想为测试提供单独的上下文)时,这个SO答案对我有所帮助。 它很好地利用了Javadoc中给出的各种技巧。 上述解决方案的问题是重复创建JNDI连接的代码。 我已经使用自定义的运行器SpringWithJNDIRunner解决了它。 此类将JNDI功能添加到SpringJUnit4ClassRunner。 它从类路径中的“ test-datasource.xml”文件中读取数据源,并将其绑定到名称为“ java:/ my-ds”的JNDI资源。 执行此代码后,JNDI资源可用于弹簧容器使用。

import javax.naming.NamingException;import org.junit.runners.model.InitializationError;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.mock.jndi.SimpleNamingContextBuilder;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;/*** This class adds the JNDI capabilities to the SpringJUnit4ClassRunner.* @author mkadicha* */
public class SpringWithJNDIRunner extends SpringJUnit4ClassRunner {public static boolean isJNDIactive;/*** JNDI is activated with this constructor.* * @param klass* @throws InitializationError* @throws NamingException* @throws IllegalStateException*/public SpringWithJNDIRunner(Class<?> klass) throws InitializationError,IllegalStateException, NamingException {super(klass);synchronized (SpringWithJNDIRunner.class) {if (!isJNDIactive) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("test-datasource.xml");SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();builder.bind("java:/my-ds",applicationContext.getBean("dataSource"));builder.activate();isJNDIactive = true;}}}
}
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="" /><property name="url" value="" /><property name="username" value="" /><property name="password" value="" /></bean></beans>

要使用此运行器,您只需在测试中使用注释@RunWith(SpringWithJNDIRunner.class) 。 此类扩展了SpringJUnit4ClassRunner,因为@RunWith批注中只能有一个类。 一个测试周期仅创建一次JNDI。 此类为问题提供了一种干净的解决方案。

2.应用程序管理的连接池

如果您需要J2EE容器之外的“真实”连接池,请考虑使用Apache的Jakarta Commons DBCP或C3P0。 Commons DBCP的BasicDataSource和C3P0的ComboPooledDataSource是完整的连接池bean,支持与此类相同的基本属性以及特定的设置(例如最小/最大池大小等)。

下面的用户指南可以帮助您进行配置。

  1. Spring文件
  2. C3P0用户指南
  3. DBCP用户指南

以下文章介绍了配置连接池的一般准则和最佳实践。

  1. 关于Spring JDBC连接池的问题
  2. MS SQL Server 2008中的连接池最大大小
  3. 如何确定最大连接数
  4. 监视SQL Server 2008中的活动连接数

翻译自: https://www.javacodegeeks.com/2014/03/integration-testing-for-spring-applications-with-jndi-connection-pools.html

Spring应用程序与JNDI连接池的集成测试相关推荐

  1. spring集成jndi_Spring应用程序与JNDI连接池的集成测试

    spring集成jndi 我们都知道,无论何时连接到数据库,都需要使用连接池. 所有使用JDBC 4类的现代驱动程序都支持它. 在本文中,我们将概述Spring应用程序中的连接池,以及如何在非JEE环 ...

  2. JavaWeb中连接数据库的一般方式与通过JNDI连接池的方式

    一 概念介绍: 1.连接池    Connection的取得和开放是代价比较高的处理,解决这个问题的方法是连接池.    连接池就是事先取得一定数量的Connection,程序执行处理的时候不是新建C ...

  3. 在 Spring Boot 中使用 HikariCP 连接池

    上次帮小王解决了如何在 Spring Boot 中使用 JDBC 连接 MySQL 后,我就一直在等,等他问我第三个问题,比如说如何在 Spring Boot 中使用 HikariCP 连接池.但我等 ...

  4. spring连接jdbc_在Spring JDBC中添加C3PO连接池

    spring连接jdbc 连接池是一种操作,其中系统会预先初始化将来要使用的连接. 这样做是因为在使用时创建连接是一项昂贵的操作. 在这篇文章中,我们将学习如何在Spring JDBC中创建C3P0连 ...

  5. 在Spring JDBC中添加C3PO连接池

    连接池是一种操作,其中系统会预先初始化将来要使用的连接. 这样做是因为在使用时创建连接是一项昂贵的操作. 在本文中,我们将学习如何在Spring JDBC中创建C3P0连接池(某人未使用休眠). Po ...

  6. jndi连接池链接mysql_使用容器提供的数据库连接池--JNDI用法

    现在,数据库的连接没有用到连接池几乎很少很少,每个项目组都可能有自己的数据库连接池组件,各容器提供商也提供了各自的数据库连接池,下面介绍一下tomcat和weblogic使用JNDI的数据库连接管理. ...

  7. spring boot 配置默认数据连接池 HiKariCP

    一.为什么选择HiKariCP 没其他原因,就是一个字 快. 性能方面 hikariCP>druid>tomcat-jdbc>dbcp>c3p0 .hikariCP的高性能得益 ...

  8. java 线程 连接池_java程序实现线程连接池功能

    下面是以前学java 的时候写的一个实现,没有考虑很多,比如同步处理等等.懒得改,你就看看吧. package com.wangjia.tools; import java.io.Serializab ...

  9. 请写一个java程序实现线程连接池功能_写一个java程序实现线程连接池的功能

    线程池: import java.util.linkedlist; public abstract class manager { private string mthreadpoolname = n ...

最新文章

  1. 揭秘:美国国防部用什么样的操作系统
  2. 2.1 DNS服务介绍和安装
  3. MySQL创建索引(CREATE INDEX)
  4. android studio module不识别 红色j,androidstudio 不显示 Module-- 新年第一波
  5. TensorRT学习笔记1 - 环境配置
  6. TypeError系列之:TypeError: 'tuple' object does not support item assignment
  7. Visual Studio Online,带来四种开发模式,未来已来。
  8. Linux 如何查看命令所在位置/查看命令文件所在位置
  9. 「Luogu5395」【模板】第二类斯特林数·行
  10. python列表转换成数字_python 字母转成数字Python操作列表的常用方法总结
  11. 【转】非常道-中小软件公司项目管理
  12. 微信小程序 开发文档
  13. 沫沫金::jqGrid插件-弹窗返回值
  14. CAS SSO 单点登录实例
  15. 新版Cadence打开PSpice8.0工程文件
  16. kaggle猫狗分类
  17. gocv拆分颜色通道
  18. 拼多多-桌上暖垫排行榜-好评榜调研
  19. 一个嘉奖真心做事认真做事的时代
  20. C# 实现对PPT插入、编辑、删除表格

热门文章

  1. 虚拟机安装windows ghost版本系统记录完整过程
  2. php js 验证码,js实现验证码的方法
  3. php 正则获取html标签,php正则取嵌套html标签
  4. redis存opc_KEPServerEX6完整免费版
  5. ubuntu ifconfig_Ubuntu 设置固定 IP 最简单的方法!
  6. 9.2-控制单元CU的功能(学习笔记)
  7. mysql批量插入数据的函数和存储过程
  8. 命令行执行Junit测试
  9. cli parser_Java命令行界面(第27部分):cli-parser
  10. gitlab10.x迁移_1.x到2.x的迁移:可观察与可观察:RxJava FAQ