このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

MySQLとJDBCドライバについて

発言者:みっと
( Date Wednesday, October 23, 2002 21:25:19 )


はじめまして。

JDBCドライバを以下のHPよりダウンロードしてJSPから
MySQLへ接続させようとしているのですがうまくいきません。
Javaのテストプログラムを実行させるとエラーとなってしまいます。
どなたか解決法をご存知ないでしょうか?

実行時のコンソールログは次の通りです。
------------------------------------------------------------
[localhost:~/documents] mit% java TestMySQL
Exception in thread "main" java.sql.SQLException: Server configuration denies access to data source
        at org.gjt.mm.mysql.MysqlIO.init(Unknown Source)
        at org.gjt.mm.mysql.Connection.connectionInit(Unknown Source)
        at org.gjt.mm.mysql.jdbc2.Connection.connectionInit(Unknown Source)
        at org.gjt.mm.mysql.Driver.connect(Unknown Source)
        at java.sql.DriverManager.getConnection(DriverManager.java:517)
        at java.sql.DriverManager.getConnection(DriverManager.java:177)
        at TestMySQL.main(TestMySQL.java:72)
------------------------------------------------------------

Line:72 は以下の通りです。
72  Connection conn = DriverManager.getConnection(
73  "jdbc:mysql:///dbname",
74  "root",
75  "root"
76  );


☆OSは「Mac OSX 10.1.5」でMySQLのバージョンは「3.23.51」です。

☆JDBCドライバは以下のHPから MySQL Connector/J 2.0.14 (tar.gz)
をダウンロードして mysql-connector-java-2.0.14-bin.jar を
/Library/Java/Home/lib/ext にコピーしました。

http://www.mysql.com/downloads/api-jdbc-stable.html

☆テスト用のプログラムは以下のHPから TestMySQL.java を
ダウンロードしました。Win環境(MySQLサーバ・クライアント共に)
では正常に動作するのを確認しています。

http://www.entropy.ch/software/macosx/mysql/

☆MySQLへはコマンド入力で直接アクセスすることは可能です。
DB及びTABLEも作成済みです。

kaz さんからのコメント
( Tuesday, October 29, 2002 06:28:19 )

はじめて書き込みさせて頂きます。

mysql-connector-java-2.0.14-bin.jarのある場所へのCLASSPATHが通っていない、ということはありませんか?
/Library/Java/Home/lib/ext以下であれば

java -classpath /Library/Java/Home/lib/ext/mysql-connector-java-2.0.14-bin.jar:. TestMySQL

で動くかもしれません。

あと
mysql-connector-java-2.0.14-bin.jarを置く場所に関する質問ですが、

/usr/local/jakarta-tomcat-xxx/lib/とか
/usr/local/lib/の方が分かりやすいような気がしますけど

/Library/Java/Home/lib/ext以下に置くのは何か理由があるのでしょうか?


みっと さんからのコメント
( Tuesday, October 29, 2002 23:22:43 )

kazさんアドバイスありがとうございます。

> mysql-connector-java-2.0.14-bin.jarのある場所へのCLASSPATHが通っていない、
> ということはありませんか?

/Library/Java/Home/lib/ext へはクラスパスは通っていると思います。

以下の通りMySQLへ接続しているのですが、mysql-connector-java-2.0.14-bin.jarが
上記フォルダにある時は(2)で、削除すると(1)でエラーが発生します。
ということはJDBCドライバは認識しているということだと思っています。
(1) Class.forName("org.gjt.mm.mysql.Driver");
(2) Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/dbname","root","root");

> /Library/Java/Home/lib/ext以下であれば
> java -classpath /Library/Java/Home/lib/ext/mysql-connector-java-2.0.14-bin.jar:. TestMySQL
> で動くかもしれません。

試してみましたが、結果は一緒でした。

> あと
> mysql-connector-java-2.0.14-bin.jarを置く場所に関する質問ですが、
> 
> /usr/local/jakarta-tomcat-xxx/lib/とか
> /usr/local/lib/の方が分かりやすいような気がしますけど
> 
> /Library/Java/Home/lib/ext以下に置くのは何か理由があるのでしょうか?

