Google Cloud SQL を利用した開発をしようとしていますが、下記のエラーが発生してローカルのMySQLデータベースに接続できずに困っています。
java.lang.IllegalStateException: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
Eclipseのプロジェクトプロパティには、「Use MySQL instance」に設定しています。
「Use Google Cloud SQL instance」に設定すると、クラウド上のデータベースの読み書きは正常に行えます。
そもそもローカルのMySQLデータベースを利用した開発をすることは可能なのでしょうか。可能な場合、その設定方法などをどなたか教えて頂けないでしょうか。
ちなみに MySQL Connector/J 下記からダウンロードした jar (mysql-connector-java-5.1.19-bin.jar)を WEB-INF\lib に配置しました。
http://dev.mysql.com/downloads/connector/j/
上記 jar をビルドパスに設定しても、設定しなくても現状は同じです。
ソース(guestbook.GuestbookServlet)の抜粋は下記です。
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
Connection con = null;
try {
DriverManager.registerDriver(new AppEngineDriver());
con = DriverManager.getConnection("jdbc:google:rdbms://mydomain:myproject:myinstance/guestbook", "user1", "secret"); // ここで例外が発生!
// 抜粋
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (con != null)
try {
con.close();
} catch (SQLException ignore) {
}
}
}
例外発生時のスタックトレース(抜粋)は下記です。
java.lang.IllegalStateException: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
at com.google.appengine.api.rdbms.dev.LocalRdbmsServiceLocalDriver.registerDriver(LocalRdbmsServiceLocalDriver.java:95)
at com.google.appengine.api.rdbms.dev.LocalRdbmsServiceLocalDriver.init(LocalRdbmsServiceLocalDriver.java:73)
at com.google.appengine.api.rdbms.dev.LocalRdbmsService.init(LocalRdbmsService.java:83)
at com.google.appengine.tools.development.ApiProxyLocalImpl.startServices(ApiProxyLocalImpl.java:581)
at com.google.appengine.tools.development.ApiProxyLocalImpl.access$700(ApiProxyLocalImpl.java:46)
at com.google.appengine.tools.development.ApiProxyLocalImpl$2.run(ApiProxyLocalImpl.java:564)
at com.google.appengine.tools.development.ApiProxyLocalImpl$2.run(ApiProxyLocalImpl.java:562)
at java.security.AccessController.doPrivileged(Native Method)
at com.google.appengine.tools.development.ApiProxyLocalImpl.getService(ApiProxyLocalImpl.java:561)
at com.google.appengine.tools.development.ApiProxyLocalImpl.resolveDeadline(ApiProxyLocalImpl.java:233)
at com.google.appengine.tools.development.ApiProxyLocalImpl.doAsyncCall(ApiProxyLocalImpl.java:214)
at com.google.appengine.tools.development.ApiProxyLocalImpl.makeSyncCall(ApiProxyLocalImpl.java:147)
at com.google.apphosting.api.ApiProxy.makeSyncCall(ApiProxy.java:105)
at com.google.appengine.api.rdbms.RdbmsApiProxyClient$ApiProxyBlockingInterface.makeSyncCall(RdbmsApiProxyClient.java:95)
at com.google.appengine.api.rdbms.RdbmsApiProxyClient$ApiProxyBlockingInterface.openConnection(RdbmsApiProxyClient.java:73)
at com.google.cloud.sql.jdbc.internal.SqlProtoClient.openConnection(SqlProtoClient.java:58)
at com.google.cloud.sql.jdbc.Driver.connect(Driver.java:66)
at com.google.cloud.sql.jdbc.Driver.connect(Driver.java:26)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:185)
at guestbook.GuestbookServlet.doPost(GuestbookServlet.java:26)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
お礼
ご教授頂いたパスにjarを置いたら接続できました。ありがとうございました。 質問させて頂いた後にいろいろ試したところ、下記の方法でも動きましたので念のためご連絡いたします。 任意のパスにjarを置いて、Eclipseの「実行構成」→「クラスパス」→「ブートストラップ・エントリー」にjarを追加