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

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数据源。 这样的DataSource可以通过JndiObjectFactoryBean在Spring ApplicationContext中作为DataSource bean公开,以实现与此类之类的本地DataSource 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

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

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

相关文章

java构造函数重载继承_Java基础-继承 - 写代码换盆的个人空间 - OSCHINA - 中文开源技术交流社区...

访问权限Java 中有三个访问权限修饰符&#xff1a;private、protected 以及 public&#xff0c;如果不加访问修饰符&#xff0c;表示包级可见。可以对类或类中的成员(字段和方法)加上访问修饰符。类可见表示其它类可以用这个类创建实例对象。成员可见表示其它类可以用这个类的实…

【渝粤教育】21秋期末考试管理会计10171k2

1、下列项目中&#xff0c;变动成本法下计入产品成本的是( )。 &#xff08;2 分&#xff09; A&#xff0e;变动性制造费用 B&#xff0e;变动性管理费用 C&#xff0e;固定性管理费用 D&#xff0e;固定性制造费用 2、将成本中心划分为标准成本中心和费用中心的分类依据是&am…

数字光端机和模拟视频光端机的六个不同点

说到模拟视频光端机与数字光端机的不同之处&#xff0c;在这里飞畅科技的小编要介绍六点不一样的地方来详细讲解模拟视频光端机与数字光端机的不同。模拟视频光端机与数字光端机究竟有何区别&#xff0c;这也是众多用户所关心的确问题&#xff0c;本文从以下几个方面进行如下论…

在硒中按TagName定位元素

硒定位器是处理网页上的元素时的关键。 从ID&#xff0c;名称&#xff0c;类&#xff0c;标记名&#xff0c;XPath&#xff0c;CSS选择器等定位器列表中&#xff0c;可以根据需要选择其中任何一种&#xff0c;然后在网页上找到Web元素。 由于与tagName或linktext相比&#xff0…

java输出链表的值_[剑指offer] 从尾到头打印链表(三种方法) java

一、每次把新遍历的链表值放到list索引为0的位置&#xff0c;实现逆序。public class Solution {public ArrayList printListFromTailToHead(ListNode listNode) {ArrayList listnew ArrayList<>();if(listNodenull) return list;while(listNode!null){list.add(0,listNo…

工业级以太网交换机-管理型

工业以太网交换机&#xff0c;即应用于工业控制领域的以太网交换机设备&#xff0c;由于采用的网络标准&#xff0c;其开放性好、应用广泛以及价格低廉、使用的是透明而统一的TCP/IP协议&#xff0c;以太网已经成为工业控制领域的主要通信标准。那么&#xff0c;管理型工业级以…

【渝粤教育】国家开放大学2018年春季 0064-22T20世纪欧美文学 参考试题

试卷代号&#xff1a;0064 2017-2018学年第二学期期末考试 外国文学专题试题 2018年7月 一、填空题&#xff08;每空3分&#xff0c;共30分&#xff09; 1. 是作家又是政治活动家&#xff0c;曾多次来到中国。他著有两部描写中国工人罢工和起义的作品&…

jdk 1.8 jdk8_JDK 8功能的可疑方面

jdk 1.8 jdk8我们大多数使用Java进行开发的人通常都热衷于JDK 8附带的功能和改进。 但是&#xff0c;最近有几篇文章指出了某些功能可能会被滥用和滥用&#xff0c;并可能在将来导致一些其他问题。 这些功能使我想起了J2SE 5中引入的自动装箱功能&#xff0c;虽然有其有用的情况…

Java注解参数类型枚举值_EffectiveJava-5-枚举和注解

用enum代替int常量1. int枚举&#xff1a;引入枚举前&#xff0c;一般是声明一组具名的int常量&#xff0c;每个常量代表一个类型成员&#xff0c;这种方法叫做int枚举模式。int枚举模式是类型不安全的&#xff0c;例如下面两组常量&#xff1a;性别和动物种类&#xff0c;二者…

【渝粤教育】国家开放大学2018年春季 0149-21T现代汉语 参考试题

试卷编号&#xff1a;0149 座位号 2017——2018学年度第二学期期末考试 现代汉语试题 2018年7月 1.合口呼韵母2&#xff0e;合成词 3&#xff0e;同义词4&#xff0e;非成词语素 5&#xff0e;派生义 1&#xff0e;有两种趋势促进了现代汉民族共同语的发展&#xff0c;一是 …