まったく理由はありません。どこかのHPに上記フォルダに置くという
解説が載っていたのでまねしたまでです。

また、いろいろHPを検索して調べていたら以下の掲示板に
私と同じエラーが発生している内容が載っていましたが
残念ながら解決していないようです。

http://search.luky.org/linux-users.9/msg03159.html

kaz さんからのコメント
( Wednesday, October 30, 2002 00:20:32 )

それでは、

(1) /usr/local/jakarta-tomcat-xxx/lib/mysql-connector-java-2.0.14-bin.jar

    と置いて、

  java -classpath /usr/local/jakarta-tomcat-xxx/lib/mysql-connector-java-2.0.14-bin.jar:. TestMySQL

  を実行

(2) /usr/local/lib/mysql-connector-java-2.0.14-bin.jar

    と置いて

  java -classpath /usr/local/lib/mysql-connector-java-2.0.14-bin.jar:. TestMySQL

   を実行


のどちらかを試してみてはどうでしょう?
少なくとも私の環境(Mac OS X v10.2 + Tomcat 4.0.1)ではこの両方で接続可能であることを
確認出来てます。


/Library/Java/Home/lib/extの「Home」は実体ではなくリンクになっていますが、もしかするとこれもエラーの原因かもしれません。(推測です)

みっと さんからのコメント
( Thursday, October 31, 2002 19:25:04 )

MySQL関係の本をいろいろ読みあさったところ
接続時にホスト名に"localhost"と指定していたところを
"127.0.0.1"に変更したら正常に動作するようになりました。

(NG) Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/dbname","root","root");

(OK) Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1/dbname","root","root");

どうも mysql データベースの user テーブルの定義に関係するらしいのですが
そのへんについてはいま調べているところです。

秋山 優一朗 さんからのコメント
( Monday, November 11, 2002 11:05:30 )

Javaをはじめて間もない素人同然のわたくしですが、
エラーメッセージが消えなくって困っております。ぜひ教えて下さい。
手順どうりにダウンロード・インストールをしてプログラムを実行させ
ているのですが実行するたびに以下のメッセージがコンソールに表示さ
れてしまいます。
******************************************************************
java.sql.SQLException: Invalid authorization specification: Access denied for us
er: 'jsp10@127.0.0.1' (Using password: YES)
        at com.mysql.jdbc.MysqlIO.init(Unknown Source)
        at com.mysql.jdbc.Connection.connectionInit(Unknown Source)
        at com.mysql.jdbc.jdbc2.Connection.connectionInit(Unknown Source)
        at com.mysql.jdbc.Driver.connect(Unknown Source)
        at java.sql.DriverManager.getConnection(DriverManager.java:512)
        at java.sql.DriverManager.getConnection(DriverManager.java:193)
        at p_logFilter.doFilter(p_logFilter.java:18)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:213)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:193)
以降エラーのメッセージが表示される。
******************************************************************
サーブレットの処理のなかでは一応はデータベースにはアクセス出来ていて
データの参照は出来ているのですが。

分かりずらい質問で大変申し訳御座いませんが、
ぜひ皆様にご教授いただきたく初めて書かせていただきました。
宜しくお願いいたします。


森下 さんからのコメント
( Monday, November 11, 2002 18:57:09 )

JAVA以前に、jsp10@127.0.0.1にアクセス権がないですね。
GRANTしましょう。

ちなみにMySQLでは、jsp10@127.0.0.1と、jsp10@localhostは
別のユーザとして認識されます。
@以降が省略されていると、MySQLはjsp10@localhostと認識しますが、
JAVA側がjsp10@127.0.0.1というユーザでアクセスに行っているのですね。

秋山 優一朗 さんからのコメント
( Tuesday, November 12, 2002 21:00:28 )

森下様へ。

コメントいただき本当に本当にありがとう御座います。
jsp10@127.0.0.1にアクセス権がないのでGRANTして下さいとの
ご指導をいただきましたが、GRANTとは何でしょうか。具体的には
どのように解決すればよろしいでしょうか。

あと、実行する度にエラーメッセージが出力されているものの、
プログラム自体(Login画面から入ってDBのデータへのSELECT.INSERT.UPDATE
処理をさせるといったような簡単なものです。私にとっては難しいのですが)は
一応は動いているのですが。何か影響はあるのでしょうか?

