我有一个Java的节目由约15个方法。而且,这些方法得到援引非常频繁地在exeuction的程序。在那一刻,我是创建一个新的连接,在每一个方法并援引的陈述对他们的(数据库是设置在另一台机器上网)。

我想知道的是:我应该仅创建一个连接在主要方法,并通过它作为一个参数的所有方法,需要连接的对象,因为它将大大减少的连接数目的程序,而不是创建和关闭连接非常频繁地在每一个方法。

我怀疑我是不使用资源非常有效地与当前设计的,并且有是一个很大的改进余地,考虑到这个程序可能会长大了很多的未来。

有帮助吗?

解决方案

是的,你应该考虑重新使用连接上而不是创建一个新的每个时间。通常的程序是:

  • 做出一些猜测有多少同时连接的数据库可以理智地处理的(例如开始有2或3%的CPU上数据库计算机直到你找到了,这实在是太少或太多--它会往往取决于如何盘-开你的查询)
  • 创建一个 游泳池 这许多连接:基本上是一类的,你可以问为"下一个免费的连接"在开始的每一个方法,然后"通过"的游泳池在每个方法
  • 你getFreeConnection()方法需要返回一个免费的连接,如果一项是可用的,否则(1)创建一个新的最大数量的连接你已经决定允许,或者(2)如果最大已经建立,等待一个成为免费的
  • 我建议Semaphore类的管理连接;其实我有一个简短的文章在我的网站上 管理一个资源库与一个信号 有一个例子,我想你可以适应你的目的

几个实际的考虑:

  • 针对最佳效能,你要小心 不要"hog"连接,而你实际上不使用它的运行查询.如果你把一个连接从池一次,然后通过它的各种方法,需要确保你不小心这样做。
  • 不要忘记回到你的连接到游泳池!(试用/最终是你的朋友在这里...)
  • 在许多系统,您 不能保持连接的开启'永远:O/S将关闭后,他们的一些最大的时间。所以在你回连接到游泳池'的方法,只需要想想 '退休的连接已经存在了很长一段时间 (建立在一些机构记忆,例如通过具有一个 包装对象 周围的一个实际JDBC连接的对象,你可以用它来储存指标,如此)
  • 你可能想要考虑使用准备好的发言。
  • 随着时间的推移,你可能会需要 调整的连接池尺寸

其他提示

您可以在连接通或更好,但使用类似雅加达数据库连接池。 http://commons.apache.org/dbcp/

您应该使用连接池为。

这样,你可以问的连接,并释放它,当你完成它,并返回到池中

如果另一个线程想要一个新的连接,以及一个在使用中,一个新的可以创建。如果没有其他线程正在使用的连接相同的可以重新使用。

这种方式可以让您的应用程序在某种程度上它的方式(而不是通过连接各地),并仍能正常使用的资源。

不幸的是第一类ConnectionPools都不是很容易的在独立的应用程序使用(他们是在应用程序服务器的缺省值)可能是一个微容器(如自旋微观),或一个良好的框架(如Hibernate)可以让你使用一个。

它们是不太难码的一个从刮擦虽然。

:)

这谷歌搜索将帮助你可以找到更多有关如何使用一个。

通过

脱脂

许多JDBC驱动程序的连接池给你,所以有一点优势进行额外汇集在这种情况。我建议你检查的文件对于你JDBC驱动程序。

另一个办法池连接的是

  • 有一个连接所有数据库的访问与同步访问。这不允许的并发,但是很简单的。
  • 存储连接在线程本地变量(复盖initialValue())这工作很好如果有一个小的固定数量的螺纹。

否则,我建议使用一个连接池。

如果您的应用程序是单线程的,或不从单个线程的所有数据库操作,这是确定使用单个连接。假设你不需要多个连接任何其他原因,这将是迄今为止最简单的实现。

根据您的驱动程序,也可能是线程之间共享的连接是可行的 - 这将是也没关系,如果你信任你的驱动程序不撒谎的线程安全。看看你的驾驶文档以获得更多信息。

典型地“连接”下面的对象不能安全地从多个线程所使用的,所以它的通常不建议共享结果集,Statement对象等线程之间 - 迄今为止最好的策略是在其中创建它们的同一个线程使用它们;这通常是容易的,因为这些对象通常不保持太久。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top