我创建了一个应用程序,它同时处理多个数据库表。目前,我为进程创建了一个连接,并试图执行查询,比如并行执行多个表的select查询。每个表可能有数十万或数以百万计的记录。
我有一个连接和多个在线程中并行执行的语句。我想知道是否有更好的解决方案或方法?
我认为,如果我使用连接池(例如,10个连接)并运行多个线程(小于10个)来执行select查询。这会提高我的应用程序的性能吗?
我的第一条路还好吗?
在数据库上同时(并行)执行多条语句不是一种好方法吗?
在这个论坛上,link提到单一连接更好。
发布于 2016-02-25 10:15:03
数据库是设计的,用于运行多个并行查询。如果您遇到的是延迟,而不是数据库造成的,那么使用池几乎肯定会提高您的吞吐量。
如果延迟是由数据库造成的,那么并行化可能没有帮助--甚至可能使它变得更糟。显然,这取决于您正在运行的查询类型。
发布于 2016-02-25 10:43:58
我从您的问题中了解到,您正在使用单个连接对象,并在线程之间共享它。然后,每个线程都执行自己的语句。我将试图以相反的顺序回答您的询问。
在数据库上同时(并行)执行多条语句不是很好的方法吗?
对于这个问题来说,这并不是一个真正相关的问题。几乎所有数据库都应该能够并行运行查询。如果它不能,那么您的任何一种方法对于并发利益视角都将几乎是相同的。
我的第一条路行吗?
如果您只是做选择,它可能不会引起问题,但您必须非常谨慎地共享一个连接对象。在连接对象上设置了许多事务属性,如autoCommit和隔离--这意味着所有语句都将共享这些属性。你必须明白这在你的情况下是如何运作的。
有关更多信息,请参见以下链接
Is MySQL Connector/JDBC thread safe?
https://db.apache.org/derby/docs/10.2/devguide/cdevconcepts89498.html
底线是如果您可以使用连接池,请这样做.
这会提高我的应用程序的性能吗?
最好的检查方法就是尝试一下。对于多线程环境和数据库功能中的性能的理论分析很少能得到准确的结果。但是,再一次,考虑到第2点,似乎您应该只使用连接池。
编辑
我刚刚意识到,我在这里所想的是什么,而你真正关心的可能是不同的。我纯粹是从共享连接对象透视图来考虑,以避免创建额外的连接对象,无论是池对象还是新连接对象。
对于从数据库获取所有数据的性能而言,这两种方法(假设第一种方式不会造成问题)几乎是相同的。事实上,即使您在每个线程中创建了一个新的连接对象,与查询数百万条记录相比,该对象的开销通常也是微不足道的。
https://stackoverflow.com/questions/35624115
复制相似问题