毎度と素人的な質問で申し訳御座いません。ぜひご指導ください。
宜しくお願い致します。



森下 さんからのコメント
( Wednesday, November 13, 2002 04:18:28 )

そうですねえ。では、アクセス権自体はわかりますか?
ようは、A君は読んでいいけどB君は駄目よ。っていう制限の掛け方です。
MySQLはその名もmysqlと言うデータベース名でそのデータを持っています。

で、GRANTと言うのは、そのアクセス権を設定するためのSQLの構文です。

まず、JAVAからいじくる前に、Termnalを使って充分遊んで、
この辺の事を理解しといた方が無難でしょうねえ。

以下のサイトが参考になると思われます。
これの前の章位から読んでみるとよいでしょう。


→   MySQL User Account Management

あだち さんからのコメント
( Saturday, February 08, 2003 20:32:49 )

はじめて書き込みさせていただきます。

jspより、mysqlへアクセスしようとしているのですが、
ドライバの登録のところでエラーが出てしまいます。
javaプログラムからはアクセスできるのですが、なぜjspだとアクセスできないのでしょうか?

jspの中で
JDBCドライバの登録を行おうとする↓
  Class.forName("org.gjt.mm.mysql.Driver");
と以下のエラーが発生するのです。


java.lang.ClassNotFoundException: org.gjt.mm.mysql.Driver
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1406)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1254)
        at org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:198)
        at org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:132)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:322)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:130)

当然ドライバのあるフォルダへのクラスパスは通っており、必要なデータベースも作成済みです。
エラーの内容を見る限り、ドライバが見つからないといわれているようなのですが…。

でもjavaアプリケーションではmysqlへの接続はきちんとできるのです。
原因のわかる方、よろしくお願いします。

小杉 さんからのコメント
( Sunday, February 16, 2003 18:19:46 )

JSPを動かすのに何を使っているかによります。

クラスパスが通っていても、アプリケーションサーバがそのクラスパスを利用するように設定されていないと使えないケースはあります。

たとえばTomcat 4.1.18などを使っている場合、WEB-INF内できっちり定義すると使えたりします。


ゆうや さんからのコメント
( Wednesday, April 02, 2003 12:05:14 )

はじめて書き込みさせていただきます。

Web上での簡単な認証システムを作りたいと思っています。
それで、環境構築についてお聞きしたいと思います。
Apache,Tom Cat,J2SE,DB(MySQL)について、
最低限必要なバージョンについて教えて頂けると助かります。

OSはWindows2000を使う予定です

森下 さんからのコメント
( Wednesday, April 02, 2003 14:55:20 )

簡単な認証システム自体なら、相当古いバージョンでもできるでしょうけど、
セキュリティを考えれば、それぞれ最新版を使う方がいいでしょうね。

ただ、Apacheの1.3系列と2.0系列は、単純に1.3が古くて2.0が
新しいと言うものではなく、同じところが出している
別のものと考えた方が分かりやすいでしょう。
MySQLの3系列と4系列も同様です。

というわけで、答えはあなたが必要としている必要最低限のレベルによって
変わると言う事でしょう。もうすこし「簡単な認証システム」自体に
ついての情報を出していただいた方がいいでしょう。
それも、Win2000を利用されるなら、ここのようなMacOS専用の場所
よりも、Winな掲示板を探された方がより的確な答えが得られると思います。

和田 さんからのコメント
( Saturday, November 01, 2003 22:53:34 )

はじめて書き込みをさせていただきます。
和田と申します。

JDBCドライバを利用してMySQLへ接続させようとしているのですがうまくいきません。
Javaのプログラムを実行させるとエラーとなってしまいます。
_____________________________________
C:\>java DbTest2
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)
        at DbTest2.main(DbTest2.java:6)
_____________________________________

