繁体   English   中英

Java中的PostgreSQL持久连接(使用JDBC)

[英]PostgreSQL persistent connection in Java (Using JDBC)

我正在设置一个数据记录器,该记录器从一个宁静的Web服务(从安装在生产设备上的PLC )轮询数据,并且需要将其写在PostgreSQL数据库上。

我通常需要每30秒从5台不同的机器(每周24/24小时和每周6天)读取数据。 如果我决定在查询后每次都关闭连接,则每天大约有15.000个数据库连接。 我假设所有5台机器将在不同的时间读取,但是如果我决定同时读取所有这些机器,那么我们当然可以将其减少到3.000个查询。

使用PostgreSQL实现持久连接的最佳方法是什么? 我的疑问是,创建数据库“处理程序”类并返回要使用的“连接”对象可能会受到超时或错误的影响(当连接自身关闭时,我将无法记录任何数据)。

共享连接的最佳方法是连接池,例如DBCP

如果您有其他机器连接到数据库,则难度会增加一点。 我会在另一台计算机或其中一台计算机上设置服务。 例如通过REST或其他可能的接口。

最后,请确保还要检查您的PostgreSQL配置。 一个好的指南可以在postgres Wiki中找到。

保持连接打开

您似乎在说有五个JDBC客户端,每个客户端需要每周六天,每天四分之一钟进行查询或编写。 如果是这种情况,我认为根本不需要断开连接。 只是让每个JDBC客户端维护一个开放的连接。

为什么您认为有必要在半分钟通话之间关闭连接? 如果要考虑其他因素,请编辑您的问题进行澄清。

确保测试您的JDBC连接,因为它可能会因网络中断或Postgres服务器重新启动而丢失。 如果连接失败,请打开另一个。

您可以无限期地维护应用程序与Postgres服务器之间的连接。 请记住两件事:txn超时和网络的脆弱性。

交易超时

每个客户端连接都有默认设置 其中之一是idle_in_transaction_session_timeout (integer) 如果您将事务保留的时间超过此限制,则会回滚该事务,并关闭您的连接(会话)。

如果您知道将长时间打开事务,则可以禁用超时功能。 一般不推荐。 可能与您的用例无关。 如果您完全使用事务,则您的描述听起来会很简短。

引用文档

idle_in_transaction_session_timeout (integer)

用空闲时间超过指定持续时间(以毫秒为单位)的打开事务终止任何会话。 这样可以释放该会话持有的所有锁,并重新使用连接插槽; 它还允许清理仅对该事务可见的元组。 有关更多详细信息,请参见第24.1节。

默认值0禁用此功能。

网络的脆弱性

网络连接本质上是脆弱的。 经验不足的程序员往往不愿接受这种挑战,因为开发环境往往比实际的部署环境更加可靠。

使用网络连接时,程序员必须始终格外小心。 请参阅分布式计算谬论 你必须假设你有网络中断和失败的数据库连接。 每次工作时都要测试数据库连接的有效性。 捕获JDBC驱动程序引发的异常。 在适当的地方使用事务来保护数据的完整性。 这就是发明交易的主要原因:我们期望失败。

换句话说,您在问题中没有提到“持久连接”之类的东西。 有简单的联系 保持打开状态50毫秒还是50天无关紧要:所有连接随时都有失败的风险。 因此,再次期望失败

确保在开发测试周期中测试网络故障。 有高科技的方法可以做到这一点。 我的一个低技术偏爱:运行时拉以太网电缆。

如果可行,请考虑将应用程序和Postgres服务器部署在同一个盒子上(足够的内核,足够的RAM和足够的稳定性)。 应用程序与数据库之间的本地连接比跨机器分布(联网)的可靠性(更快)*得多。 但是其他部署问题可能会要求使用单独的计算机。 系统管理与权衡取舍有关。

主题

如果在您的应用程序中使用线程,请确保它们不共享JDBC连接。 每个线程应使用自己的连接。

您提到了“数据库处理程序”以“获得连接”。 不知道你的意思。 通常,我建议您在其上调用getConnectionDataSource对象。 您的JDBC驱动程序应提供一个实现。

不要使用连接池

人们通常建议使用连接池来进行数据库工作,有时经常反省地建议使用连接池,而没有适当考虑其优缺点。 连接池带来了自己的风险和复杂性。

当有许多客户端间歇性地调用数据库时,连接池最有用。 您的情况恰恰相反,很少有客户经常对数据库进行多次常规调用。 因此,我想禁止您使用连接池。

暂无
暂无

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

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