我在一家为客户提供实时车辆定位网站的公司工作。客户车辆每秒发送1个TCP数据包,其中包含有关车辆的所有信息(电池电压、速度、转速、车门状态、DTC、油位、油耗等)。我们有5到10辆车的客户,也有30到50辆车的客户。
在服务器端,我们有一个java应用程序,它从TCP套接字接收这些信息,并解码它们,然后将其写入数据库。在代码内部,在我之前编写它的人使用了数据库池(BasicDataSource)。它的制作方式是,当接收到一个数据包时,为该数据包创建一个线程,对数据包进行解码,并将信息写入线程内的数据库,关闭数据库连接。处理完数据包后,线程结束。有时我们每秒会收到如此多的数据包,以至于应用程序创建了100到200个到数据库的连接。
我是一名C++程序员,我知道如何用java编程,但我不是专家,所以我想知道这样做是否真的是一个好主意。我想要做的是我有一个FIFO,有数据生产者和数据消费者,数据生产者填充FIFO,数据消费者清空FIFO。我的想法是创建一个连接并保持其打开并持续写入我的数据,因为我每秒至少有80到100个包(当我们将所有车辆包加起来时),所以我真的不需要关闭它,因为我只有两个线程,生产者和消费者。(因此,每次清空FIFO时,我都在消费者内部写入)
我在网上搜索,在很多地方我发现我想做的方法并不是一个好的方法。但我不知道什么对我们的情况是最好的,我想消除创建太多线程和创建太多到数据库的连接。java和数据库专家对我改进这个应用程序的方式有何看法。
(我在这篇文章的开头谈到的网站是一个外部服务器,它连接到这个数据库,并将最后写入数据库的数据显示到HereMap地图中。因此系统的实时部分非常重要)
此处是与同一应用程序相关的另一个问题的URL (对于某些性能问题) How to improve a Java application working with BasicDataSource object?
发布于 2015-10-21 20:52:05
如果您有持续的数据流,则创建和放弃到数据库的连接不是一个好方法。
框架(如Spring)通常会创建一个到数据库的连接,并使其“永远”打开。(如果很长一段时间没有发生什么事情,他们可以放弃/重新启动它。)
实际上,最好的和未来可扩展的方式是创建REST API,它将处理这些请求。使用框架(如Spring),它将为您处理很多事情。您可以对数据包进行“解码”,并将其作为API请求发送。
这样做的好处是,它可以在未来被任何技术或任何方法轻松使用,而无需创建全新的解决方案或重写实际代码。即使是客户也可以自己做,如果你给他访问权,如果他想的话。你只需给他API文档,其他一切都取决于他。
https://stackoverflow.com/questions/33259559
复制相似问题