Line:6 以降は以下の通りです。
6            //JDBCドライバの登録
7            Class.forName("com.mysql.jdbc.Driver"); 
8            //接続文字列を作成
9            String strConn="jdbc:mysql://localhost/jamyto" 
10                   +"?user=root&password=root"
11                  +"&useUnicode=true&characterEncoding=Shift_JIS";
12          //コネクションオブジェクトを取得
13          Connection conn =DriverManager.getConnection(strConn);
14          //ステートメントオブジェクトを取得
15          Statement stmt = conn.createStatement();

※ちなみに、13行目の後ろに
 .newInstance();
をつけてみても駄目でした。

OSは「Win 2000」でMySQLのバージョンは「mysql-4.0.13-win」です。
ODBCドライバは、 mysql-connector-java-3.0.8-stable-bin.jar です。
環境変数にパスを通しましたし、
C:\j2sdk1.4.2\jre\lib\ext と
C:\Program Files\Java\j2re1.4.2\lib\ext
にもファイルを格納しました。
(ここの格納すればパスを通さなくてもよいはずなのですが・・・)

Win環境(MySQLサーバ・クライアント共に)
では正常に動作するのを確認しています。

MySQLへはコマンド入力で直接アクセスすることは可能です。


みっとさんの書き込みとおりにもやってみたのですが、駄目でした。

>MySQL関係の本をいろいろ読みあさったところ
>接続時にホスト名に"localhost"と指定していたところを
>"127.0.0.1"に変更したら正常に動作するようになりました。

>(NG) Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/dbname","root","root");

>(OK) Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1/dbname","root","root");

どなたか教えていただけないでしょうか。
よろしくお願いします。

かわ さんからのコメント
( Monday, January 05, 2004 16:02:34 )

和田 さんの問題について私も知りたいです。
どなかた教えてもらえないでしょうか?

森下 さんからのコメント
( Monday, January 05, 2004 17:53:35 )

元発言はもう2年近く前になるんですねえ、このスレ・・・。しみじみ。

さて、うちでは
Class.forName("org.gjt.mm.mysql.Driver");
でうまく接続できてますが、
和田さんの
Class.forName("com.mysql.jdbc.Driver"); 
でもよかったんでしたっけ?
・・・と試してみると・・・・
これでも通りますねえ。

まず、接続だけしてその結果を返す程度のごく簡単なプログラムを
書いて試してみてはどうでしょう。
それと、日本語の扱いは、gweのドライバの方が
いいみたいですよ。そっちも試して見て下さい。

さて、このスレッドのずっと上のみっとさんが、最初に
/Library/Java/Home/lib/ext
にドライバをおいたのは、ご自身なぜかはわからないと書いておられますが、
MacOSX10.0系列の作法だからですね。
javaの拡張はそこに入れるようになってます。
ただ、10.1系列以降はこれが変更されて、
/Library/Java/Extensions
以下におくことになっています。
ここにおけば、自動的にパスが通った状態になっています。
うちではそこにドライバを入れて問題なく使ってます。

なんか、あんまり答えになってなくて申し訳ないです。


→  gwe JDBC Driver for MySQL

かず さんからのコメント
( Monday, February 16, 2004 17:04:13 )

Linux+Tomcatで、このスレッドにある方たちと同じエラーに困っていました。
これは反則な方法かも知れませんが、「小杉 さんからのコメント」をヒントに
私がとりあえず解決した方法を書きます。

CLASSPATHは設定されているのに、ClassNotFoundException が出るので試しに
JDBCドライバのjarファイル(mysql-connector-java-3.0.10-stable-bin.jar)
を WEB-INF\lib ディレクトリに置いたところ、無事接続ができました。
(lib ディレクトリはこの時、作成しました)

小杉氏が「WEB-INF内できっちり定義すると使えたりします」と
書かれていますから、この「定義」についてきっちり勉強し、
正しい方法を見つけようと思いますが、とりあえずこれで急場は
しのげました。

的外れなコメントでしたら、申し訳ありません。

hiro さんからのコメント
( Wednesday, February 25, 2004 18:52:55 )

