从InitialContext获取数据源
概述
本文介绍如何从javax.naming.InitialContext中获取web容器配置的数据源。
在web开发中,常见的获取数据源的方式是把数据源定义为spring的bean,其他类通过spring注入来获取数据源。可能遇到的问题如下:
- 需要获取数据源的类不是spring bean,无法接收注入。
- 系统中没有使用spring框架。
解决问题的方法可能有很多,这里提供基于InitialContext的解决方案。
解决方案
javax.naming.InitialContext ic = new javax.naming.InitialContext();
javax.sql.DataSource ds = (javax.sql.DataSource) ic.lookup(jndiName);
补充说明:
- 个别web容器配置的JNDI需要加固定前缀才是可查找JNDI,如Tomcat,需要加前缀"java:comp/env/"。
- 以上展示的仅仅只是最直接的做法,考虑到InitialContext是一个重量级的类,应该进行一定的优化来减少其创建次数。
以下提供一个项目中使用的工具类:
package cn.com.hnisi.baseservices.db;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import cn.com.hnisi.baseservices.config.Config;
/**
* SINOBEST 数据源工厂,用于获取DataSource.<br>
* 使用JNDI查找上下文中的DataSource.<br>
* @author lijinlong
*
*/
public class DataSourceFactory {
private static DataSourceFactory instance;
private static InitialContext context;
/** 默认的数据源的jndi名称属性的key */
private static final String DEFAULT_DATASOURCE_PROP_KEY = "DB.DATASOURCE"; private DataSourceFactory() {
super();
} /**
* 单例模式获取工厂实例.<br>
* @return
*/
public static final synchronized DataSourceFactory newInstance() {
if (instance == null)
instance = new DataSourceFactory();
return instance;
} /**
* 获取默认的DataSource.<br>
* 根据config/config.properties中DB.DATASOURCE属性值查找.<br>
* @return
*/
public DataSource getDefaultDataSource() {
String jndiName = Config.getInstance().getValue(DEFAULT_DATASOURCE_PROP_KEY);
DataSource ds = getDataSource(jndiName);
return ds;
} /**
* 根据JNDI名称,获取上下文中的DataSource.<br>
* @param jndiName
* @return
*/
public synchronized DataSource getDataSource(String jndiName) {
DataSource ds = null;
try {
if (context == null)
context = new InitialContext();
ds = (DataSource)context.lookup(jndiName);
} catch (NamingException e) {
e.printStackTrace();
}
return ds;
}
}
DataSourceFactory
从InitialContext获取数据源的更多相关文章
- jQuery ui autocomplete下拉列表样式失效解决,三种获取数据源方式,
jQuery有很多很多的已经实现,很漂亮的插件,autocomplete就是其中之一.jQuery ui autocomplete主要支持字符串Array.JSON两种数据格式,jQuery ui b ...
- AngularJS中获取数据源的几种方式
在AngularJS中,可以从$rootScope中获取数据源,也可以把获取数据的逻辑封装在service中,然后注入到app.run函数中,或者注入到controller中.本篇就来整理获取数据的几 ...
- (转)WebSphere的web工程中怎么获取数据源
原文:http://aguu125.iteye.com/blog/1694313 https://blog.csdn.net/bigtree_3721/article/details/44900325 ...
- java 连接mariadb 无法获取数据源的问题,在ubuntu上部署的时候(原创)
问题: 连接数据库时报错: log4j:WARN No appenders could be found for logger (com.mchange.v2.log.MLog).log4j:WARN ...
- Uep的ajaxform和ajaxgrid组件获取数据源
对于ajaxform组件var record = ajaxform.getRecord();var storeId = record.get("storeId");var stor ...
- tomcat配置JNDI获取数据源
各个web工程可以通过工程内的xml文件配置访问数据库的数据源,这样的配置是各个工程私有的.基于JNDI为tomcat配置数据源,则可以做成全局的,各工程只需要通过便签引用数据源即可. 1.需要将数据 ...
- dataTable 从服务器获取数据源的两种表现形式
var table = $('#example1').DataTable({ "processing": true,//加载效果 "autoWidth": fa ...
- c3p0 获取数据源
getDataSourcec3p0Resource private static void f3Resource() throws Exception { Connection conn = getD ...
- Tomcat安装、启动和配置
Tomcat服务器介绍 Tomcat是一个免费开发源代码的web应用服务器,具有与IIS.Apache等web服务器一样处理html页面的功能,另外它还是一个Servlet和JSP容器,独立的serv ...
随机推荐
- 杭电多校第八场-A-Character Encoding
题目描述 In computer science, a character is a letter, a digit, a punctuation mark or some other similar ...
- mvc BundleConfig实现对Css、Js压缩打包加载
Bundle不是.net Framework框架中的一员,使用Bundle首先要先添加引用,如下: nuget包管理--程序包管理控制台--Install-Package Microsoft.AspN ...
- PHP 截取字符串,多余部分用 ........ 代替
/** * 参数说明 * $string 欲截取的字符串 * $sublen 截取的长度 * $start 从第几个字节截取,默认为0 * $code 字符编码,默认UTF-8 */ function ...
- Java面试知识总结三
1.SpringMVC在项目中的应用? 1)service层,项目的业务逻辑层,一般先定义一个接口,在写一个实现类,实现所有的接口方法.service的实现类中要加注解@Service(用于标注业务层 ...
- idea 修改静态资源不需要重启的办法
快捷键Ctrl + Alt + S打开设置面板,勾选Build project automatically选项: 快捷键Ctrl + Shift + A查找registry命令: 在查找到的regis ...
- LTC 钱包部署
基础环境 系统: CentOS 7.x nodejs: v4.6.0 zeromq: 4.x 安装nodejs + zeromq 基础依赖 yum install -y gcc make gcc-c+ ...
- [bzoj1005][HNOI2008]明明的烦恼-Prufer编码+高精度
Brief Description 给出标号为1到N的点,以及某些点最终的度数,允许在 任意两点间连线,可产生多少棵度数满足要求的树? Algorithm Design 结论题. 首先可以参考这篇文章 ...
- Python 开发中easy_install的安装及使用
easy_install是一个python的扩展包,主要是用来简化python安装第三方安装包,在安装了easy_install之后,安装python第三方安装包就只需要在命令行中输入:easy_in ...
- 修改ES使用root用户运行
默认ES不允许使用root用户运行,如果使用root会报如下图的错误: ,通常建议创建elsearch用户并使用该用户运行ES.但如果必须使用root用户时,按如下设置即可: 1.启动是使用如下命令 ...
- python实战===代码
#!/usr/bin/env python # encoding:utf-8 import requests import json from conf import STORE_DICT_LIST ...