- PR -

AppletからOracle接続

投稿者投稿内容
Sin
会議室デビュー日: 2003/11/05
投稿数: 9
投稿日時: 2003-11-10 13:26
先日は、色々とありがとうございました。大変勉強になりました。
AppletからOracleに接続してみたいと思いサンプルプログラムを
作ってみたのですが、「Start:アプレットは初期化できません。」とエラーが出て
止まってしまいます。これはどのようなエラーなのでしょうか?
Oracleに接続している部分が少し不安なのですが、このような感じでよろしいのでしょうか?
ご意見をお聞かせいただけると嬉しく思います。よろしくお願い致します。

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
import java.sql.*;
import java.util.*;

public class testdb extends JApplet {
TableModel model;

public void init() {
PersistenceManager persistMgr = new PersistenceManager();
try {
ResultSet rs = persistMgr.executeSQL("SELECT * FROM test;");
model = new DataModel(rs);
} catch(SQLException e) {
e.printStackTrace();
return;
}

JTable table = new JTable(model);
JScrollPane scrollPanel = new JScrollPane(table);

Container cont = getContentPane();
cont.add(scrollPanel);
}
}

class PersistenceManager {
Statement stmt;

PersistenceManager() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
Connection con = DriverManager.getConnection(
"jdbc:oracle:thin:@192.168.0.1:1521:oracle","user","password");
stmt = con.createStatement();
}catch(Exception e){
e.printStackTrace();
}
}

ResultSet executeSQL(String str) throws SQLException {
return stmt.executeQuery(str);
}
}

class DataModel extends AbstractTableModel {
String[] columnNames;
Vector rows = new Vector();

DataModel(ResultSet rs) throws SQLException {
ResultSetMetaData metaData = rs.getMetaData();
int numberOfColumns = metaData.getColumnCount();
columnNames = new String[numberOfColumns];

for(int column = 0; column < numberOfColumns; column++) {
columnNames[column] = metaData.getColumnLabel(column + 1);
}

rows = new Vector();
while (rs.next()) {
Vector newRow = new Vector();
for (int i = 1; i <= getColumnCount(); i++) {
newRow.addElement(rs.getObject(i));
}
rows.addElement(newRow);
}
}

public String getColumnName(int column) {
if (columnNames[column] != null) {
return columnNames[column];
}else{
return "";
}
}
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return rows.size();
}
public Object getValueAt(int aRow, int aColumn) {
Vector row = (Vector)rows.elementAt(aRow);
return row.elementAt(aColumn);
}
}
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-11-10 13:37
使用しているOSは?
実行環境のバージョンは?
出力された例外は?

もし、Windowsを使用しているなら、Java Plug-inのコントロールパネルでコンソール表示の切り替えを行うことができます。ここで、コンソール表示をONにし、出力される例外も報告していただけると、より回答しやすいと思います。
Sin
会議室デビュー日: 2003/11/05
投稿数: 9
投稿日時: 2003-11-10 14:01
すみません。大事な事を書き忘れていました。。。

OSはWindows2000です。
接続先のデータベースはOracle8.1.7です。
JDBCのドライバは、Oracleのホームディレクトリ/jdbc/lib配下の
classes12.zipをAppletのディレクトリにコピーしました。
Javaは、1.3.1_06です。
例外は、以下のように出ています。

ava.sql.SQLException: I/Oホ羌ー、ヌ、ケ。」: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=135294976)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:168)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:210)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:323)
at oracle.jdbc.driver.OracleConnection.<init>(OracleConnection.java:263)
at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:365)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:260)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at PersistenceManager.<init>(testdb.java:34)
at testdb.init(testdb.java:11)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
java.lang.NullPointerException
at PersistenceManager.executeSQL(testdb.java:43)
at testdb.init(testdb.java:13)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

以上よろしくお願い致します。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-11-10 14:41
コード:
 Connection con = DriverManager.getConnection(
"jdbc:oracle:thin:@192.168.0.1:1521:oracle","user","password"); 


ここで、DBとコネクションを張ることが出来ずに終わっている事が原因のようですね。

この結果、ParsistenceManagerの構築が不完全のまま終わり(stmtがnullのまま)、
次いで、 return stmt.executeQuery(str); でNullPointerException発生(stmtはnullだからね)。
Applet#init()ではNullPointerExceptionは捕捉されないため、外に放出、結果「Start:アプレットは初期化できません。」って感じですね。

私はDBを触った事がないので、DBとのコネクションに関して、これ以上フォローしてあげることができません。
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2003-11-10 17:19
確信はありませんが、ERR=12505 って、Oracleのエラー番号ではないですか?

引用:

ava.sql.SQLException: I/Oホ羌ー、ヌ、ケ。」: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=135294976)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))



以下Oracleのエラーメッセージマニュアルより。

TNS-12505 TNS: リスナーは接続記述子にあるSID を解決できませんでした。
原因: CONNECT_DATA のSID が、リスナーのテーブルで見つかりませんでした。
処置: 指定されたSID が正しいかどうか確認してください。現在リスナーに登録されて
いるSID は、"LSNRCTL SERVICES listener name" と入力すると取得できます。これらの
SID はTNSNAMES.ORA 内のSID_NAME、またはINIT.ORA 内のDB_NAME に対応
します。
_________________
Sin
会議室デビュー日: 2003/11/05
投稿数: 9
投稿日時: 2003-11-10 17:56
>かずさん

返答ありがとうございます。
そこがエラーの原因みたいです。色々と本当にありがとうございます。
自分でも色々調べてみたのですが、原因はまだわかっておりません。
多分、調べ方にも問題はあると思いますが。。。

>カーニーさん

返答ありがとうございます。
僕もORACLEのエラーだと思って調べていました。
リスナーは接続記述子にあるSID を解決できませんでした。と言う事は、
SIDが違うと言う事ですよね?
自分のPCからSQL PLUSを使っての接続はできるのですが。。。
他に設定する場所があると言う事なのでしょうか?

よろしくお願い致します。
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2003-11-10 18:17
引用:

Sinさんの書き込み (2003-11-10 14:01) より:
すみません。大事な事を書き忘れていました。。。

OSはWindows2000です。
接続先のデータベースはOracle8.1.7です。
JDBCのドライバは、Oracleのホームディレクトリ/jdbc/lib配下の
classes12.zipをAppletのディレクトリにコピーしました。


 JDBCドライバが正しくありません。
Oracle8iなら、JDBCドライバのファイルは「classes111.zip」です。
「classes12.zip」はOracle9i用です。
Cluster
ぬし
会議室デビュー日: 2003/03/06
投稿数: 289
お住まい・勤務地: 大阪
投稿日時: 2003-11-10 22:27
私が以前やった時は、classes12.zipでもOracle8iに接続できましたけどね・・・。
#アプレットじゃなくてサーブレットですが。(^^;

それより、エラー内容からしてSIDが違うのだと思います。
そのあたりをよく確認された方がいいのではないでしょうか?

ThinドライバでOracleにJDBC接続するのは、ホスト名(IPアドレス)とポート番号、
SIDが合っていればそれ以上は何もいらないはずです。

#恐らくご存知だと思いますが、失礼を承知で追記させていただくと、
 SIDとグローバルサービス名とNet8のサービス名は別物です。SQL*PLUSを使うときに
 指定するのは(通常は)Net8のサービス名で、Net8の設定をするときに使うのは
 (通常は)グローバスサービス名です。

スキルアップ/キャリアアップ(JOB@IT)