InnoDBを使用してます。autocommitはfalseにしています。
1ユーザがあるテーブルを参照(トランザクション)します。その後、他のユーザが別接続でそのテーブルのレコードを消してコミットします。
トランザクションである1ユーザが再度セレクトしてもその他ユーザに消されたデータが存在する状態で取得できます。しかし、1ユーザでそのテーブルのレコードを削除すると、0件削除で戻ってきます。それでもまたセレクトすると、削除されていないレコードが参照できます。又1ユーザをコミットしてから参照すると、消えた状態で取得する事ができます。
これって仕様なのでしょうか?
おかしな動きだとは思うんですが。。文才がないので、、意味分かりますか?

あつし さんからのコメント
( Monday, April 26, 2004 00:28:51 )

MYSQLが使えるサーバーに、とりあえずサンプルを置いて動かそうと思って、db2table.jspというファイルとjsp.sqlというファイルを置きました。
org.apache.jasper.JasperException: Invalid authorization specification: Access denied for user: 'jsp@localhost' (Using password: YES)
javax.servlet.ServletException: Invalid authorization specification: Access denied for user: 'jsp@localhost' (Using password: YES)
っていうエラーが出て使えないんですけどどうすればいいでしょうか??

プログラムの中身の一部は、db2table.jspは
Class.forName("org.gjt.mm.mysql.Driver");
Connection db=DriverManager.getConnection("jdbc:mysql://localhost/jsp?user=jsp&password=jsp&useUnicode=true&characterEncoding=Shift_JIS");
Statement objSql=db.createStatement();
ResultSet rs=objSql.executeQuery("SELECT * FROM mng_usr");
という感じです。お願いしますm(__)m

田中 剛 さんからのコメント
( Monday, June 21, 2004 10:37:23 )

はじめまして、田中です。
 JDBCの事で悩んでいるので誰か教えてください。
2つにコンピュータに以下のように各種ソフトをインストールしました。
一番目PC(182.168.1.55):
  1. J2SE
    2. MySQL
    3. MySQL-Connection-java(JDBC用)
二番目PC(182.168.1.13):
    1. J2SE
以上のPCには環境変数設定は済み(CLASSPATH,PATHなど)

以下のソース(JAVA)は二番目PCに作成されています。
******************************************************
import java.sql.*;

public class HelloWorldJDBCMySQL {
  public static void main(String[] args) {
    try {
      // ドライバクラスをロード
      // Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // ODBCの場合
      Class.forName("org.gjt.mm.mysql.Driver"); // MySQLの場合

      // データベースへ接続
      // Connection con =
      //   DriverManager.getConnection("jdbc:odbc:helloworld"); // ODBCの場合
      // MySQLの場合
      String url = "jdbc:mysql://192.168.1.55/hxdn_db?useUnicode=true&characterEncoding=SJIS";
      Connection con = DriverManager.getConnection(url,"yyw","yyw");

      // ステートメントオブジェクトを生成
      Statement stmt = con.createStatement();
      String sql = "SELECT * FROM HELLO_WORLD_TABLE";
      // クエリーを実行して結果セットを取得
      ResultSet rs = stmt.executeQuery(sql);
      // 検索された行数分ループ
      while(rs.next()){
        // NOを取得
        int no = rs.getInt("NO");
        // 言語を取得
        String lang = rs.getString("LANGUAGE");
        // メッセージを取得
        String msg = rs.getString("MESSAGE");
        // 表示
        System.out.println(no + " " + lang + " " + msg);
      }
      // データベースから切断
      stmt.close();
      con.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
*****************************************************

実行結果(画面上エラー表示)
java.sql.SQLEException: Server configuration denies access to data source
    at com.mysql.jdbc.MysqlIO.init(Unknown Source)
    省略...
    at HelloWorldJDBCMySQL.main(HelloWorldJDBCMySQL.java:15);

質問:
 MySQLサーバは必ずJ2SEと同じPCにインストールされ、実行されなけらば
なりませんか?
 もし、そうではなければ、どんなほうほうはありますか?
宜しくお願いいたします。

森下 さんからのコメント
( Monday, June 21, 2004 13:32:39 )

一つ確認ですが、ふたつ目のPCの(javaからではなく)ターミナルから、
普通にmysqlコマンドを使って一つ目のPCのMySQLデータベースに
接続できますか?もちろん、その際のユーザ名は、Javaで使うものと同じもので試してです。

まずそれができなければ、JDBC以前にどの方法でも接続できません。