2

我正在开发一个基于 Java 的项目,该项目有一个需要连接到远程服务器上的 MySQL 数据库的客户端程序。执行如下:

使用 JDBC 编写要执行的 SQL 查询,然后使用 Apache Tomcat 作为 servlet 托管,并通过 XML-RPC 进行访问。客户端代码使用 XML-RPC 远程执行这些基于 JDBC 的功能。这允许我们保持我们的 MySQL 数据库不公开,限制使用预定义函数,并允许 Tomcat 管理数据库事务(有人告诉我这比让 MySQL 单独做要好,但我真的不这样做'不明白为什么)。然而,这种方法需要大量的样板代码,并且 Tomcat 是我们服务器上的一个巨大的内存猪。

我正在寻找一种更好的方法来做到这一点。我正在考虑的一种方法是使 MySQL 数据库可公开访问,将基于 JDBC 的代码重写为存储过程,并将公共使用仅限于这些过程。我看到的问题是,将所有 JDBC 代码转换为存储过程将是困难且耗时的。我也不太熟悉 MySQL 的权限。是否可以授予对在表上执行选择语句的存储过程的访问权限,但也可以拒绝在同一张表上的任意选择语句?

欢迎任何其他想法,以及对存储过程解决方案的想法和/或建议。

谢谢!

4

3 回答 3

0

MySQL 5.0.3+ 确实具有您可以设置的执行权限(无需设置选择权限),这应该允许您获得您想要的功能。

但是,请注意这个带有 JDBC 的mysql 错误报告(以及许多其他驱动程序)。

使用 JDBC 调用 [procedure] 时,我得到“java.sql.SQLException:驱动程序需要声明过程以包含 '\nbegin' 或 '\n' 来跟随参数声明,或者 mysql.proc 上的 SELECT 权限来解析列类型。”

解决方法是:

请参阅 /J 5.0.3 中的“noAccessToProcedureBodies”,了解一种有点骇人听闻的、不符合 JDBC 的解决方法。

于 2008-11-07T21:41:29.143 回答
0

我相信您可以在没有太多样板的情况下实施您的解决方案,尤其是。使用类似 Spring 的远程处理。另外,Tomcat 吃了多少内存?我坦率地相信,如果它只是按照您所描述的那样做,它可以在不到 128mb 的时间内工作(保守猜测)。

您的替代方案是解决问题的“正确的书本”方式。我说建立一个原型,看看它是如何工作的。您可能遇到的主要问题是:

  • MySQL 在这方面有一些重要的问题
  • MySQL 的存储过程支持过于原始,迫使你做很多工作
  • 其他一些奇怪的打嗝

我可能是那些 MySQL 的仇恨者之一,所以情况可能比我想象的要好。

于 2008-11-07T21:44:06.237 回答
0

你可以在你的服务器中升级内存,甚至花费几天的开发时间,所以如果你从练习中得到的只是这些,就不要编写任何代码。另外,内存是在tomcat内部使用的,并不代表tomcat自己在使用。内存可能会被数据或代码中的技术缺陷耗尽。

如果您尝试了额外的 RAM 并且它正在被吃掉,那么这听起来像是一个编码问题,所以我建议使用分析器或记录数据来尝试找出根本原因,然后再进行任何更改。如果原因是大型数据集,那么直接使用数据库只会延迟不可避免的情况,相反,您需要查看分页、汇总、客户端缓存或重新设计客户端以减少昂贵查询的使用。使用分析器,或简单地查看代码库,也会告诉您是否创建了太多对象(尤其是字符串或 XML 节点)或内存泄漏。

可以通过创造性地重构来避免样板代码,并且避免重复是有好处的。目前尚不清楚您可能已经拥有多少结构,但只需做一些工作,就可以轻松集中样板 JDBC 调用。没有根本原因应该重复 JDBC 代码,也许您可​​以告诉我们重复的代码是什么?

最后,我敢说有很多充分的理由在您的数据库上放置一个 Web 层。灵活性(部署)、兼容性、控制(通过 SQL)和安全性都是保留 Web 层的好理由。

于 2008-11-08T01:37:51.897 回答