Tomcat数据源(多)+JNDI+参数说明

Tomcat数据源(多)+JNDI+参数说明
 

<!--
  |- name:表示以后要查找的名称。通过此名称可以找到DataSource,此名称任意更换,但是程序中最终要查找的就是此名称,
           为了不与其他的名称混淆,所以使用jdbc/oracle,现在配置的是一个jdbc的关于oracle的命名服务。
  |- auth:由容器进行授权及管理,指的用户名和密码是否可以在容器上生效
  |- type:此名称所代表的类型,现在为javax.sql.DataSource
  |- maxActive:表示一个数据库在此服务器上所能打开的最大连接数
  |- maxIdle:表示一个数据库在此服务器上维持的最小连接数
  |- maxWait:最大等待时间。10000毫秒
  |- username:数据库连接的用户名
  |- password:数据库连接的密码
  |- driverClassName:数据库连接的驱动程序
  |- url:数据库连接的地址
-->

1-\conf\context.xml:

<Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Resource name="jdbc/oracleDb"      
        auth="Container"  
        type="javax.sql.DataSource"  
        driverClassName="oracle.jdbc.OracleDriver"  
        url="jdbc:oracle:thin:@192.168.10.92:1521:orcl"  
        username="xxjsb"  
        password="xxjsb"  
        maxActive="500"  
        maxIdle="500"  
        maxWait="36000"  
		#解决网络超时或者断网或者数据库重启的问题
		logAbandoned="true"  
		removeAbandoned="true" 
		removeAbandonedTimeout="10"
		#DBCP连接池的自我检测
		validationQuery = "select 1 from dual"
		testWhileIdle = "true"
		testOnBorrow = "false"
		timeBetweenEvictionRunsMillis = "30000"
		minEvictableIdleTimeMillis = "1800000"
		numTestsPerEvictionRun="3"
		/> 
	<Resource name="jdbc/extendDataNo1"      
        auth="Container"  
        type="javax.sql.DataSource"  
        driverClassName="oracle.jdbc.OracleDriver"  
        url="jdbc:oracle:thin:@192.168.10.92:1521:orcl"  
        username="middle"  
        password="middle"  
        maxActive="30"  
        maxIdle="20"  
        maxWait="36000"/> 
</Context>

2-spring配置文件(如:dataSourceContext.xml)

<beans>
	<bean id="dataSource"  class="org.springframework.jndi.JndiObjectFactoryBean">  
        <property name="jndiName" value="java:comp/env/jdbc/oracleDb"/>  
    </bean> 
	<bean id="extendDataNo1"  class="org.springframework.jndi.JndiObjectFactoryBean">  
        <property name="jndiName" value="java:comp/env/jdbc/extendDataNo1"/>  
    </bean>
</beans>

以上两步实现了项目依赖tomcat的JNDI数据源,且断网之后进行操作报错,重新联网后系统正常(亲测).

3-参数说明

<parame 
maxActive="最大**连接数,这里取值为500,表示同时最多有500个数据库连接"  
maxIdle="最大的空闲连接数,这里取值为500,表示即使没有数据库连接时依然可以保持500空闲的连接,
		而不被清除,随时处于待命状态"  
maxWait="连接最大的等待时间,单位毫秒,如果超过此时间将接到异常.设为-1表示无限制"
#解决网络超时或者断网或者数据库重启的问题
logAbandoned="true"  
removeAbandoned="true" 
removeAbandonedTimeout="连接泄漏回收参数,单位秒,泄露的连接可以被删除的超时值"
#DBCP连接池的自我检测
validationQuery="验证连接是否可用,使用的SQL语句"  
testWhileIdle="指明连接是否被空闲连接回收器(如果有)进行检验.
				如果检测失败,则连接将被从池中去除"      .
