在 Spring 中,有以下三种方式来创建数据源:

  1. 通过 JNDI 获取应用服务器中的数据源;
  2. 在 Spring 容器中配置数据源;
  3. 通过代码来创建数据源,这种方式适用于无容器依赖的单元测试。

1 配置数据源

Spring 在第三方依赖包中包含了 2 种数据源的实现包 一个是 Apache 的 DBCP;另一个是 C3P0。 我们可以在 Spring 配置文件中直接配置这些数据源 。

1.1 DBCP

DBCP (Database Connection Pool)是一个依赖 Jakarta commons-pool 对象池机制的数据库连接池,所以在类路径下还必须包括 common。 下面是使用 DBCP 配置 MySQL 数据源的配置片段:

<bean id="dataSource" class="org.a; destroy-method="close"> <property name="driverClassName" value="com.my; /> <property name="url" value="jdbc:mysql://localhost:3309/db" /> <property name="username" value="root" /> <property name="password" value="xxxxxx" /> </bean>

BasicDataSource 提供了 close() 方法用于关闭数据源,所以必须设定 destroy-method=”close”, 以便 Spring 容器关闭时,能够正常关闭数据源。

除以上必须的数据源属性外,还有一些常用的属性。

事务属性:

连接数相关属性:

连接监测与维护相关属性:

缓存相关属性:

连接泄露回收相关属性:

假设数据库用的是 MySQL,那么如果数据源配置不当,将可能会发生经典的“8小时问题“。 原因是 MySQL 在默认情况下如果发现一个连接的空闲时间超过 8 小时,那么会在数据库端自动关闭这个连接 。 而数据源并不知道这个连接已经被关闭了,所以当它将这个无用的连接返回给某个 DAO 时, DAO 就会抛出无法获取 connection 的异常 。

DBCP 的 testOnBorrow 默认设置为 true,所以从连接池中取出连接之前会先进行检测,因为不会发生 “8 小时问题 ”。 但如果每次取连接时都进行检测,那么在高并发应用下就会产生性能问题。

因此建议在高并发下,将 testOnBorrow 设置为 false;然后将 testWhileIdle 设置为 true,打开空闲连接回收器;最后把 timeBetweenEvictionRunsMillis 的值设定为小于 8 小时,这样那些被 MySQL 所关闭的空闲连接,就会被清除出去。这样不仅解决了 “8 小时问题 ”,而且还保证了高性能 O(∩_∩)O哈哈~

注意:因为 MySQL 本身的 interactive-timeout(单位为 s)参数,可以设定空闲连接的过期时间,所以我们要想获取到这个参数值,然后再设定 DBCP 的 timeBetweenEvictionRunsMillis 属性值。

1.2 C3P0

C3P0 是一个开放源代码的 JDBC 数据源实现项目,它实现了 JDBC3 和 JDBC2 扩展规范说明的 Connection 和 Statement 池 。

下面是使用 C3P0 配置 MySql 数据源的配置片段:

<bean id="dataSource" class="com.mc; destroy-method="close"> <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" /> <property name="jdbcUrl" value="jdbc:mysql://localhost:3309/db" /> <property name="use" value="xxx" /> <property name="password" value="xxxxxx" /> </bean>

C3P0 也提供了一个用于关闭数据源的 close() 方法,这样我们就可以保证 Spring 容器被关闭时,能够成功关闭数据源 。

2 JNDI 数据源

如果应用配置在高性能的应用服务器(如 WebLogic 或 Websphere 等)上,我们可能更希望使用应用服务器所提供的数据源 。 应用服务器的数据源使用 JNDI 方式来供调用者使用, Spring 为此专门提供了引用 JNDI 资源的 JndiObjectFactoryBean 类 。 下面是一个简单的配置:

<bean id="dataSource" class="org.; p:jndiName="java:comp/env/jdbc/ds"/>

S 为获取 J2EE 资源提供了一个 jee 命名空间,通过 jee 命名空间,可以有效地简化 J2EE 资源的引用:

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="; xmlns:xsi="; xmlns:p="; xmlns:jee="; xsi:schemaLocation=" /spring-beans-4.0.xsd /spring-jee-4.0.xsd "> <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/ds"/> </beans>

3 Spring 数据源实现类

Spring 本身也提供了一个简单的数据源实现类 DriverManagerDataSource ,它位于 org. 包中 。 这个类实现了 javax. 接口,但它并没有提供池化连接机制,每次调用 getConnection() 方法获取新连接时,只是简单地创建一个新的连接 。它不需要额外的依赖类,所以,这个数据源类比较适合在单元测试中使用 。

Spring 数据源实现类既可以通过配置直接使用,也可以在代码中实例化调用:

DriverManagerDataSource dataSource=new DriverManagerDataSource(); da("com.my;); da("jdbc:mysql://127.0.0.1:3306/spring4"); da("root"); da(""); try { Connection connection=da(); i()){ Sy("连接已关闭"); }else{ Sy("连接已开启"); } } catch (SQLException e) { e.printStackTrace(); }

作者:deniro

來源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

1.《(jndi如何获取数据源)jdbc和jndi数据源区别》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《(jndi如何获取数据源)jdbc和jndi数据源区别》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/3302866.html