sql plu可以連線,但是使用jdbc連線oracle的時候報資料庫的錯誤ora-12505:監聽程式當前無法識別連線描述符中所給出的sid
這個是由於oracle的service_name 和sid_name不一致,而pl/sql developer和sqlplus 採用service_name進行連線,而應用程式是按照sid_name進行連線,所以出現pl/sql developer和sqlplus 能夠連線而應用程式卻無法連線的問題。
1.查詢sid名:借助oracle的sqlplus工具並以管理員方式連線敲命令檢視:select instance_name from v$instance;必須是管理員身份,否則「檢視不存在」。
2.開啟資料庫例項的目錄,例如:d:\oracle\software\product\11.2.0\dbhome_1\network\admin
找到listener.ora檔案(listener***程序的配置檔案),使用文字編輯器開啟。
3.開啟後
# listener.ora network configuration file: d:\oracle
\software
\product\11.2.0\dbhome_1\network
\admin
\listener.ora
# generated by oracle configuration tools.
sid_list_listener =
(sid_list =
(sid_desc =
(sid_name = clrextproc)
(oracle_home = d:\oracle
\software
\product\11.2.0\dbhome_1)
(program = extproc)
(envs = "extproc_dlls=only:d:\oracle
\software
\product\11.2.0\dbhome_1\bin
\oraclr11.dll")
)#這一段是需要增加的,global_dbname和sid_name用查到的sid,oracle_home與上面該檔案的保持一致。
(sid_desc =
(global_dbname = orcl)
(oracle_home = d:\oracle
\software
\product\11.2.0\dbhome_1)
(sid_name = orcl)
) )listener =
(description_list =
(description =
(address = (protocol = ipc)(key = extproc1521))
(address = (protocol = tcp)(host = kws-pc)(port = 1521))
))adr_base_listener = d:\oracle
\software
4.jdbc連線資料庫
connection conn=null;
try catch (classnotfoundexception e) catch (sqlexception e)
} //關閉連線
public
static
void
close(preparedstatement pstmt) catch (sqlexception e)
} }
public
static
void
close(resultset rs) catch (sqlexception e)
} }
public
static
void
close(connection con) catch (sqlexception e)
} }
//資料庫操作
string sql="insert into t_user(user_id,user_name,time)values(?,?,?)"; //?為引數佔位符
preparedstatement pstmt=null; //通常利用preparedstatement進行操作,效能得到優化
trycatch(sqlexception e)finally
//如果是查詢的話對resultset的處理
if(rs.next())
jdbc連線oracle
格式一: oracle jdbc thin using a servicename:
jdbc:oracle:thin:@//:/
example: jdbc:oracle:thin:@
注意這裡的格式,@後面有//, 這是與使用sid的主要區別。
這種格式是oracle 推薦的格式,因為對於集群來說,每個節點的sid 是不一樣的,但是service_name 確可以包含所有節點。
格式二: oracle jdbc thin using an sid:
jdbc:oracle:thin:@::
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:@
example: jdbc:oracle:thin:@gl
note:
support for tnsnames was added in the driver release 10.2.0.1
關於sid和service name
可以這樣理解:乙個公司比喻成一台伺服器,資料庫是這個公司中的乙個部門。
1、sid:乙個資料庫可以有多個例項(如rac),sid是用來標識這個資料庫內部每個例項的名字,
就好像乙個部門裡,每個人都有乙個自己的名字。
2、service_name:是這個資料庫對外宣稱的名字,外面的人要想連線我這個資料庫,
你就在客戶端的連線串裡寫上service_name。它就像乙個部門的名字,這個部門的名稱在看門大爺(listener)那裡有登記
具體定義:
1、資料庫名是oracle資料庫的內部標識,一般在安裝完後不應該改變,資料庫的很多物理儲存目錄都用到了資料庫名。
2、instance_name,oracle_sid,資料庫例項名,是資料庫和作業系統互動時用到的名稱。
如果在一台機器上建立了多個資料庫,通過sqlplus想連線到其中的乙個資料庫,就需要指明oracle_sid:set oracle_sid=sidname
sqlplus / as sysdba(這種連法只能在本機用,會根據oracle_sid連線到對應的例項)
通常碰到的12560錯誤一般就是因為例項名被錯誤修改或者服務沒有被啟動。
instance_name則是資料庫的乙個引數.
3、service name:服務名,如果資料庫有網域名稱則等同於global db name、沒有的話則等同於資料庫名,這是因為資料庫啟動後會自動把資料庫名註冊到監聽成為服務名,同時資料庫引數service_names也會註冊為服務名,所以乙個資料庫可以有多個服務名.
當在oracle8i,9i,10g的客戶端連線oracle8i,9i,10g伺服器的時候,主機字串應該使用服務名。
4、net service name:網路服務名,也有人叫tns別名、網路連線串(connect string),在tnsnames.ora中配置的名稱,如下面例子的dbtns.
sqlplus sys/sys@orcl as sysdba(這種連法會根據tnsnames.ora中配置的網路服務名連線到本機或者遠端的oracle,走的是網路通訊)
linux下查詢sid的方法:除了上述方法外還可以
在配置oracle環境變數的情況可以使用 echo $oracle_sid,如果沒有可以使用ps -ef |grep oracle 來查詢:
oracle 2548 1 0 aug17 ? 00:00:00 ora_pmon_***x
後面的***x就是對應的sid。
在windows環境下,oracle是以後臺服務的方式被管理的,所以看」控制面板->管理工具->服務 裡面的名稱:」oracleserviceorcl」,則orcl就是sid;
service name
一般預設情況下sid與你的資料庫的名稱是一樣的!
show parameter service_names
PLSQL連線Oracle報錯 ORA 12154
plsql連線oracle報錯 ora 12154 tns 無法解析指定的連線識別符號 解決步驟 1 cmd開啟windows命令視窗,輸入tnsping orcl 看是否連線成功,連線不成功則檢查tnsnames.ora的配置 2 win r開啟執行,輸入services.msc開啟服務,檢查or...
ORA 12571 ORA 03113錯誤解決
問題現象 windows2000 環境下system 檔案壞掉了,不能啟動,修復以後機器是啟動了,但發現原來的 oracle 服務都不見了,也沒有什麼重要的資料,就重灌了一遍,裝完以後一切正常,連線 oracle 正常,重啟動機器以後發現連線 oracle 出現錯誤 ora 12571 tns 包寫...
錯誤解決 ORA 01036
最近寫程式時,往oracle中插入資料,出現錯誤ora 01036 非法的變數名 編號,如下 dbconnection conn getcon conn.open dbcommand cmd conn.createcommand string sqlrt insert into t user id,...