`
Vicent_Lee
  • 浏览: 55155 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

Oracle数据库的连接(OCI方式、thin方式和JdbcOdbc桥方式)

阅读更多

这篇文章是在网上摘的、以前面试的时候问过我这样的问题“说说为什么通过thin方式连接数据库”,今天搜索的时候偶然间发现了、就摘下来了、以后好看看
在J2EE应用程序开发中,应用程序与数据库连接的建立是我们经常遇到的问题之一。在这里我主要谈谈在本地应用程序中通过OCI方式、thin方式和JdbcOdbc桥方式连接Oracle数据库,在iPlanet Application Server 6.5和Sun Java System Application Server 7中对Oracle数据库连接池的配置以及应用中如何从连接池中获得连接 

一、本地通过JDBC获得Oracle数据库连接 

通过JDBC获得Oracle数据库连接,有三种方式:OCI方式、thin方式和JdbcOdbc桥方式。OCI方式依赖于本地的动态链接库,如果在本地安装了Oracle数据库客户端可以采用该方式;而thin方式为纯java的数据库连接方式;JdbcOdbc桥方式依赖于本地ODBC数据库源的配置,这种方式一般不太被采用。 

1、OCI方式 

先在本地安装Oracle客户端,安装完之后,在安装的路径中可以找到…/jdbc/lib/classes12.zip文件,我们在环境变量classpath中设置classes12.zip所在的路径。 

然后通过以下的数据库连接类,在本地通过OCI方式获得Oracle数据库连接 

/** 
* 在本地获得数据库连接 
*/ 

package com.j2ee.db; 

import java.util.*; 
import java.sql.*; 
import javax.sql.*; 
import java.io.*; 
import oracle.jdbc.driver.*; 
import javax.naming.*; 

/** 
* 通过OCI方式获得Oracle数据库连接 
*/ 
public class DbConnection 
{ 
final static String sDBDriver = "oracle.jdbc.driver.OracleDriver"; 
final static String sConnStr = "jdbc:oracle:oci8:sr/sr@ora199"; 

/** 
* 
*/ 
public DbConnection() 
{ 
} 

/** 
* 获得Oracle数据库连接 
*/ 
public java.sql.Connection connectDbByOci() 
{ 
java.sql.Connection conn=null; 
try 
{ 
Class.forName(sDBDriver); 
conn = DriverManager.getConnection(sConnStr); 
} 
catch (Exception e) 
{ 
System.out.println("ERROR:"+e.getMessage()); 
} 
return conn; 
} 
} 
在连接字符串 "jdbc:oracle:oci8:sr/sr@ora199" 中,"sr/sr"为Oracle用户的用户名和口令,"ora199"为数据库服务名。 

2、thin方式 

先到Oracle技术网(http://otn.oracle.com/global/cn/software/tech/java/sqlj_jdbc/index.html)下载Oracle JDBC Drivers,同样地将下载后的zip文件的路径设置在环境变量classpath。 

然后通过以下的数据库连接类,在本地通过thin方式获得Oracle数据库连接。 

/** 
* 在本地获得数据库连接 
*/ 

package com.j2ee.db; 

import java.util.*; 
import java.sql.*; 
import javax.sql.*; 
import java.io.*; 
import oracle.jdbc.driver.*; 
import javax.naming.*; 

/** 
* 通过thin方式获得Oracle数据库连接 
*/ 
public class DbConnection 
{ 
private String sConnStr = ""; 

/** 
* 缺省构造器 
*/ 
public DbConnection() 
{ 
sConnStr = "jdbc:oracle:thin:@10.1.4.199:1521:ora199"; 
} 

/** 
* @param ip,serviceName 
*/ 
public DbConnection(String ip,String serviceName) 
{ 
sConnStr = "jdbc:oracle:thin:@"+ip+":1521:"+serviceName; 
} 

/** 
* 通过thin方式获得Oracle数据库的连接. 
*/ 
public java.sql.Connection connectDbByThin() 
{ 
java.sql.Connection conn=null; 
try 
{ 
Class.forName(sDBDriver); 
conn = DriverManager.getConnection(sConnStr,"sr","sr"); 
} 
catch (Exception e) 
{ 
System.out.println("ERROR:"+e.getMessage()); 
} 
return conn; 
} 

/**

* 通过thin方式获得Oracle数据库的连接. 
* @param userId,password 
*/ 
public java.sql.Connection connectByJdbc(String userId,String password) 
{ 
java.sql.Connection conn=null; 
try 
{ 
Class.forName(sDBDriver); 
conn = DriverManager.getConnection(sConnStr,userId,password); 
} 
catch (Exception e) 
{ 
System.out.println("ERROR:"+e.getMessage()); 
} 
return conn; 
} 
} 
这种方式运用起来比较灵活,简单,具有较强的移植性和适用性。只要注意连接字符串"jdbc:oracle:thin:@10.1.4.199:1521:ora199"中具体参数的设置即可 

3、JdbcOdbc桥方式 

先通过管理工具中的数据源来添加本地对Oracle数据库的连接,然后通过以下的数据库连接类,在本地通过JdbcOdbc桥方式获得Oracle数据库连接。 

/** 
* 在本地获得数据库连接 
*/ 

package com.j2ee.db; 

import java.util.*; 
import java.sql.*; 
import javax.sql.*; 
import java.io.*; 
import oracle.jdbc.driver.*; 
import javax.naming.*; 

/** 
* 通过JdbcOdbc桥方式获得Oracle数据库连接 
*/ 
public class DbConnection 
{ 
/** 
* 
*/ 
public DbConnection() 
{ 
} 

/** 
* 获得Oracle数据库连接 
*/ 
public java.sql.Connection connectDbByJdbcOdbcBridge() 
{ 
java.sql.Connection conn=null; 
try 
{ 
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
con=DriverManager.getConnection("jdbc:odbc:ora199","sr","sr"); 
} 
catch (Exception e) 
{ 
System.out.println("ERROR:"+e.getMessage()); 
} 
return conn; 
} 
} 
在getConnection方法中第一个参数"jdbc:odbc:ora199" 中的"ora199"为本地ODBC数据源的数据源名称,第二个参数和第三个参数分别为Oracle的用户名和口令。 

二、通过连接池获得Oracle数据库连接 

这部分主要讲述在iPlanet Application Server 6.5和Sun Java System Application Server 7中Oracle数据库连接池的配置,以及在应用中如何通过连接池获得数据库的连接。 

1、iPlanet Application Server 6.5连接池的配置 

先打开iPlanet Application Server 6.5的管理控制台,选中"database"面板,再选择"External JDBC Drivers"选项后,点击"Add…"按钮,在弹出的对话框中,添加一个名为"ora-type4"的JDBC Driver。 


Driver Classpath:该参数填写classes12.zip文件的物理路径。 

然后在"External JDBC DataSources"中选择"Add…",在弹出的对话框中添加一个JNDI名称为"credit2"的数据源。 


DriverType:选择刚添加好的"ora-type4"; 

Datasource:ora199,为Oracle数据库服务名; 

Datasource:ora199,为Oracle数据库服务名; 

Connection Pool Parameters:图中显示的是缺省设置,可以根据自己环境情况来更改这些设置。

保存完设置后,在"DataSource Selection Box"中,选择刚添加的"credit2"数据源,再选择"Vendor Specific Properties"按钮。在对话中添加一个URL属性。 


至此,iPlanet Application Server 6.5中的数据库连接池配置完毕,重起服务使之生效。 

2、Sun Java System Application Server 7连接池的配置 

在配置之前将classes12.zip文件置于…/server1/lib目录下。通过浏览器的4848端口打开Sun Java System Application Server 7的管理界面,选择"server1"->"JDBC"-> "Connection Pools"下的"New…" 


添加一个名称为"MyConnectionPool"的Oracle数据库连接池。"Next"下一步。 


在"General"中填写"Datasource Classname"。 


在"Properties"中将不需要的属性删除,同时添加"URL"属性。 

"dataSourceName"中填写Oracle数据库服务名。 

以下连接池的缺省设置,可以根据自己环境的情况作相应的调整。

选择"Finish"完成连接池的设置。 

下一步为"MyConnectionPool"连接池创建一个JNDI,以便应用程序能够通过该名称获得连接池中的连接。 "server1"->"JDBC"-> "JDBC Resources"下的"New…" 


至此,Sun Java System Application Server7中的数据库连接池配置完毕,重起服务使之生效。 

3、通过连接池获得连接 

以上在iPlanet Application Server 6.5和Sun Java System Application Server7中配置的连接池都可以通过以下的数据库连接类,从连接池中获得Oracle数据库连接。 

/** 
* 从连接池中获得数据库连接 
*/ 

package com.j2ee.db; 

import java.util.*; 
import java.sql.*; 
import javax.sql.*; 
import java.io.*; 
import oracle.jdbc.driver.*; 
import javax.naming.*; 

/** 
* 通过连接池方式获得Oracle数据库连接 
*/ 
public class DbConnection 
{ 
/** 
* 
*/ 
public DbConnection() 
{ 
} 

/** 
* 获得Oracle数据库连接 
*/ 
public java.sql.Connection connectDbByConnectionPool() 
{ 
java.sql.Connection conn=null; 
try 
{ 
Context ctx = new InitialContext(); 
DataSource ds = (DataSource)ctx.lookup("jdbc/credit2"); 
conn=ds.getConnection(); 
} 
catch (Exception e) 
{ 
System.out.println("ERROR:"+e.getMessage()); 
} 
return conn; 
} 
} 
4、使用连接池的优点使用连接池的优点主要体现在两个方面:对数据库的连接统一进行配置、管理、监控,以及对数据库连接池的参数进行优化调整,
同时对应用中没有关闭或其他原因造成没有关闭的数据库连接由连接池统一进行管理。便于应用的移植和后端数据库的切换,
因为在应用中通过统一的JNDI获得数据库的连接,而具体连接的是哪一台机器上的数据库与应用无关
 
分享到:
评论
2 楼 fengchufu 2011-09-29  
学习了。。。
1 楼 Vicent_Lee 2011-04-26  
thin是一种瘦客户端的连接方式,即采用这种连接方式不需要安装oracle客户端,只要求classpath中包含jdbc驱动的jar包就行。thin就是纯粹用Java写的ORACLE数据库访问接口。
oci是一种胖客户端的连接方式,即采用这种连接方式需要安装oracle客户端。oci是Oracle Call Interface的首字母缩写,是ORACLE公司提供了访问接口,就是使用Java来调用本机的Oracle客户端,然后再访问数据库,优点是速度 快,但是需要安装和配置数据库。
     从相关资料可以总结出以下几点:
1. 从使用上来说,oci必须在客户机上安装oracle客户端或才能连接,而thin就不需要,因此从使用上来讲thin还是更加方便,这也是thin比较常见的原因。
2. 原理上来看,thin是纯java实现tcp/ip的c/s通讯;而oci方式,客户端通过native java method调用c library访问服务端,而这个c library就是oci(oracle called interface),因此这个oci总是需要随着oracle客户端安装(从oracle10.1.0开始,单独提供OCI Instant Client,不用再完整的安装client)
3. 它们分别是不同的驱动类别,oci是二类驱动, thin是四类驱动,但它们在功能上并无差异。



    从使用thin驱动切换到oci驱动在配置来说很简单,只需把连接字符串java:oracle:thin:@hostip:1521:实例名换为java:oracle:oci@本地服务名即可。如:从  
jdbc:oracle:thin:@10.1.1.2:1521:shdb  
改成  
jdbc:oracle:oci8:@shdb  
但 这里这台机需安装oracle数据库的客户端并配置本地服务名,同时还需指定NLS_LANG环境变量,NLS_LANG环境变量是用来控制客户端在显示 oracle数据库的数据时所用的字符集和本地化习惯。通常把NLS_LANG的字符集部分指定为数据库所用的字符集则就不会存在java显示的乱码问题 了。  
对于oracle数据库客户端的安装,有二种选择,一是老实的用oracle数据库的安装光盘安装对应版本的oracle客户端。二是下载oracle提从的即时客户端,即时客户端是不用安装的,把下载包解压即可。  
要使java web正常的通过oci驱动访问oracle,还需要客户端正确的配置一下相关变量。主要如下:  
对于windows系统并使用oracle客户端时:  
1. 把%ORACLE_HOME%lib加到PATH环境变量.  
2. 把%ORACLE_HOME%jdbclibclasses12.jar加到CLASSPATH环境变量里.也可以把classes12.jar拷贝到tomcat的commanlib目录下。  
对于windows系统并使用oracle的即时客户端时(假定即时客户端解压在d盘):  
1. 把d:instantclient_10_2加到PATH环境变量  
2. 把d:instantclient_10_2classes12.jar加到CLASSPATH环境变量里.也可以把classes12.jar拷贝到tomcat的commanlib目录下。  


对于Linux系统并使用oracle客户端时:  
1. 在使用tomcat的用户主目录下的.bash_profile文件中加入  
exprot ORACLE_HOME=/u01/app/oracle/prodUCt/9.2.0.4  
export LD_LIBRARY_PATH=$ORACLE_HOME/lib  
2. 把classes12.jar拷贝到tomcat的commanlib目录下。

  
对于linux系统并使用oracle即时客户端时:  
1. 在使用tomcat的用户主目录下的.bash_profile文件中加入  
exprot ORACLE_HOME=/instantclient_10_2  
export LD_LIBRARY_PATH=$ORACLE_HOME/lib  
2. 把instantclient_10_2目录下的classes12.jar拷贝到tomcat的commanlib目录下。

  
假如一个tomcat下带了几个应用,且几个应用都要连接oracle数据库时,则要注重的时,不要在每个应用的WEB- INF/lib目录下放入oracle的classes12.jar/zip文件。而应该把classes12.jar/zip文件放到tomcat的 common/lib目录下。否则会出来ojdbclib9/10库重复加载的错误。  

    使用oracle即时客户端是,本地服务名的建立可以在目录instantclient_10_2下建立tnsnames.ora下添加连接串,如:  

SHDB =(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.236)(PORT = 1521)))  (CONNECT_DATA =(SERVICE_NAME = shdb)))即可。

相关推荐

Global site tag (gtag.js) - Google Analytics