`
liu_shui8
  • 浏览: 67989 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

解析oracle配置文件tnsnames.ora

阅读更多
package decrypt;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import ca.beq.util.win32.registry.RegistryKey;
import ca.beq.util.win32.registry.RegistryValue;
import ca.beq.util.win32.registry.RootKey;

public class TNSNamesReader {
	/**
	 * 得到ORACLE_HOME 此处用到一个第三方组件:jRegistryKey
	 * @return
	 * @author zhangzongwang Dec 22,2009
	 */
	public String getOracleHome() {
		String ORACLE_HOME = "";
		RegistryKey r = new RegistryKey(RootKey.HKEY_LOCAL_MACHINE,
				"SOFTWARE\\ORACLE");
		if (r.hasValue("ORACLE_HOME")) {
			RegistryValue v = r.getValue("ORACLE_HOME");
			ORACLE_HOME = v.getStringValue();
		}
		return ORACLE_HOME;
	}
	/**
	 * 得到tnsnames.ora路径
	 * @param OracleHome
	 * @return
	 * @author zhangzongwang Dec 22,2009
	 */
	public String getTNSNAMESPath(String OracleHome) {
		String oracleHomePath = this.getOracleHome();
		String tnsNamesOraFilePath = "";
		if (!oracleHomePath.equals("")) {
			tnsNamesOraFilePath = oracleHomePath
					+ "\\NETWORK\\ADMIN\\TNSNAMES.ORA";
			if (!(new File(tnsNamesOraFilePath).exists())) {
				tnsNamesOraFilePath = oracleHomePath
						+ "\\NET80\\ADMIN\\TNSNAMES.ORA";
			}
		}
		return tnsNamesOraFilePath;
	}
	/**
	 * 得到tnsnames.ora文件所有内容
	 * @param strTNSNAMESPath
	 * @return
	 * @author zhangzongwang Dec 22,2009
	 */
	public String getTNSNamesStr(String strTNSNAMESPath) {
		String output = ")";
		String fileLine;
		InputStream in = null;
		BufferedReader sr = null;
		try {
			in = new FileInputStream(strTNSNAMESPath);
			sr = new BufferedReader(new InputStreamReader(in));
			while ((fileLine = sr.readLine()) != null) {
				if (fileLine.length() > 0 && fileLine.indexOf("#") == -1) {
					output += fileLine.trim();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				sr.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		output = output.replaceAll(" ", "").toLowerCase();
		return output;
	}
	/**
	 * 解析
	 * @return
	 * @author zhangzongwang Dec 22,2009
	 */
	public List<Map<String, String>> loadTNSNames() {
		String OracleHome = this.getOracleHome();
		String tNSNamesStr = this.getTNSNamesStr(this
				.getTNSNAMESPath(OracleHome));
		Pattern ptn = Pattern
				.compile("(\\)\\w+|host|port|service_name)\\=(\\(|\\d+\\.\\d+\\.\\d+\\.\\d+|\\d+|\\w+)");
		Matcher match = ptn.matcher(tNSNamesStr);
		int start = 0;
		int i = 0;
		Map<String, String> map = new LinkedHashMap<String, String>();
		List<Map<String, String>> list = new ArrayList<Map<String, String>>();
		while (match.find(start)) {
			String str = tNSNamesStr.substring(match.start(), match.end())
					.replace(")", "");
			String[] strs = str.split("=");
			if ("(".equals(strs[1])) {
				if (i != 0) {
					list.add(map);
					map = new LinkedHashMap<String, String>();
				}
				map.put("sid", strs[0]);
			} else {
				if (map.containsKey(strs[0])) {
					map.put(strs[0] + "1", strs[1]);
				} else {
					map.put(strs[0], strs[1]);
				}
			}
			start = match.end();
			i++;
		}
		list.add(map);
		return list;
	}
	/**
	 * 只要SID
	 * @return
	 * @author zhangzongwang Dec 22,2009
	 */
	public String[] loadTNSNameSID(){
		List<Map<String, String>> list = this.loadTNSNames();
		List<String> tsnNameSID = new ArrayList<String>();
	     for(Map<String,String> mp : list){	    	 
	    	 Set<String> set = mp.keySet();
	    	 Iterator<String> it = set.iterator();
	    	 while(it.hasNext()){
	    		 String key = it.next().toString();
	    		 String value = mp.get(key).toString();
	    		 if("sid".equals(key)){
	    			 tsnNameSID.add(value.toUpperCase());
	    		 }
	    	 }
	     }
	    String[] str = new String[tsnNameSID.size()];
		return tsnNameSID.toArray(str);
	}
}

分享到:
评论
2 楼 microjuz 2011-05-06  
嗯,并不是第一个sid读不出,而是如果sid里面包含 '.' 的话,解析不出。我把表达式改成: "(\\)\\w+\\.\\w+|\\)\\w+|host|port|service_name)\\=(\\(|\\d+\\.\\d+\\.\\d+\\.\\d+|\\d+|\\w+)"

不知道合不合适。
1 楼 microjuz 2011-05-06  
有bug,第一个sid读取不出

相关推荐

    认识oracle中的sqlnet.ora tnsnames.ora listener.ora三个文件

    ### 认识Oracle中的sqlnet.ora、tnsnames.ora与listener.ora三个关键配置文件 #### 一、概述 在Oracle安装过程中,我们常常会在安装目录下的`$HOME/network/admin`文件夹中发现三个重要的配置文件:`sqlnet.ora`、...

    tnsnames.ora配置

    【tnsnames.ora配置】是Oracle数据库网络配置中的一个重要组成部分,主要负责将易于记忆的TNS名称映射到实际的主机名或IP地址以及相关的服务信息。tnsnames.ora文件通常位于$ORACLE_HOME/network/admin目录下,与...

    oracle网络配置 tnsnames.ora

    本文将详细介绍`listener.ora`、`sqlnet.ora`、`tnsnames.ora`这三个核心配置文件的作用及其配置方法。 #### 1. `sqlnet.ora` 文件 `sqlnet.ora`文件的作用类似于Linux或其他Unix系统中的`nsswitch.conf`文件,它...

    Oracle的tnsnames.ora配置(PLSQL Developer)

    其中,`tnsnames.ora`是Oracle客户端用于存储连接描述符的重要配置文件之一。本文将详细介绍如何配置Oracle的`tnsnames.ora`文件,尤其是在使用PL/SQL Developer工具时的相关步骤。 #### 一、系统环境变量的配置 1...

    如何正确oracle配置tnsname.ora文件

    Oracle 配置 TNSNAMES.ORA 文件详解 oracle 配置 TNSNAMES.ORA 文件是 Oracle 网络配置的关键步骤。正确配置 TNSNAMES.ORA 文件可以确保 Oracle 客户端与服务器端之间的顺畅连接。本文将详细介绍如何正确配置 ...

    listener.ora sqlnet.ora tnsnames.ora文件详解

    `listener.ora` 文件是Oracle数据库系统中至关重要的网络配置文件之一,它负责管理数据库的监听器服务,确保外部应用程序能够通过网络访问到Oracle数据库。监听器的主要职责是接收远程请求并将这些请求分发到正确的...

    Listener.ora、sqlnet.ora、tnsnames.ora三个配置文件区别.docx

    Listener.ora、sqlnet.ora、tnsnames.ora三个配置文件是Oracle数据库中三个重要的配置文件,每个文件都有其特定的作用和用途。 首先,Listener.ora文件是用于配置Oracle listener的。Listener是 Oracle数据库的监听...

    oracle中的sqlnet.ora+tnsnames.ora+listener.ora

    例如,`NAMES.DIRECTORY_PATH=(TNSNAMES, ONAMES, HOSTNAME)`表示首先使用`tnsnames.ora`中的别名配置进行连接尝试,如果失败则依次尝试使用Oracle Name Server (ONAMES) 和主机名 (HOSTNAME) 进行解析。 **3\. SQL...

    oracle配置文件tnsname

    ### Oracle配置文件详解:tnsnames.ora, listener.ora, sqlnet.ora #### 一、概述 在Oracle数据库的网络配置中,有三个重要的配置文件:`listener.ora`、`sqlnet.ora` 和 `tnsnames.ora`。这些文件位于 `$ORACLE_...

    浅析如何在tnsnames.ora中配置监听

    同时,修改完配置文件后,通常需要重启监听器服务以使配置生效。 7. Oracle提供的网络配置工具,如Net Manager或命令行工具Lsnrctl,可以帮助管理员更方便地配置和管理tnsnames.ora文件及其监听器,包括启动、停止...

    Oracle11goci.dll.zip

    3. 配置环境变量TNS_ADMIN,指向tnsnames.ora文件所在的目录,tnsnames.ora文件定义了数据库连接的详细信息。 4. 重启Navicat for Oracle,尝试重新连接Oracle11g数据库。 "IT猫扑网_百度搜索.url"和"IT猫扑网.url...

    SQL空间查询ST_Geometry配置

    2. **环境变量一致性**:在配置文件中指定的所有环境变量必须保持一致。 3. **监听文件的一致性**:`listener.ora`和`tnsnames.ora`文件中的配置需要相互匹配。 4. **操作系统差异**:根据操作系统选择正确的类库...

    workshop scenarios oracle

    根据提供的文档内容,我们可以归纳出一系列与Oracle 9i数据库管理相关的网络工作坊场景案例,这些案例主要聚焦于解决配置文件中的常见问题,包括TNSNAMES.ORA、LISTENER.ORA以及SQLNET.ORA等文件中的错误。...

    Oracle 11gr2连Oracle 19c 报ORA-28040 ORA-01017解决方法.pdf

    在Oracle 19c的配置文件中,有三个主要的配置文件需要注意:listener.ora、sqlnet.ora和tnsnames.ora。这些文件定义了Oracle数据库服务端的监听器配置、网络访问和服务名称解析设置。 - **listener.ora**文件配置了...

    Oracle命名方法配置

    本文将深入解析Oracle命名方法配置的核心要点,帮助读者理解并掌握这一重要技术。 #### 1. Oracle命名方法概览 Oracle命名方法(Name Resolution Methods)用于指定如何解析数据库实例的网络地址,使客户端能够...

    Oracle_TNS浅析.doc

    - **listener.ora**: 监听器配置文件,用于定义监听器的服务地址、端口和协议。 - **tnsnames.ora**: 定义了客户端如何连接到服务器上的数据库实例。 - **sqlnet.ora**: 用于配置安全性和网络参数。 - **lsnrctl.ora...

    Oracle的网络三大配置文件

    ### Oracle的网络三大配置文件详解 #### 一、概述 Oracle数据库系统为了支持客户端与服务器之间的通信,设计了一套完整的网络配置方案。其中最核心的三个配置文件是`listener.ora`、`sqlnet.ora`和`tnsnames.ora`...

    Oracle监听配置及访问方式完全解析[参考].pdf

    本文将深入解析Oracle监听器的配置文件以及不同的访问方式。 首先,Oracle网络配置涉及三个主要文件:`listener.ora`、`sqlnet.ora`和`tnsnames.ora`,它们均位于`$ORACLE_HOME\network\admin`目录下。 1. `sql...

    Oracle网络配置上机练习.doc

    9. **检查tnsnames.ora文件**:最后检查`tnsnames.ora`文件中对应服务名的配置信息是否已正确添加。 #### 二、添加监听程序 **知识点概述**: - **监听程序配置**:通过修改`listener.ora`文件来设置监听器的信息...

Global site tag (gtag.js) - Google Analytics