【问题标题】:We're using JDBC+XMLRPC+Tomcat+MySQL to execute potentially large MySQL queries. What is a better way?我们使用 JDBC+XMLRPC+Tomcat+MySQL 来执行潜在的大型 MySQL 查询。有什么更好的方法?
【发布时间】:2010-09-21 09:08:35
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

    标签: mysql stored-procedures tomcat jdbc xml-rpc


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您接受答案的认可。我最近使用了这个工具:eclipse.org/mat 来了解内存使用情况。它有局限性,但肯定会标记任何大的内存结构。祝你好运。
    【解决方案2】:

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

    但是,请注意 mysql bug report 与 JDBC(以及许多其他驱动程序)。

    当使用 JDBC 调用 [procedure] 时,我得到“java.sql.SQLException: Driver requires 程序声明包含一个 '\nbegin' 或 '\n' 跟随参数 声明,或 mysql.proc 上的 SELECT 权限来解析列类型。"

    解决方法是:

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

    【讨论】:

      【解决方案3】:

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

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

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

      我可能是那些讨厌 MySQL 的人之一,所以情况可能比我想象的要好。

      【讨论】:

      • 不幸的是,不止一本书。 REST 和语义网的拥护者会不同意你的观点(他们认为这是一个错失的机会),但你的 DBA 会想知道为什么你有一个 web 层。维护客户的人也会想知道你为什么要改变你所拥有的!
      猜你喜欢
      • 2021-07-23
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 2015-05-06
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多