所以我一直遇到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
当我使用ant从Eclipse或SSH执行代码时,我得到的结果很好,所以我知道这不是连接URL的问题。但是当我使用Web Start(jnlp文件)运行它时,单击按钮时JFrame甚至不会打开。我知道这不是事件监听器的问题,因为代码可以很好地执行另外两种方式。我已经发现,当驱动程序被注册时会发生异常,但如果我不包含这些行,我会收到错误消息“找不到合适的驱动程序”。有什么建议我可以做些什么来解决这个问题?
答案 0 :(得分:1)
您的Java Web Start程序在客户端上运行,但您的JDBC驱动程序由Tomcat服务器加载 - 这两个环境是在两个不同的JVM中运行的。
您说您在JNLP文件中引用了JDBC驱动程序 - 这是您需要查看的部分。包含驱动程序的jar文件需要由Web Start客户端通过HTTP下载。我猜这就是连锁被打破的地方。
那就是说,我想知道让客户下载JDBC驱动程序并连接到数据库的安全性。 Bytecode对逆向工程并不十分困难,而jar文件只是zip压缩的特例。