Spring应用程序与JNDI连接池的集成测试

我们都知道,无论何时连接到数据库,都需要使用连接池。 所有使用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在java web工程中jsp页面中使用kindeditor

在这之前我们用Notepad写过kindeditor 在Java web工程里也差不多 首先我们复制之前的thml代码粘贴到工程里 然后把样式也复制进去 然后就可以运行了 转载于:https://www.cnblogs.com/q2546/p/11066539.html

数据分析方法论

把零散的报表整成数据监控体系 把每次拍脑袋的评估整成数据考核体系 在推荐、广告等算法上有所突破&#xff0c;而不是自己瞎捣鼓个没人看的聚类分析 在推送响应等有业绩的地方产出产品&#xff0c;而不是每次用时间序列法预测个销量走势再被业务喷回来。 分析自己的现状&am…

Markdown的使用笔记

Markdown的使用笔记 Markdown在我看是一种使用几种标记符号就可以完成清晰排版的一种标记语言&#xff0c;是写笔记文章的一大利器&#xff0c;使用简单、方便&#xff0c;上手快&#xff0c;而且可以很好的兼容html&#xff0c;即html中的标签在markdown中也同样试用。这边文章…

多项式孤儿桶

巨佬制作人们大家好&#xff0c;我是练习多项式两周半的个人练习生lgl。这里总结一下多项式基本操作。 1.多项式加、减、输出 不说了。 时间复杂度$O(n)$。 2.多项式取模 已知多项式$F(x)$&#xff0c;求它对$x^n$取模。 人话&#xff1a;把$n$次及以上的系数清零。 时间复杂度…

python亲密度_Python OpenCV 图像2D直方图,取经之旅第 25 天

Python OpenCV 365 天学习计划&#xff0c;与橡皮擦一起进入图像领域吧。基础知识铺垫在之前的博客中&#xff0c;我们获取图像直方图的方式都是获取一维直方图&#xff0c;简单说就是只获取一个通道的特征&#xff0c;例如灰度&#xff0c;B 通道&#xff0c;R 通道。今天要学…

清除浮动的方式

1、父级div定义伪类&#xff1a;after和zoom <style type"text/css"> .div1{background:#000080;border:1px solid red;}.div2{background:#800080;border:1px solid red;height:100px;margin-top:10px}.left{float:left;width:20%;height:200px;background:#D…

py函数两个返回值_Python 函数为什么会默认返回 None?

Python 有一项默认的做法&#xff0c;很多编程语言都没有——它的所有函数都会有一个返回值&#xff0c;不管你有没有写 return 语句。本文出自“Python为什么”系列&#xff0c;在正式开始之前&#xff0c;我们就用之前讨论过的 pass语句和 …对象 作为例子&#xff0c;看看 P…

行高 line-height

一、行高的定义line-height(行高)&#xff1a;两行文字基线之间的距离1、什么是基线&#xff1f;2、为何是基线&#xff1f;3、需要两行吗&#xff1f;1、什么是基线&#xff1f;我们上学的时候都用过&#xff0c;抄写英文字母的时候。其中有一条红线&#xff0c;这个红线就是基…

实验七报告

一、实验结论 part1&#xff1a;验证性实验 1.验证性实验2 如果事先不知道学生人数&#xff0c;尝试对line29做如下修改后&#xff0c;程序运行结果是否正确&#xff1f;回答问题&#xff0c;并给出运行结果截图。 运行结果正确// 将file1.txt中小写字母转换成大写后&#xff…

XPath语法规则及实例

XPath语法规则及实例 XPath语法规则一、XPath术语&#xff1a; 1.节点&#xff1a;在XPath中&#xff0c;有七种类型的节点&#xff1a;元素、属性、文本、命名空间、处理指令、注释以及文档&#xff08;根&#xff09;节点。 XML文档是被作为节点树来对待的。树的根被称为文档…

