• 締切
  • 困ってます

Tomcat上でMS-ACCESSに接続しようとするとメモリ不足になる

  • 質問No.4828393
  • 閲覧数1809
  • ありがとう数25
  • 回答数10

お礼率 76% (10/13)

Tomcatサーバー上で、MS-AccessにODBC経由で接続しようとすると、
"java.sql.SQLException [Microsoft][ODBC Microsoft Access Driver] メモリ不足です。"
というエラーになってしまいます。

Javaのコードは、以下のようになります。
---------------------------------------------------------
Connection conn = null;
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn = DriverManager.getConnection("jdbc:odbc:データソース名");
---------------------------------------------------------
上記3行目の、DriverManagerの部分でエラーになってしまいます。
同じサーバー上でOracleやDB2へのJDBC接続は問題なく接続できます。

TomcatのJavaメモリ設定は、以下のようになっております。
Initial memory pool : 1024 MB
Maximum memory pool : 1536 MB
Thread stack size : 1024 MB
サーバーの物理メモリは2GBで、通常時のメモリ使用量はおおよそ1.4GB程なのでメモリ不足にはならないと思われるのですが、なぜ接続できないのでしょうか?

また、同じプログラムをローカル上で実行した場合には、問題なく接続できます。

尚、サーバーの環境は以下のようになります。
OS : Windows 2003 Server R2
メモリ : 2GB
Tomcatのバージョン : 5.5
JDKのバージョン : 1.5

以上、宜しくお願い致します。 

回答 (全10件)

  • 回答No.10

ベストアンサー率 35% (1453/4147)

> TomcatのJavaメモリサイズを変更してから問題が発生していると
> 思われるのですが、この事が影響しているとは考えられないでしょうか
私に聞くより先に元に戻して確認してみてはどお?


> 具体的には、どのjarファイルの事でしょうか
端から確認するしかないわね

> JDBCドライバ関係のjarファイルは、
ODBC接続なのにドライバのjarがあるの?

クリーンなTomcatでODBC接続のテストしたら
上手くいったりしてね。
そうすれば、原因が特定しやすいかもよ。
  • 回答No.9

ベストアンサー率 35% (1453/4147)

> 同じサーバでも
目の前で確認できないのが残念だわ。
コマンドラインで問題なくてTomcatで問題がある
コマンドラインから行うとき
Tomcatのライブラリを使っていれば
実行内容に差が出るとは思えないんだけどね。
たぶんどこかに違いがあるんだわ。

> 無償で入手できるドライバはないのでしょうか?
無かったのなら無いのね。
有償な代わり正規な使い方をしている限り
何かあった場合しっかりサポートしてくれるわよ。


そうだ、
何にもならないかもしれないけど
jarファイルの配置とか確認してみるといいかもよ。
案外ライブラリのロードでループが発生しているかもしれないから。
お礼コメント
6860

お礼率 76% (10/13)

ご回答ありがとうございます。

>コマンドラインで問題なくてTomcatで問題がある
おっしゃる通りなんですよね。
コマンドラインでは問題なく接続できて、Tomcat上では接続できない
という状況です。
TomcatのJavaメモリサイズを変更してから問題が発生していると
思われるのですが、この事が影響しているとは考えられないでしょうか?

>jarファイルの配置とか確認してみるといいかもよ
具体的には、どのjarファイルの事でしょうか?
JDBCドライバ関係のjarファイルは、
Tomcatインストールフォルダ\common\lib フォルダ上に置いてあります。
投稿日時:2009/04/01 08:53
  • 回答No.8

ベストアンサー率 35% (1453/4147)

> システムの都合上、同じサーバー上にmdbファイルはおけないように
> なっております。。。
でも検証は可能だと思うけど。
同じサーバ上でやってみて問題なければ
別サーバにあることが(またはそのやり方が)問題と言うことになるわよ。

> JDBCドライバをダウンロードするには
ええ、そうよ。
各ベンダーから入手するの。
そのままダウンロードできるベンダーもあれば
事前にユーザ登録が必要なベンダーもあるわ。
ユーザ登録の方法もWebフォームとは限らないので
各ベンダーのサイトを良く読んでね。

> 一般的に、よく使用されているドライバ
これと言ってないと思うわ。
検証していないのでどれかを推すこともできないし。
そこはなんとも言えないわ。
ゴメンね。
お礼コメント
6860

お礼率 76% (10/13)

>同じサーバ上でやってみて問題なければ
同じサーバー上のmdbファイルに対して接続処理を実行してみましたが
同じくメモリ不足エラーになりました。

各ベンダーのサイトを見てみましたが、こちらで確認できた全ての
サイトについて、ドライバは有償のようです。
無償で入手できるドライバはないのでしょうか?
投稿日時:2009/03/31 16:05
  • 回答No.7

ベストアンサー率 35% (1453/4147)

そういう方法があるのね。
・・・案外原因はそこだったりしてね。
同じサーバ上にmdbおいたら問題が解決したりして。

ドライバは
http://devapp.sun.com/product/jdbc/drivers
に沢山登録されているので選ぶといいわ。
悪いけどお勧めはできないわ。
検証したことないのよ。

jackcessはどうなのかしら。
ぱっと見た感じSQLではなく直接mdbをいじるみたいだけど。
Accessへのバージョンの対応が不明ね。
サンプルも見つからなかったわ。
APIがわかりやすいのでサンプルなんかいらない
ていう意味かもしれないけど。
お礼コメント
6860

お礼率 76% (10/13)

ご回答ありがとうございます。

