繁体   English   中英

在多个线程中以Java执行MySQL存储过程的快速方法?

[英]Fast way to execute MySQL stored procedures in Java within multiple threads?

在Java的线程环境中发布存储过程的最快选择是什么? 根据http://dev.mysql.com/doc/refman/5.1/en/connector-j-usagenotes-basic.html#connector-j-examples-preparecall所述, Connection.prepareCall()是一种昂贵的方法。 那么当无法同步访问单个CallableStatement时,在每个线程中调用它的替代方法是什么?

大多数JDBC驱动程序每个连接仅使用一个套接字。 我认为MySQL也使用单个套接字。 在多个线程之间共享一个连接是一个糟糕的性能想法。

如果在不同线程之间使用多个连接,则每个连接都需要一个CallableStatment。 每个连接都需要一个CallabaleStatement池。 在这种情况下,最简单的方法是包装连接类并将所有调用委派给原始类。 这可以使用Eclipse很快地创建。 在包装好的方法prepareCall()中,您可以添加一个简单的池。 您还需要CallableStatement的包装类。 close方法将CallableStatement返回到池中。

但是首先您应该检查该呼叫是否真的很昂贵,因为许多驱动程序已经在内部进行了此类轮询。 创建一个prepareCall()和close()循环并计算时间。

连接不是线程安全的,因此您不能在线程之间共享它。

当您prepareCall时,JDBC驱动程序(可能)正在告诉RDBMS系统执行存储在服务器端的大量工作。 您可能在这里过早的优化感到内。

经过一番思考之后,似乎如果您在使用此基础结构代码时遇到了问题,那么问题就出在别处。 大多数应用程序不需要花费大量时间来完成这些工作。
确保您使用的是数据源,大多数都进行连接缓存,有些甚至进行语句缓存。
同样,要使它成为性能瓶颈,还意味着您要一个接一个地进行许多查询,或者您的连接池太小。 也许您应该对代码进行一些基准测试,以查看存储的proc花费了多少时间以及JDBC代码花费了多少时间。
当然,我会遵循MySQL关于使用CallableStatement的建议,我相信他们已经对此进行了基准测试。 大多数应用程序在线程之间不共享任何内容,这很少有问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM