我创建了一个应用程序,它同时处理多个数据库表。目前,我为该进程创建了一个连接,并尝试执行查询,例如并行查询多个表的查询。 每个表可能有数十万或数百万条记录。
我有一个连接和多个在线程中并行执行的语句。 我想知道有没有更好的解决方案或方法?
我在想如果我使用例如10个连接的连接池并运行多个线程(少于10个)来执行select查询。这会增加我的应用程序的性能吗?
我的第一个方法还可以吗?
在数据库上同时(并行)执行多个语句不是一个好方法吗?
在这个论坛link中提到单一连接更好。
答案 0 :(得分:0)
数据库设计以运行多个并行查询。如果您遇到数据库导致的延迟不,则使用池几乎肯定会提高吞吐量。
如果延迟是由数据库引起的,那么并行可能没有帮助 - 甚至可能使情况变得更糟。显然,这取决于您正在运行的查询类型。
答案 1 :(得分:0)
我从您的问题中了解到您正在使用单个Connection对象并跨线程共享它。然后,每个线程都执行它自己的语句。我将尝试以相反的顺序回复您的查询。
同时执行多个语句不是好方法吗? (并行)数据库?
这不是这个问题的真正相关点。几乎所有数据库都应该能够并行运行查询。如果它不能,那么你的任何一种方法对于并发效益的观点几乎都是相同的。
我的第一个方法好吗?
如果您只是在做SELECT,它可能不会引起问题,但您必须非常谨慎地共享Connection对象。在Connection对象上设置了许多事务属性,例如autoCommit和isolation - 这意味着所有语句都会共享所有这些属性。你必须了解它在你的情况下是如何工作的。
有关详细信息,请参阅以下链接
Is MySQL Connector/JDBC thread safe?
https://db.apache.org/derby/docs/10.2/devguide/cdevconcepts89498.html
底线是您可以使用连接池,请执行此操作。
这会增加我的应用程序的性能吗?
检查这个的最好方法是尝试一下。对多线程环境中的性能进行理论分析并使用数据库函数很少能获得准确的结果。但话说回来,考虑到第2点,你似乎应该选择连接池。
修改
我刚刚意识到我在想的是这里的关注以及你的关注实际上可能会有所不同。我纯粹是从共享Connection对象的角度来思考,以避免创建额外的Connection对象[pooled或new]。
为了从数据库中获取所有数据(假设第一种方式不构成问题)的性能应该几乎相同。事实上,即使您在每个线程中创建一个新的Connection对象,与查询数百万条记录相比,它的开销通常也是微不足道的。