Oracle的jdbc驱动三种主要分类:
1、JDBC OCI: oci是oracle call interface的缩写,此驱动类似于传统的ODBC 驱动。因为它需要Oracle Call Interface and Net8,所以它需要在运行使用此驱动的JAVA程序的机器上安装客户端软件,其实主要是用到orcale客户端里以dll方式提供的oci和服务器配置。
2、JDBC Thin: thin是for thin client的意思,这种驱动一般用在运行在WEB浏览器中的JAVA程序。它不是通过OCI or Net8,而是通过Java sockets进行通信,是纯java实现的驱动,因此不需要在使用JDBC Thin的客户端机器上安装orcale客户端软件,所以有很好的移植性,通常用在web开发中。
3、JDBC KPRB: 这种驱动由直接存储在数据库中的JAVA程序使用,如Java Stored Procedures 、triggers、Database JSP's。因为是在服务器内部使用,他使用默认或当前的会话连接来访数据库,不需要用户名密码等,也不需要数据库url。
一.JDBC 连接Oracle 说明
JDBC 的应用连接Oracle 遇到问题,错误如下:
ORA-12505,TNS:listener does not currently know of SID given in connect descriptor TheConnection descriptor used by the client was。
我在DB 层面配置了静态注册,并且GLOBAL_DBNAME和SID_NAME 不一样,以往的配置都是一样的,所以没有发现这个问题。
1
2
3
4
5
|
(SID_DESC = (GLOBAL_DBNAME = dave) (ORACLE_HOME =D:\app\Administrator\product\11.2.0\dbhome_1) (SID_NAME = NEWCCS) ) |
Oracle Listener 动态注册 与 静态注册
//www.zzvips.com/article/75885.htm
在网上google 了一下,发现JDBC Thin Driver 的formats 有三种格式:
格式一: Oracle JDBC Thin using a ServiceName:
jdbc:oracle:thin:@//<host>:<port>/<service_name>
Example: jdbc:oracle:thin:@//192.168.2.1:1521/XE
注意这里的格式,@后面有//, 这是与使用SID的主要区别。
这种格式是Oracle 推荐的格式,因为对于集群来说,每个节点的SID 是不一样的,但是SERVICE_NAME 确可以包含所有节点。
格式二: Oracle JDBC Thin using an SID:
jdbc:oracle:thin:@<host>:<port>:<SID>
Example: jdbc:oracle:thin:192.168.2.1:1521:X01A
Note: Support for SID is being phased out. Oracle recommends that users switch over to usingservice names.
格式三:Oracle JDBC Thin using a TNSName:
jdbc:oracle:thin:@<TNSName>
Example: jdbc:oracle:thin:@GL
Note:
Support for TNSNames was added in the driver release 10.2.0.1
二.测试
2.1 准备工作:
Oracle 是11gR2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
Listener.ora SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = dave) (ORACLE_HOME =D:\app\Administrator\product\11.2.0\dbhome_1) (SID_NAME = NEWCCS) ) ) Tnsnames.ora DVD = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = dave) ) ) |
2.2 测试1,使用SID:newccs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
.imporjava.sql.* .publiclasjdb StrindbUr "jdbc:oracle:thin:@...::newccs" StrintheUse "dave" StrintheP "dave" Connectionull Statemenconn ResultSernull publijdbc( tr Class.forName( "oracle.jdbc.driver.OracleDriver" ).newInstance() DriverManager.getConnection(dbUrltheUserthePw) conc.createStatement() catc(Exceptioe e.printStackTrace() publibooleaexecuteUpdate(Strinsql tr conn.executeUpdate(sql) returtrue catc(SQLExceptioe e.printStackTrace() returfalse publiResultSeexecuteQuery(Strinsql rnull tr rconn.executeQuery(sql) catc(SQLExceptioe e.printStackTrace() returrs publivoiclose( tr conn. close () c. close () catc(Exceptioe e.printStackTrace() publistativoimain(String[args ResultSers jdbconnejdbc() rconn.executeQuery( "selecfrodavwherrownum<" ) tr whil(rs. next () System. out .println(rs.getString( "username" )+ "--" +rs.getString( "user_id" )) catc(Exceptioe e.printStackTrace() . . ---输出正常 .MGMT_VIEW -- .ANQING -- .DVD -- .SYSMAN -- |
2.3 使用 service_name:dave
将2.2 节的dbUrl 改成如下:
1
|
String dbUrl = "jdbc:oracle:thin:@//127.0.0.1:1521/dave" ; |
输出结果:
MGMT_VIEW--97
ANQING--94
DVD--93
SYSMAN--95
如果在11g里遇到如下错误:
测试运行Java 类,报错:
java.sql.SQLException: The Network Adapter could not establish the connection
可以尝试更换对应的 jdbc connection driver,官网的说明如下:
JDBC Thin Driver 11g Causes"Java.Sql.Sqlexception: Io Exception: The Network Adapter Could NotEstablish The Connection" While Connecting to Oracle Database 11g [ID947653.1]
Change the JDBC connection driver class inyour application server from:
oracle.jdbc.driver.OracleDriver
to
oracle.jdbc.OracleDriver
2.4 使用TNS name: dvd
String dbUrl = "jdbc:oracle:thin:@dvd";
报错如下:
java.sql.SQLException: Unknown host specified
该问题是因为JVM 没有oracle.net.tns_admin的system property。
解决方法有2种:
方法一:在启动VM 时添加如下参数:
-Doracle.net.tns_admin=D:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN
方法二:在java 代码里添加:
1
|
System.setProperty( "oracle.net.tns_admin" , "D:\\app\\Administrator\\product\\11.2.0\\dbhome_1\\NETWORK\\ADMIN" ); |
添加之后,就可以正常在JDBC中使用tnsnama了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
.imporjava.sql. .publiclasjd StrindbUr"jdbc:oracle:thin: @dvd .StrindbUr"jdbc:oracle:thin:@ //...:/dave .StrindbUr"jdbc:oracle:thin:@...::newccs StrintheUse"dave StrintheP"dave Connectionul Statemencon ResultSernul publijdbc t System.setProperty( "oracle.net.tns_admin" , "D:\\app\\Administrator\\product\\..\\dbhome_\\NETWORK\\ADMIN" Class.forName( "oracle.jdbc.driver.OracleDriver" ).newInstance( ./Class.forName( "oracle.jdbc.OracleDriver" ).newInstance( DriverManager.getConnection(dbUrltheUserthePw conc.createStatement( catc(Exceptio e.printStackTrace( publibooleaexecuteUpdate(Strinsq t conn.executeUpdate(sql returtru catc(SQLExceptio e.printStackTrace( returfals publiResultSeexecuteQuery(Strinsq rnul t rconn.executeQuery(sql catc(SQLExceptio e.printStackTrace( returr publivoiclose t conn.close( c.close( catc(Exceptio e.printStackTrace( publistativoimain(String[arg ResultSer jdbconnejdbc( rconn.executeQuery( "selecfrodavwherrownum<" t whil(rs.next( System.out.println(rs.getString( "username" )+ "--" +rs.getString( "user_id" ) catc(Exceptio e.printStackTrace( |
下面给大家分享一段代码关于Java中通过jdbc(thin方式)连接Oracle数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
package com.jdbc.OracleTest; import java.sql.DriverManager; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class OracleJdbcConnectionTest { /** * by jarin 年月日 * @param args */ public static void main(String[] args) { try { //第一步要Jar包:在oracle安装的目录下,盘符:\oracle\ora\jdbc\lib\ojdbc.jar //加载驱动 Class.forName( "oracle.jdbc.driver.OracleDriver" ); //连接字符串(协议名:jdbc,子协议名: oracle:thin 子名称:@localhost::oracleDB) String url = "jdbc:oracle:thin:@localhost::ora" ; try { //建立连接 Connection conn = DriverManager.getConnection(url, "scott" , "" ); //创建Statement或者是PreparedStatement语句 Statement st = conn.createStatement(); String sqlStr= "select ename from emp" ; //执行查询 ResultSet rs = st.executeQuery(sqlStr); //遍历结果 while (rs.next()) { System.out.println(rs.getString()); } } catch (SQLException e) { e.printStackTrace(); } } catch (ClassNotFoundException e) { e.printStackTrace(); } } } |