曾静的博客

但行好事,莫问前程.

嗨,我是曾静 (@devzeng),目前暂居深圳。


这是我用来记录平日学习笔记的地方,欢迎您的访问.

Java使用JNDI配置WEB项目数据源

JNDI(Java Naming and Directory Interface,Java命名与目录接口)是Java提供的一种标准的命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI SPI(Service Provider Interface,服务提供者接口)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。

使用传统的方式

一般对于普通的项目,习惯上使用.properties的文件来配置数据源的一些信息。在.properties文件中配置数据源连接字符串、用户名、密码和驱动的类,然后在代码中读取配置文件的信息再通过DriverManager.getConnection(url, username, password)的方式获取数据源连接对象,步骤如下,以SQLServer为例:

(1)注册驱动

Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);

(2)获取连接对象

Connection conn = DriverManager.getConnection(url, username, password);

(3)示例代码

public static Connection getDefaultConnection() {
	try {
		String url = "jdbc:sqlserver://localhost:1433;databaseName=DBName";
		String username = "sa";
		String password = "*";
		String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
		//注册SQLServer的驱动
		Class.forName(driver);
		//获取数据源连接对象
		Connection conn = DriverManager.getConnection(url,  username, password);
		return conn;
	} catch (Exception e) {
		e.printStackTrace();
		return null;
	}
}

使用JNDI的方式

1、获取数据源的连接对象Connection

public static Connection getConnection(String jndi) {
	DataSource datasource = null;
	Connection connection = null;
	try {
		Context context = new InitialContext();
		Context envContext = null;
		try {
			envContext = (Context) context.lookup("java:/comp/env");
		} catch (Exception e1) {
			// 无法通过java:方式获得换用/comp/env的方式
			try {
				envContext = (Context) context.lookup("/comp/env");
			} catch (Exception fff) {
				e1.printStackTrace();
			}
		}
		//如果数据源的名称不为空的话使用指定的数据源的名称来获取数据库连接对象
		if(StringUtils.isNotEmpty(jndi)) {
			datasource = (DataSource) envContext.lookup(jndi);
		} else {
			datasource = (DataSource) envContext.lookup("sqlserver/default");
		}
		connection = datasource.getConnection();
	} catch (Exception e2) {
		e2.printStackTrace();
	}
	return connection;
}

2、在Tomcat中的webapp中加入Resource配置

<Resource name="sqlserver/default"
	auth="Container"
	type="javax.sql.DataSource"
	maxActive="100"
	maxIdle="30"
	maxWait="10000"
	username="sa"
	password="*"
	driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
	url="jdbc:sqlserver://localhost:1433;databasename=DBNAME"/>

常见配置属性描述:

  • name:JDBC数据源的名称

  • auth:认证方式,一般设置为Container,还有一种是Application

  • type:当前配置资源的类别

  • factory:数据源工厂,默认为”org.apache.commons.dbcp.BasicDataSourceFactory”

  • driverClassName:驱动的全路径类名

  • maxActive:当前数据源支持的最大并发数

  • maxIdle:连接池中保留最大数目的闲置连接数

  • maxWait:当连接池中无连接时的最大等待毫秒数,在等当前设置时间过后还无连接则抛出异常

  • username:访问数据库的用户名

  • password:访问数据库的密码

  • url:JDBC驱动的连接字符串

  • validationQuery:在返回应用之前,用于校验当前连接是否有效的SQL语句,如果指定了,当前查询语句至少要返回一条记录,可以写成select top 1 * from sysobjects

3、在Tomcat的lib目录下面添加数据库的驱动文件

MySQL:mysql-connector-java-5.1.20-bin.jar

SQLServer:sqljdbc4.jar

Oracle:ojdbc14.jar

4、在web.xml加入如下配置

<resource-ref>
	<res-ref-name>sqlserver/default</res-ref-name>
	<res-type>javax.sql.DataSource</res-type>
	<res-auth>Container</res-auth>
</resource-ref>

注:属于可选配置,如果在web.xml中加入了上面的配置,则需要在Tomcat中一定要配置对应的Resource,否则会报错。

5、使用方式

Connection conn = getConnection("sqlserver/default");
...

参考资料

1、《Java使用JNDI技术获取DataSource对象》

2、《JNDI配置原理详解》

3、《JAVA配置JNDI数据源》

4、《JNDI 是什么》

5、《Web项目开发环境中运行在Tomcat时涉及到JNDI的Datasource的解决方法》

6、《tomcat下jndi的三种配置方式》

最近的文章

iOS中的二维码扫描

二维码(Two-dimensional code),又称二维条码,它是用特定的几何图形按一定规律在平面(二维方向)上分布的黑白相间的图形,是所有信息数据的一把钥匙。在现代商业活动中,可实现的应用十分广泛,如:产品防伪/溯源、广告推送、网站链接、数据下载、商品交易、定位/导航、电子凭证、车辆管理、信息传递、名片交流、wifi共享等。如今智能手机扫一扫功能的应用使得二维码更加普遍。ZXingZXing是一个开源的条码生成和扫描库,支持众多的条码格式,而且有各种语言的实现版本,支持的语言包括Ja...…

iOS继续阅读
更早的文章

使用Ant实现iOS项目的自动编译打包

Apache Ant,是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发。由Apache软件基金会所提供维护,目前最新的版本是1.9.4。本文主要介绍如何在iOS开发中使用Ant来提高开发效率,重点涉及到ant的安装、build配置文件的基本语法和iOS build脚本等内容。安装ANT工具1、到Apache Ant的官网上下载最新的ant工具包可以直接使用浏览器下载,或者是其他下载工具。下载地址也可以使用如下的命令:wget http://...…

iOS继续阅读