Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC oracle钱包连接_Java_Oracle_Jdbc_Oracle Wallet - Fatal编程技术网

Java JDBC oracle钱包连接

Java JDBC oracle钱包连接,java,oracle,jdbc,oracle-wallet,Java,Oracle,Jdbc,Oracle Wallet,我在使用oracle wallet作为密码存储将java应用程序连接到oracle数据库时遇到了一个问题 为了隔离问题,我制作了一个小的主类,如下所示: public static void main(String[] args) { Connection conn; try { Class.forName("oracle.jdbc.driver.OracleDriver"); System.setProperty("oracle.net.tns_admin", "c:\\tns"); Orac

我在使用oracle wallet作为密码存储将java应用程序连接到oracle数据库时遇到了一个问题

为了隔离问题,我制作了一个小的主类,如下所示:

public static void main(String[] args) {
Connection conn;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
System.setProperty("oracle.net.tns_admin", "c:\\tns");
OracleDataSource ds = new OracleDataSource();
Properties props = new Properties();
System.setProperty("oracle.net.wallet_location", "c:/wallet2");

ds.setConnectionProperties(props);
ds.setURL("jdbc:oracle:thin:/@XE2");
Provider p;
p = new OraclePKIProvider();
Security.insertProviderAt(p, 3);
conn = ds.getConnection();

} catch (SQLException ex) {
Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);

} catch (ClassNotFoundException ex) {
Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
}
在目录c:\tns中,我有以下文件:

sqlnet.ora
tnsnames.ora
cwallet.sso
ewallet.p12
这是sqlnet.ora的清单

SQLNET.AUTHENTICATION_SERVICES = (NTS)
names.directory_path = TNSNAMES
SQLNET.WALLET_OVERRIDE = TRUE
#WALLET_LOCATION = (SOURCE=(METHOD=FILE)METHOD_DATA=(DIRECTORY=c:\wallet))
WALLET_LOCATION = (SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=c:/wallet)))
那是给我的

...
XE2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )
在c:\wallet2中有以下文件:

sqlnet.ora
tnsnames.ora
cwallet.sso
ewallet.p12
该文件以前是使用orapki生成的,我的条目名为XE2,具有正确的凭据。当我运行代码时,我得到以下异常

Could not open wallet. java.io.IOException: Could not open wallet. Check password
启用oracle跟踪时,我可以看到以下几行:

mar 02, 2017 3:57:00 PM oracle.jdbc.driver.DatabaseError findMessage
TRACE_30:          Enter: "ORA-17168", java.io.IOException: Could not open wallet. java.io.IOException: Could not open wallet. Check password
mar 02, 2017 3:57:00 PM oracle.jdbc.driver.Message11 msg
TRACE_30: 72B6CBCC Enter: "ORA-17168", java.io.IOException: Could not open wallet. java.io.IOException: Could not open wallet. Check password
mar 02, 2017 3:57:00 PM oracle.jdbc.driver.Message11 msg
TRACE_30: 72B6CBCC Exit [0.066509ms]

有人能帮我吗? 谢谢你的阅读。
r、 SQLNET.AUTHENTICATION\u SERVICES=(NTS)

这应该是TNS而不是NTS

这是一个非常古老的话题。 -TNS_管理员应指向钱包位置(C:\wallet2)
-在tnsnames.ora wallet中,您的位置是C:\wallet2而不是C:/wallet,因为您的
ewallet.p12
文件受密码保护

您需要使用以下密码设置
oracle.net.wallet\u password
属性:

System.setProperty("oracle.net.wallet_password", "PASSWORD");

如果为p12文件指定了密码,否则它将使用sso文件。

看起来像是钱包位置问题,因为ORA-17168表示遇到了机密存储问题。检查钱包位置是否存在打开的钱包(cwallet.sso),并使用mkstore实用程序确保此钱包包含正确的凭据。检查您是否指向正确的位置。路径正确,并且cwallet.sso在其中。此外,我使用mkstore实用程序测试密钥库的内容,并且存在XE条目