我们';重新使用JDBC+;XMLRPC+;Tomcat+;MySQL执行可能较大的MySQL查询。什么是更好的方法?

我们';重新使用JDBC+;XMLRPC+;Tomcat+;MySQL执行可能较大的MySQL查询。什么是更好的方法?,mysql,stored-procedures,tomcat,jdbc,xml-rpc,Mysql,Stored Procedures,Tomcat,Jdbc,Xml Rpc,我正在从事一个基于Java的项目,该项目有一个客户端程序,需要连接到远程服务器上的MySQL数据库。已实施的措施如下: 使用JDBC编写要执行的SQL查询,然后使用ApacheTomcat作为servlet托管,并通过XML-RPC访问这些查询。客户端代码使用XML-RPC远程执行这些基于JDBC的函数。这允许我们保持MySQL数据库的非公开性,限制使用预定义函数,并允许Tomcat管理数据库事务(我被告知这比让MySQL单独处理要好,但我真的不明白为什么)。然而,这种方法需要大量的锅炉板代码,

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

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

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

任何其他想法都是受欢迎的,关于存储过程解决方案的想法和/或建议也是受欢迎的


谢谢大家!

MySQL 5.0.3+确实有一个执行权限,您可以设置该权限(无需设置选择权限),从而获得所需的功能

但是,请注意JDBC(以及许多其他驱动程序)中的这一点

使用JDBC调用[procedure]时,我得到“java.sql.SQLException:Driver requires 将过程声明为包含“\nbegin”或“\n”以跟随参数 声明,或在mysql.proc上选择privilege以分析列类型。“

解决办法是:

请参阅/J 5.0.3中的“noAccessToProcedureBodies”,了解一个有点粗俗、不符合JDBC的代码 变通办法


MySQL 5.0.3+确实有一个执行权限,您可以设置该权限(无需设置select权限),从而获得所需的功能

但是,请注意JDBC(以及许多其他驱动程序)中的这一点

使用JDBC调用[procedure]时,我得到“java.sql.SQLException:Driver requires 将过程声明为包含“\nbegin”或“\n”以跟随参数 声明,或在mysql.proc上选择privilege以分析列类型。“

解决办法是:

请参阅/J 5.0.3中的“noAccessToProcedureBodies”,了解一个有点粗俗、不符合JDBC的代码 变通办法


我相信您可以实现您的解决方案,而不需要太多的锅炉板,特别是使用Spring的远程处理之类的东西。还有,雄猫吃了多少内存?坦率地说,我相信,如果它只是按照您所描述的那样工作,它的工作空间可能不到128mb(保守估计)

你的选择是解决问题的“按部就班”方法。我说建立一个原型,看看它是如何工作的。您可能遇到的主要问题有:

  • MySQL在这方面有一些重要的问题
  • MySQL的存储过程支持过于原始,迫使您做大量工作
  • 还有什么奇怪的打嗝

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

我相信您可以在不需要太多锅炉板的情况下实现您的解决方案,特别是使用Spring的远程处理之类的工具。还有,雄猫吃了多少内存?坦率地说,我相信,如果它只是按照您所描述的那样工作,它的工作空间可能不到128mb(保守估计)

你的选择是解决问题的“按部就班”方法。我说建立一个原型,看看它是如何工作的。您可能遇到的主要问题有:

  • MySQL在这方面有一些重要的问题
  • MySQL的存储过程支持过于原始,迫使您做大量工作
  • 还有什么奇怪的打嗝

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

您可能可以在服务器上升级RAM,甚至不到几天的开发时间,所以如果这是您从练习中得到的全部,请不要编写任何代码。而且,仅仅因为内存在tomcat内部使用,并不意味着tomcat本身正在使用它。内存可能会被数据或代码中的技术缺陷耗尽

如果您尝试了额外的RAM,但它被占用了,那么这听起来像是一个编码问题,所以我建议在更改任何内容之前,使用探查器或日志数据来尝试找出根本原因。如果原因是大数据集,那么直接使用数据库只会延迟不可避免的时间,相反,您需要查看分页、摘要、客户端缓存或重新设计客户端等内容,以减少昂贵查询的使用。使用探查器,或者简单地查看代码库,也会告诉您是否有东西创建了太多的对象(特别是字符串或XML节点)或者内存泄漏

通过创造性地重构可以避免锅炉板代码,避免重复也很好。尚不清楚您可能已经拥有了多少结构,但只需做一点工作,就可以轻松地集中样板JDBC调用。没有必要重复JDBC代码,也许您可以告诉我们重复的代码是什么


最后,我冒昧地说,有很多很好的理由在数据库上放置一个web层。灵活性(部署)、兼容性、控制(SQL)和安全性都是保留web层的好理由。

您可能可以在服务器中升级RAM,甚至不需要几天的开发时间,所以不要编写任何