>同じサーバ上にmdbおいたら問題が解決したりして
システムの都合上、同じサーバー上にmdbファイルはおけないように
なっております。。。

教えて頂いたサイト上から、JDBCドライバをダウンロードするには
どのようにすれば宜しいのでしょうか?
(各ベンダーのサイトに移動してダウンロードするのでしょうか?)

>悪いけどお勧めはできないわ。
>検証したことないのよ。
一般的に、よく使用されているドライバはご存じでしょうか?
投稿日時:2009/03/31 10:22
  • 回答No.6

ベストアンサー率 35% (1453/4147)

え?
mdbは別サーバにあるの?
それはネットワークドライブとかで繋いでいるってこと?
補足コメント
6860

お礼率 76% (10/13)

一度ローカル上の適当なファイルでODBCを登録後、レジストリ
エディタで他のサーバーの共有フォルダ上のファイルを
フルパスで入力する事により、他のサーバーのファイルに
接続をする事が可能です。

ODBC以外の方法として、jackcessというJDBCドライバを見つけた
のですが、使用例が少なく使い方がよく分かりません。
このjackcessの使用方法はご存じでしょうか?

または他のJDBCドライバをご存じでしょうか?
投稿日時:2009/03/30 15:17
  • 回答No.5

ベストアンサー率 35% (1453/4147)

実はメモリを割り当てすぎて
Accessに割り当てるメモリがなくなった
ていうオチだったりしてね。

実物がないとやっぱりわかんないわ。
調べると同様の問題もあるみたいだし
そっちはODBCドライバを使わない方法や
他のデータベースを用いる方法で
解決したみたいだけど。
それも一つの方法かもしれないわね。
お礼コメント
6860

お礼率 76% (10/13)

ご回答ありがとうございます。

>Accessに割り当てるメモリがなくなった
Accessのファイルが置いてある場所は別のサーバーになります。

>そっちはODBCドライバを使わない方法や
ODBCドライバを使用せず、Accessのファイルに接続する方法が
あるということでしょうか?
具体的には、どのような方法になるのでしょうか?
投稿日時:2009/03/30 14:04
  • 回答No.4

ベストアンサー率 35% (1453/4147)

どうやら
ODBC接続すると発生するようね。
理由は不明だけど。
JDBC-ODBCブリッジの不具合かしら。

getConnection(url)を
getConnection(url, user, passowrd)
でやってみると上手くいくかも?
お礼コメント
6860

お礼率 76% (10/13)

ご回答ありがとうございます。

getConnection(url, user, passowrd) に変更してみましたが、
結果は同じくメモリーエラーになりました。

実は、前はこのAccessに接続するプログラムは正常に動いていた
のですが、最近になってエラーが出るようになりました。

最近行った事といえば、TomcatのJavaメモリ設定を以下のように変更
したのですが、この事が影響しているのでしょうか?

Initial memory pool : 512MB ---> 1024 MB
Maximum memory pool : 768MB ---> 1536 MB
Thread stack size : 512MB ---> 1024 MB
投稿日時:2009/03/30 11:49
  • 回答No.3

ベストアンサー率 35% (1453/4147)

Tomcatの問題
ではなく
Tomcat周りの問題
ね。

ただの設定ミスかもしれないし。

次はそのコマンドラインアプリをServletにして
実行してみるといいわ。
mainをdoGetにして動かすの。

・それで問題ない場合、
  あなたが最初に実装したコードを変えたほうがいいかもしれないわ。
・それで重くなった場合
  データソース名が解決できてないのかも?
  もっと情報が欲しくなるわ。
  とりあえずそのときね。
お礼コメント
6860

お礼率 76% (10/13)

ご回答ありがとうございます。

Servletにしてサーバー上で実行したところ、同じくメモリ不足
エラーになりました。
(今までと同じくローカル上では問題なく動きました。)

ODBCのデータソース名やデータソースの指定先のmdbファイルを
変更してみましたが、エラーは変わりませんでした。
投稿日時:2009/03/30 10:20
  • 回答No.2

ベストアンサー率 35% (1453/4147)

ごくごく普通にコマンドラインから実行するだけよ?

データベースに接続するなんて
Tomcatいらないと思うけど。
ましてや上の3行なんてTomcatに関連している要素
まったくないわよ?
どうしても必要ならTomcatのライブラリを利用すればいいわ。

参考:http://www.hellohiro.com/jdbc.htm
お礼コメント
6860

お礼率 76% (10/13)

ご回答ありがとうございます。

ご連絡頂いたように、サーバー上でコマンドラインだけで
実行したところ正常にACCESSに接続できて、
データの表示もする事ができました。

ということは、Tomcatの問題ということになるのでしょうか?
投稿日時:2009/03/27 14:15
  • 回答No.1

ベストアンサー率 35% (1453/4147)

> 同じプログラムをローカル上で実行した場合には
Tomcatを使わずにサーバでそのコードを
単体で動かしたらどおかしら?
もちろんTomcatで動かすのと
まったく同じJavaで動かすこと。
お礼コメント
6860

お礼率 76% (10/13)

askaaskaさん ご回答ありがとうございます。

>Tomcatを使わずにサーバでそのコードを

Tomcatを使わずにということですが、具体的にはどのように行ったら宜しいのでしょうか?

Javaでのデータベースへの接続処理は、かなりTomcatに依存する部分があるような気がするのですが・・・何かよいツールみたいなものがあるのでしょうか?

宜しくお願い致します。
投稿日時:2009/03/27 12:04
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ページ先頭へ