MySQL 连接器/J 问题

标签 mysql tomcat6 jdbc

因此,我遇到了 MySQL Connector/J 驱动程序无法正确加载到在 Tomcat 6.0.20 上运行的 Java Web Start 应用程序中的问题。我已将 MySQL 连接器 JAR 文件复制到 Tomcat 的 lib 目录以及 webapps//WEB-INF 中的 lib 目录。我还在 JNLP 文件中添加了对 JAR 文件的引用。经过一番研究后,我发现我还需要向 context.xml 文件($CATALINA_HOME/conf)添加一个节点,这是我根据 Tomcat 6 语法完成的。以下是 XML 文件的内容:

<Context>

  <!-- Default set of monitored resources -->
  <WatchedResource>WEB-INF/web.xml</WatchedResource>

  <!-- Uncomment this to disable session persistence across Tomcat restarts -->
  <!--
  <Manager pathname="" />
  -->

  <!-- Uncomment this to enable Comet connection tacking (provides events
     on session expiration as well as webapp lifecycle) -->
  <!--
  <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
  -->

  <Resource name="jdbc/MySQLDB" auth="Container" driverClassName="com.mysql.jdbc.Driver" 
maxActive="10" maxIdle="1" maxWait="500" type="javax.sql.DataSource"
url="jdbc:mysql://myServerName:3306/myDbName" username="myUserName"    
password="myPassword>" />

</Context>

这是我用来访问数据库的代码:

Connection con = null;
try {
        sb.append("\nAbout to register JDBC driver\n");
        Driver driver=new com.mysql.jdbc.Driver();
        DriverManager.registerDriver(driver);

        sb.append("About to create new instance of mysql jdbc driver\n");
        Class.forName("com.mysql.jdbc.Driver").newInstance();

    } catch (InstantiationException e) {
        sb.append(e.getMessage());
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        sb.append(e.getMessage());
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        sb.append(e.getMessage());
        e.printStackTrace();
    } catch (SQLException e) {
        sb.append(e.getMessage());
        e.printStackTrace();     
    } catch (Exception e) {
        sb.append(e.getMessage());
        e.printStackTrace();
    } // end try-catch

try {
   sb.append("About to create connection using DriverManager\n");

   con = DriverManager.getConnection("jdbc:mysql://myServerName:3306/myDbName","myUserName", "myPassword");

   // Make sure that connection instance isn't null before creating statement and executing query.
   if (con != null) {
     sb.append("About to create SQL statement using con.createStatement\n");
     Statement st = con.createStatement();
     sb.append("About to create ResultSet by executing query");
     ResultSet rs = st.executeQuery("SELECT * FROM catissue_user");

     sb.append("About to loop through ResultSet\n");

     while(rs.next()) {
       sb.append(rs.getString(2));
     } // end of while

     sb.append("\nAbout to close ResultSet, Statement and connection\n");
     rs.close();
     st.close();
     con.close();
   } else {
     sb.append("There was a problem creating the connection:\n");
   } // end if
} catch(SQLException exception) {
   sb.append(exception.getMessage());
   exception.printStackTrace();
} catch(Exception exception) {
   sb.append(exception.getMessage());
   exception.printStackTrace();
} // end try-catch

当我从 Eclipse 或使用 ant 从 SSH 执行代码时,我得到了很好的结果,所以我知道这不是连接 URL 的问题。但是,当我使用 Web Start(jnlp 文件)运行它时,单击按钮时 JFrame 甚至不会打开。不过,我知道这不是事件监听器的问题,因为代码可以很好地以其他两种方式执行它。我发现在注册驱动程序时会发生异常,但如果我不包括这些行,我会收到一条错误消息,提示“找不到合适的驱动程序”。关于如何解决此问题有什么建议吗?

最佳答案

您的 Java Web Start 程序在客户端上运行,但您的 JDBC 驱动程序由您的 Tomcat 服务器加载 - 这是在两个不同的 JVM 中运行的两个不同的环境。

您说您在 JNLP 文件中引用了 JDBC 驱动程序 - 这是您需要查看的部分。包含您的驱动程序的 jar 文件需要可由 Web Start 客户端通过 HTTP 下载。我猜这就是链条断裂的地方。

也就是说,我想知道让您的客户下载 JDBC 驱动程序并连接到您的数据库是否安全。字节码并不难逆向工程,jar 文件只是 zip 压缩的一个特例。

关于MySQL 连接器/J 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1764654/

相关文章:

mysql - 从 Laravel 5.1 升级到 Laravel 5.8 后,whereHas() 速度变慢

java - 启动tomcat时如何传递-D附加参数?

Tomcat 6 和在部署时更新 context.xml

java - CallableStatement.getResultSet() 给出 null

mysql - 用于处理搜索引擎中同义词的数据库结构

mysql - Datanucleus JDO 设置字段为空

php - mysql, php - 字符编码问题`

java - 在 IntelliJ Idea 12.1.4 Ultimate 中将展开的 WAR 部署到 Tomcat 6 服务器时出现问题

java - 如何注入(inject) SQL 命令以在 Java 中删除表

java - 插入...值...选择。如何使用 INSERT 进行嵌套语句?