在Java中的线程环境中发布存储过程的最快选项是什么?根据{{3}} Connection.prepareCall()是一种昂贵的方法。那么,当对单个CallableStatement的同步访问不是一个选项时,在每个线程中调用它的替代方法是什么?
答案 0 :(得分:0)
大多数JDBC驱动程序每个连接只使用一个套接字。我认为MySQL也使用单个插槽。在多个线程之间共享一个连接是一个糟糕的性能想法。
如果在不同线程之间使用多个连接,则每个连接都需要一个CallableStatment。每个连接都需要一个CallabaleStatement池。在这种情况下,最简单的方法是将连接类包装起来并将所有调用委托给原始类。使用Eclipse可以非常快速地创建。在包装方法prepareCall()中,您可以添加一个简单的池。您还需要一个CallableStatement的包装类。 close方法将CallableStatement返回到池中。
但首先你应该检查这个电话是否真的很贵,因为许多司机已经在内部进行了这样的调查。创建一个prepareCall()循环并关闭()并计算时间。
答案 1 :(得分:0)
连接不是线程安全的,因此您无法跨线程共享它。
当您准备调用时,JDBC驱动程序(可能)告诉RDBMS系统执行存储在服务器端的大量工作。你可能会对这里的过早优化感到内疚。
答案 2 :(得分:0)
稍微考虑一下,如果您遇到此基础架构代码的问题,那么您的问题就在其他地方。大多数应用程序不会花费大量时间来处理这些事情 确保您使用的是DataSource,大多数都使用连接缓存,有些甚至会使用缓存语句 此外,对于这是一个性能瓶颈,它意味着你一个接一个地做很多查询,或者你的连接池太小。也许您应该对代码进行一些基准测试,以查看存储过程占用的时间与JDBC代码的使用时间。 当然我会遵循MySQL推荐使用CallableStatement,我相信他们已经对此进行了基准测试。大多数应用程序不在线程之间共享任何内容,这很少是一个问题。