質問:OracleへのJDBC接続に問題があります:ORA-12505、TNS:リスナーは現在、接続記述子で指定されたSIDを認識していません
解決プロセス
私はこのマシンでJDBCを使用してサーバー上のOracleデータベースに接続しますが、常にエラーが発生します。Oracleをインストールする必要がある理由でインターネットを検索し、listener.oraファイルを変更しますが、Navicatは接続できます。ブレークポイントのデバッグの場合、DriverManager.getConnection()のパラメーターURLはjdbc:oracle:thin:@127.0.0.1:1521:**
ですが、 "**"の位置はデータベース名ですか、それともSID名ですか?それはデータベースの名前であるとインターネットで言われていますが、それは私が渡すデータベースの名前でもあり、それでもエラーが発生します。
エラーメッセージは、SIDが不明であることを示しています。DriverManager.getConnection()は、データベースに接続するときにこのパラメーターを渡しませんが、Navicatはデータベースに接続するときにこのパラメーターを必要とします。Oracleを使用する前に、このパラメーターについて疑いはありません。したがって、「**」をSID名に置き換えれば、正常に接続できます。
SIDとデータベース名の違いは?
SIDのINSTANCE_NAMEは、インスタンスを一意に識別するために使用されます。インスタンスは、オペレーティングシステムがデータベースにアクセスするために必要なプロセスとメモリのコレクションであり、データベースが外部接続に使用します。データベースはファイルです。1つのインスタンスは1つのデータベースにのみ対応でき、1つのデータベースは複数のインスタンスに対応できます。
拡張機能
1. JDBCをORACLEに接続する方法は3つあります。
格式一:jdbc:oracle:thin:@//<host>:<port>/<service_name>
格式二:jdbc:oracle:thin:@<host>:<port>:<SID>
格式三:jdbc:oracle:thin:@<TNSName>
SERVICE_NAMEは、oracle8iによって新たに導入されました。これは、データベースを後で複数のインスタンスで対応させることができ、SIDがニーズを満たすことができなくなったため、SERVICE_NAMEの概念が提案されています。
2. Oracleの例へのJDBC接続を完了します。
/**
* “添加外部Jar”,选择“\ojdbc6_g.jar”
* JDBC连接Oracle数据库的示例代码
*/
public void testOracle()
{
Connection con = null;// 创建一个数据库连接
PreparedStatement pre = null;// 创建预编译语句对象,一般都是用这个而不用Statement
ResultSet result = null;// 创建一个结果集对象
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");// 加载Oracle驱动程序
String url = "jdbc:oracle:" + "thin:@127.0.0.1:1521:XE";// 127.0.0.1是本机地址,XE是Oracle的SID
String user = "root";// 用户名,系统默认的账户名
String password = "123";// 你安装时选设置的密码
con = DriverManager.getConnection(url, user, password);// 获取连接
if(con!=null){
System.out.println("连接成功!");
}
String sql = "select * from worker where name=?";// 预编译语句,“?”代表参数
pre = con.prepareStatement(sql);// 实例化预编译语句
pre.setString(1, "高工");// 设置参数,前面的1表示参数的索引,而不是表中列名的索引
result = pre.executeQuery();// 执行查询,注意括号中不需要再加参数
while (result.next())
// 当结果集不为空时
System.out.println("工号:" + result.getInt("id") + "姓名:"
+ result.getString("name"));
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
// 逐一将上面的几个对象关闭,因为不关闭的话会影响性能、并且占用资源
// 注意关闭的顺序,最后使用的最先关闭
if (result != null)
result.close();
if (pre != null)
pre.close();
if (con != null)
con.close();
System.out.println("数据库连接已关闭!");
}
catch (Exception e)
{
e.printStackTrace();
}
}
}