JDBC学习备忘之连接--JNDI和数据源(转)
JNDI(Java Naming and Directory Interface)即是Java命名和目录接口,是一个为Java程序
提供命名和目录功能的API。为了使用JNDI文件系统,我们要从Sun的Java网站下载
fscontext1_2beta3.zip文件(http://192.18.97.54/ECom/EComTicketServlet/BEGIN836373535F0E1764803B2730E24621A2/-2147483648/672140307/1/392822/392738/672140307/2ts+/westCoastFSEND/7110-jndi-1.2.1-oth-JPR/7110-jndi-1.2.1-oth-JPR:4/fscontext-1_2-beta3.zip),下载后解压,我们会看到一个fscontext.jar和providerutil.jar,
我们把它添加到ClassPath环境变量那里去。
这篇外传说的是通过JDBC使用JNDI是非常有用的,因为这样可以注册(绑定)数据源,然后在程序
中查找这些数据源,而不必提供准确的数据库连接信息。因此,如果数据库连接信息改变了,那么
只需修改JNDI对象,而不必修改程序。当然JNDI不止用于数据源,它也可以用于存储和获取任何
类型的已命名的java对象以及执行标准的目录操作。好了,不多废话了。
一、将数据源绑定JNDI
????可以使用Java语句以程序方式将数据源绑定到JNDI,步骤如下:
????1、创建一个OracleDataSource对象
????????????OracleDataSource myODS=new OracleDataSource();
????2、设置OracleDataSource对象的属性
????????????myODS.setServerName(“localhost“);
????????????myODS.setDatabaseName(“ORCL“);
????????????myODS.setPortNumber(1521);
????????????myODS.setDriverType(“thin“);
????????????myODS.setUser(“admin“);
????????????myODS.setPassword(“helloworld“);
????3、创建一个Properties对象
????????????java.util.Properties myProperties=new Properties();
????4、将JNDI属性添加到Properties对象,使用setProperties方法将JNDI属性添加到
???????Properties对象。
????????????myProperties.setProperties(Context.INITIAL_CONTEXT_FACTORY,
????????????????“com.sun.jndi.fscontext.RefFSContextFactory“);
????????????myProperties.setProperties(Context.PROVIDER_URL,
????????????????“file:C:/TEMP“);
???????Context.INITIAL_CONTEXT_FACTORY-->该属性指定使用JNDI文件系统存储JNDI绑定信息文件。
???????Context.PROVIDER_URL------------->该属性指定文件系统中存储绑定文件的目录。
????5、创建一个JNDI Context对象
????????????Context myContext=new InitialContext(myProperties);
???????InitialContext构造器创建一个Context对象,这个对象引用最初的JNDI命名上下文。
????6、使用Context对象将OracleDataSource对象绑定到JNDI。这里使用Context对象的bind()方法。
???????bind()方法接受两个参数:一个是给JNDI对象起的名字,第二个是要绑定的Java对象。
????????????myContext.bind(“myNamedODS“,myODS);
????以上六个步骤做完,我们就可以在Context.PROVIDER_URL属性指定的目录中找到.bindings文件。
????这个.binding文件包含数据源的细节。以后,可以使用myNamedODS这个名称查找这个JNDI对象,
????并且使用它连接数据库。
二、一个实例程序(待续)??
import java.util.*;
import java.sql.*;
import oracle.jdbc.pool.*;
import javax.naming.*;
/**
?* <p>Title: </p>
?* <p>Description: </p>
?* <p>Copyright: Copyright (c) 2004</p>
?* <p>Company: </p>
?* @author not attributable
?* @version 1.0
?*/
public class JNDIExample1 {
? public JNDIExample1() {
? }
? public static void main(String[] args) throws SQLException,NamingException{
??? //第一步:生成一个OracleDataSource 对象
??? System.out.println("creating an OracleDataSource object");
??? OracleDataSource myODS=new OracleDataSource();
??? //第二步:对OracleDataSource对象的属性set值
??? System.out.println("Setting the attribute of the OracleDataSource object");
??? myODS.setServerName("localhost");
??? myODS.setDatabaseName("testDb");
??? myODS.setPortNumber(1521);
??? myODS.setDriverType("thin");
??? myODS.setUser("myUser");
??? myODS.setPassword("myPassword");
??? //第三步:生成一个properties对象
??? System.out.println("creating a Properties object");
??? Properties myProperties=new Properties();
??? //第四步:把JNDI的属性加到Properties对象里面
??? System.out.println("adding the JNDI properties");
??? myProperties.setProperty(Context.INITIAL_CONTEXT_FACTORY,
???????????????????????????? "com.sun.jndi.fscontext.RefFSContextFactory");
??? myProperties.setProperty(Context.PROVIDER_URL,"file:e:/JAVA/tmp");
??? //第五步:生成一个JNDI Context对象
??? System.out.println("creating a JNDI Context object");
??? Context myContext=new InitialContext(myProperties);
??? //第六步:把OracleDataSource数据源绑定到JNDI
??? System.out.println("binding the OracleDataSource object to JDNI "+
?????????????????????? "using the name 'myBoundODS'");
??? myContext.bind("myBoundODS",myODS);
? }
}
程序运行显示:
creating an OracleDataSource object
Setting the attribute of the OracleDataSource object
creating a Properties object
adding the JNDI properties
creating a JNDI Context object
binding the OracleDataSource object to JDNI using the name 'myBoundODS'
下面是一个在工作中实际的获取连接的方法两个例子
? ?第一个: 分两部分:一部分为连接sql server 的jtds ,一个是oracle的ojdbc
public static synchronized Connection borrowConnection(String dataname)
??????? throws SQLException
??? {
???try
???{
????if(null==dataname){dataname="default";}
????System.out.println("ConnectionManager.dataname="+dataname+"***************************");
????//对DataSource对象的属性set值
????String [] jdbclist={"jndi-name","servername","databasename","user-name","password","portNumber","driver-class"};
????sysinfo=fileInfo.getConfigIni(jdbclist,dataname);
????if((sysinfo.getProperty("driver-class").toLowerCase()).indexOf("jtds")>=0)
????{
?????JtdsDataSource ods=new JtdsDataSource();
?????ods.setServerName(sysinfo.getProperty("servername").trim());
?????ods.setDatabaseName(sysinfo.getProperty("databasename").trim());
?????ods.setUser(sysinfo.getProperty("user-name").trim());
?????ods.setPassword(sysinfo.getProperty("password").trim());???????
?????//将JNDI属性添加到Properties对象,使用setProperties方法将JNDI属性添加到Properties对象。
?????java.util.Properties env = new Properties ();
?????env.put (Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
?????//env.put (Context.PROVIDER_URL, "file:C:\\temp");
?????env.put (Context.PROVIDER_URL, "file:"+System.getProperty("user.dir"));
?????//生成一个JNDI Context对象
?????Context ctx = new InitialContext(env);
?????try
?????{
??????ds=(DataSource) ctx.lookup("ODS"+dataname);
??????
?????}
?????catch(NamingException ex)
?????{
??????try{
??????//把DataSource数据源绑定到JNDI
???????ctx.bind("ODS"+dataname,ods);
???????ds=(DataSource) ctx.lookup("ODS"+dataname);???????
??????}
??????catch(NamingException e)
??????{
???????errlogs.writeSyslog("ConnectionManager.borrowConnection(dataname):"+e.toString());
???????e.printStackTrace();
??????}
?????}
????}
????else if((sysinfo.getProperty("driver-class").toLowerCase()).indexOf("oracle")>=0)
????{
?????OracleDataSource ods = new OracleDataSource();
?????ods.setPortNumber(Integer.parseInt(sysinfo.getProperty("portNumber").trim()));
?????ods.setServerName(sysinfo.getProperty("servername").trim());
?????ods.setDatabaseName(sysinfo.getProperty("databasename").trim());
?????ods.setUser(sysinfo.getProperty("user-name").trim());
?????ods.setPassword(sysinfo.getProperty("password").trim());
?????//ods.setURL("jdbc:oracle:thin:@");
?????ods.setDriverType("thin");
?????ods.setNetworkProtocol("tcp");
?????//将JNDI属性添加到Properties对象,使用setProperties方法将JNDI属性添加到Properties对象。
?????java.util.Properties env = new Properties ();
?????env.put (Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
?????//env.put (Context.PROVIDER_URL, "file:C:\\temp");
?????//flt 002
?????//env.put (Context.PROVIDER_URL, "file:"+System.getProperty("user.dir"));
?????String dbFilePath = ClassLoaderUtil.getClassLoader().getResource("").toString();
?????env.put (Context.PROVIDER_URL,"file:"+dbFilePath.substring(6));
?????//生成一个JNDI Context对象
?????Context ctx = new InitialContext(env);
?????try
?????{
??????ds=(DataSource) ctx.lookup("ODS"+dataname);
?????}
?????catch(NamingException ex)
?????{
??????try{
??????//把DataSource数据源绑定到JNDI
???????ctx.bind("ODS"+dataname,ods);
???????ds=(DataSource) ctx.lookup("ODS"+dataname);
??????}
??????catch(NamingException e)
??????{
???????errlogs.writeSyslog("ConnectionManager.borrowConnection(dataname):"+e.toString());
???????e.printStackTrace();
??????}
?????}
????}
???//if(ds==null)
???//{
????
???//}
???Connection conn = ds.getConnection();
???return conn;
???/*env = new InitialContext();
???ds = (DataSource) env.lookup(dataname);
??????????? Connection conn = ds.getConnection();*/
???????????
??????? }
??????? catch(Exception e)
??????? {
???errlogs.writeSyslog("ConnectionManager.borrowConnection(dataname):"+e.toString());
??????????? e.printStackTrace();
??????? }
第二个:为dbcp连接池
?? static{
??ResourceBundle rb = ResourceBundle.getBundle("jdbc");
??try{??
??
??//数据库连接
??D_DRIVE = rb.getString("jdbc.driverClassName");
??D_URL = rb.getString("jdbc.url");
??D_USER = rb.getString("jdbc.username");
??D_PASSWORD = rb.getString("jdbc.password");
??D_MAX_ACTIVE = rb.getString("jdbc.maxActive");
??D_VALID_QUERY = rb.getString("jdbc.validQuery");
??bds = new BasicDataSource();
??//bds.setMaxActive(50);??
??bds.setRemoveAbandonedTimeout(100);
??bds.setDriverClassName(D_DRIVE);
??bds.setUrl(D_URL);
??bds.setLogAbandoned(true);
??bds.setRemoveAbandoned(true);
??bds.setMaxWait(6000);
??bds.setDefaultAutoCommit(true);
??bds.setDefaultReadOnly(true);
??if (D_VALID_QUERY != null && !D_VALID_QUERY.trim().equals(""))
???bds.setValidationQuery(D_VALID_QUERY);
??bds.setUsername(D_USER);
??bds.setPassword(D_PASSWORD);
??}
??catch(Exception ex)
??{
???ex.printStackTrace();
??}
??try {
???bds.setMaxActive(Integer.valueOf(D_MAX_ACTIVE).intValue());??
??} catch (Exception e) {
???e.printStackTrace();
???bds.setMaxActive(80);
??}
?}
?