testOnBorrow="借出连接时不要测试,否则很影响性能"
timeBetweenEvictionRunsMillis = "每30秒运行一次空闲连接回收器,单位毫秒"  
minEvictableIdleTimeMillis = "池中的连接空闲30分钟后被回收,默认值就是30分钟,单位毫秒"
numTestsPerEvictionRun="在每次空闲连接回收器线程(如果有)运行时检查的连接数量,默认值就是3" 
#DBCP连接池的自我检测解释:
配置 timeBetweenEvictionRunsMillis = "30000"后,每30秒运行一次空闲连接回收器(独立线程),并每次检查3个连接,如果连接空闲时间超过30分钟就销毁.销毁连接后,连接数量就少了,如果小于
'minIdle'数量,就新建连接,维护数量不少于'minIdle'.
testWhileIdle = "true" 表示每30秒,取出3条连接,使用'validationQuery'中的SQL进行测试,测试不成功就销毁连接.销毁连接后,连接数量就少了,如果小于'minIdle'数量,就新建连接.
testOnBorrow = "false" 一定要配置,因为它的默认值是true.false表示每次从连接池中取出连接时,不需要执行'validationQuery'中的SQL进行测试.若配置为true,对性能有非常大的影响,性能会下降7-10倍.所在一定要配置为false.
每30秒,取出'numTestsPerEvictionRun'条连接(本例是3,也是默认值),发出"SELECT 1" SQL语句进行测试 ,测试过的连接不算是“被使用”了,还算是空闲的.连接空闲30分钟后会被销毁.
/>

4-注意事项
'maxIdle'值与'maxActive'值应配置的接近。
因为,当连接数超过maxIdle值后,刚刚使用完的连接(刚刚空闲下来)会立即被销毁.
而不是我想要的空闲M秒后再销毁起一个缓冲作用.这一点DBCP做的可能与你想像的不一样;
若'maxIdle'与'maxActive'相差较大,在高负载的系统中会导致频繁的创建、销毁连接,
连接数在'maxIdle'与'maxActive'间快速频繁波动,这不是我想要的;

 

5-测试jsp

将以下JSP文件放到项目根下,打开预览即可。

Tomcat数据源(多)+JNDI+参数说明

<%@ page language="java" contentType="text/html; charset=UTF-8"  
    pageEncoding="UTF-8"%>  
<%@ page import="javax.naming.Context" %>
<%@ page import="javax.naming.InitialContext" %>
<%@ page import="javax.sql.DataSource" %>
<%@ page import="java.sql.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>测试JNDI连接</title>  
</head>  
<body>  
<%  
Context ctx = new InitialContext();  
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/oracleDb"); 
Connection conns = null; 
try{
	conns = ds.getConnection(); 
	if(null!=conns){  
		out.println("数据库连接状态:<b>OK</b><hr />");  
		PreparedStatement pst = conns.prepareStatement("select u.login_name,u.name from users u where u.status = 'ACTIVE'");  
		ResultSet rs = pst.executeQuery();  
		while(rs.next()){ 
			String login_name = rs.getString("login_name");  
			String name = rs.getString("name");  
			out.println("<b>登录名:</b>"+login_name+"<br /><b>姓名:</b>"+name+"<hr />");  
		}  
	}else{  
		out.println("数据库连接状态:NO");  
	}
}catch (Exception e) {
	out.println(e.getMessage());  
}
%>  
</body>  
</html>

附多数据源配置:

<!--oracle数据库的jndi数据源,这里的lead为service名。-->
<Resource 
        name="jdbc/oracle"
        auth="Container" 
        type="javax.sql.DataSource"
        maxActive="100" 
        maxIdle="30" 
        maxWait="10000"
        username="lead_oams" 
        password="p"
        driverClassName="oracle.jdbc.driver.OracleDriver"
        url="jdbc:oracle:thin:@192.168.1.229:1521:lead"/>

<!--配置MySQL数据库的JNDI数据源-->
<Resource 
        name="jdbc/mysql"
        auth="Container" 
        type="javax.sql.DataSource"
        maxActive="100" 
        maxIdle="30" 
        maxWait="10000"
        username="root" 
        password="root"
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://192.168.1.144:3306/leadtest?useUnicode=true&amp;characterEncoding=utf-8"/>

<!--配置SQLServer数据库的JNDI数据源-->
<Resource 
        name="jdbc/sqlserver"
        auth="Container" 
        type="javax.sql.DataSource"
        maxActive="100" 
        maxIdle="30" 
        maxWait="10000"
        username="sa" 
        password="passw0rd"       driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"       url="jdbc:sqlserver://192.168.1.51:1433;DatabaseName=demo"/>
<!--配置DB2数据库的JNDI数据源-->
<Resource 
        name="jdbc/DB2"
        auth="Container" 
        type="javax.sql.DataSource"
        maxActive="100" 
        maxIdle="30" 
        maxWait="10000"
        username="root" 
        password="root"
        driverClassName="com.ibm.db2.jcc.DB2Driver"
        url="jdbc:db2://10.137.23.130:50000/ntsq"/>

--------------------- 

原文:https://blog.csdn.net/woshimyc/article/details/72845417?utm_source=blogxgwz1
原文:https://blog.csdn.net/zhanglf02/article/details/76726702