WorkPlus超级APP助力企业节省IT人力成本,实现快速移动化

在信息化时代&#xff0c;移动应用已经成为企业发展的重要组成部分。然而&#xff0c;开发和维护原生客户端的成本却相对较高&#xff0c;需要大量的iOS、安卓和桌面端工程师。为了解决这一问题&#xff0c;WorkPlus作为一个功能完备的超级APP&#xff0c;为企业节约了大量的IT…

addEventListener的click和onclick的区别

前两节都和addEventListener的click有关&#xff0c;于是在想它与onclick有什么区别呢&#xff0c;自己调试了一下&#xff0c;网上也有相关资料 事件绑定 onclick绑定方式 优点&#xff1a; - 简洁 - 处理事件的this关键字指向当前元素 缺点&#xff1a; - 不能对事件捕获或…

ApiCloud利用NVTabBar模块快速搭建起APP的框架

废话不说&#xff0c;直接上代码 模块地址&#xff1a;https://docs.apicloud.com/Client-API/Nav-Menu/NVTabBar 代码实例&#xff1a; <!doctype html> <html><head><meta charset"utf-8"><meta name"viewport" content"…

Java 8中新的并行API:Glitz和Glamour的背后

我是一个出色的多任务处理者。 即使我在写这篇文章&#xff0c;我仍然可以为昨天在一个大家都对我陌生的聚会上发表的言论感到尴尬。 好消息是&#xff0c;我并不孤单– Java 8在多任务处理方面也相当出色。 让我们看看如何。 Java 8中引入的关键新功能之一是并行数组操作。 这…

ASP.NET 中执行 URL 重写

作者&#xff1a;overred 来源&#xff1a;原创URL 重写就是把URL地址重新改写&#xff08;汗^_^&#xff09;。详情&#xff1a;http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx优点&#xff1a;把url缩短等用法&#xff1a;1.下载ms的…

nine

nine Scarpy爬虫框架https://www.cnblogs.com/kermitjam/articles/10147261.html?tdsourcetags_pctim_aiomsg 高并发的爬虫框架 Runspider只能执行某个 爬虫程序.py文件 将项目根目录导入 Xpath语法 获取内容&#xff08;‘./text()’) 发送请求 ---> 获取响应数据 --->…

使用ActiveMQ –具有故障转移协议的“主/从”配置

介绍 ActiveMQ代理往往是企业中消息传递基础结构的核心部分。 此消息传递基础结构的高度可用性和可伸缩性至关重要。 请阅读此链接 &#xff0c;以了解有关创建经纪人网络以支持各种用例的更多信息。 ActiveMQ的流行用例之一是带有共享数据库的主/从配置。 使用此配置时&#x…

页面那些位置是投放广告的最佳位置

通常好的广告位置并非页面最上方的通栏广告&#xff0c;而是页面第一屏导航条下面中央和左侧的位置&#xff0c;此处放置广告会取得较好的效果。除此之外&#xff0c;页面中屏主要内容附件的位置为左侧和下侧较好&#xff0c;用户会第一时间注意到并关注这些广告。 转载于:http…

如何在Java中将字节数组转换为InputStream和OutputStream

您是否坚持使用编码&#xff0c;因为您有字节数组&#xff0c;并且链中的下一个方法需要InputStream&#xff1f; 不用担心Java有解决方案&#xff0c;您可以使用 ByteArrayInputStream 在Java中将字节数组转换为InputStream 。 此类使用字节数组作为源&#xff0c;并且由于它…

mysql 笔记打包下载_mysql 5.7压缩包安装笔记

重装系统之后准备安装mysql,看到官网上有mysql 5.7.10可以下载就点了,然后就开始了漫长的安装路程,总共折腾差不多一个多小时,最后终于安装成功了,这里把安装过程写下来,给自己做个笔记,也给后来人一个安装提示.1.下载安装包直接点击或者复制之后就可以下载了,不嫌麻烦或者想体…