JDK 12 – JEP 325开关表达式

JDK 12于2019年3月19 日上线GA&#xff0c;继续致力于缩短发布周期和频繁发布。 该版本的功能部分可以在这里找到。 对于开发人员来说&#xff0c;有趣的功能之一是“ JEP 325开关表达式 ”&#xff0c;它可以作为预览功能使用。 此处定义的预览功能是&#xff1a; 预览语言或…

【渝粤教育】国家开放大学2018年春季 0222-22T模拟电子电路 参考试题

编号&#xff1a;0222 b 2017-2018年度第二学期期末考试 模拟电子电路&#xff08;开卷&#xff09; 试 题 2018年 7 月 一 、概念解释&#xff08;每小题6分&#xff0c;共30分&#xff09;1、电流放大倍数2、自激振荡3、负反馈4、通频带5、滤波二、放大电路的计算&#xff0…

工业交换机:如果出现了物理性故障该怎么判断?

一般工业交换机出现故障大致可以分为&#xff1a;软性能故障和物理性故障。软性能故障一般是指工业交换机在研发设计方面出现的问题。今天就由飞畅科技的小编来给大家聊聊工业交换机物理性故障该怎么判断&#xff1f;一起来看看吧&#xff01; 物理层故障主要是指交换机本身的…

java example cat_java maven hello example

Maven插件开发From:Maven 插件开发—-让maven使用更加灵活对于习惯于使用maven构建、管理项目的人来说&#xff0c;maven就是项目开发、测试、部署的一把利器&#xff1a;对类库的集中管理&#xff1b;依赖传递、继承、重用性高&#xff1b;对整个项目开发生命周期的完整支持&a…

【渝粤教育】国家开放大学2018年春季 0283-21T广告创意与表现(二) 参考试题

试卷代号&#xff1a;0283 2017-2018年度第2学期期末考试 广告创意与表现&#xff08;二&#xff09;试题&#xff08;闭卷&#xff09; 2018年5月 请指出下列作品采用的基本广告创意思路&#xff0c;并结合作品对此创意思路的定义、广告效果、思路进行阐述。字数不低于400。&…

工业交换机常用术语及常见知识点汇总

工业交换机作为现在最流行也最高效率的数据通信设备&#xff0c;它本身就是一款高科技产品。是产品就有很多的参数和指标&#xff0c;很多采购的朋友&#xff0c;可能只是按照公司的要求来进行筛选对应的产品&#xff0c;对工业交换机的了解不是很深入&#xff0c;甚至对交换机…

java lambda 调用函数_Java lambda函数将如何编译?

VM决定如何实现lambda&#xff0c;而不是编译器。请参阅Lambda表达式的翻译中的for部分。我们没有描述生成用于实现lambda表达式的对象的字节码(例如&#xff0c;调用内部类的构造函数)&#xff0c;而是描述了构造lambda的方法&#xff0c;并将实际构造委托给语言运行时。 该配…

【渝粤教育】国家开放大学2018年春季 0632-22T老年保健按摩 参考试题

科目编号&#xff1a;0632 座位号 2017-2018学年度第二学期期末考试 老年保健按摩试题 2018年7月 一、名词解释&#xff08;本大题共5小题&#xff0c;每小题4分&#xff0c;共计20分&#xff09; 1.老年病&#xff1a; 2.耳穴疗法&#xff1a; 3.拔罐疗法&#xff1a; 4.刮…

q7goodies事例_Java 8 Friday Goodies:精益并发

q7goodies事例在Data Geekery &#xff0c;我们喜欢Java。 而且&#xff0c;由于我们真的很喜欢jOOQ的流畅的API和查询DSL &#xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 &#xff0c;现在我们觉得是时候开始一个…

【渝粤教育】国家开放大学2018年春季 0700-22T中级会计实务(一) 参考试题

科目编号&#xff1a;0700 座位号 2017-2018学年度第二学期期末考试 中级会计实务&#xff08;一&#xff09; 试题 2018年 7 月 一、单选题&#xff08;本大题共10小题&#xff0c;每小题3分&#xff0c;共计30分&#xff09; &#xff08;★请考生务必将答案填入到下面对应序…