java - mysql和tomcat导致服务器过载

标签 java mysql multithreading tomcat

我有一个系统,其中有多个传感器,我需要每分钟从每个传感器收集数据。我正在使用

final Runnable collector = new Runnable(){public void run() {{...}};

scheduler.scheduleAtFixedRate(collector, 0, 1, TimeUnit.MINUTES);

每分钟启动一次进程,并为每个传感器启动一个单独的线程。每个线程打开一个 mysql 连接并从数据库中获取传感器的详细信息,打开一个套接字以收集数据并将数据存储到数据库中并关闭套接字和数据库连接。 (我确保所有连接都已关闭) 现在,我可以使用其他应用程序根据该数据生成警报和报告。

现在,随着传感器数量的增加,服务器开始重载,应用程序也变得越来越慢。

我需要一些专家建议,如何优化我的系统以及实现此类系统的最佳方式是什么。我是否应该只使用一个应用程序来(收集数据 + 生成警报 + 生成报告、生成图表图像 + 等)。

提前致谢。

这是数据收集器应用程序的基本代码

public class OnlineSampling
{
    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    public void startProcess(int start)
    {
        try
        {
            final Runnable collector = new Runnable()
            {
                @SuppressWarnings("rawtypes")
                public void run()
                {
                    DataBase db = new DataBase();
                    db.connect("localhost");
                    try
                    {
                        ArrayList instruments = new ArrayList();
                        //Check if the database is connected
                        if(db.isConnected())
                        {
                            String query="SELECT instrumentID,type,ip,port,userID FROM onlinesampling WHERE status = 'free'";
                            instruments = db.getData(query,5);
                            for(int i=0;i<instruments.size();i++)
                            {
                                ...

                                OnlineSamplingThread comThread = new OnlineSamplingThread(userID,id,type,ip,port,gps,unitID,parameterID,timeZone,units,parameters,scaleFactors,offsets,storageInterval);
                                comThread.start();
                                //This onlineSamplingThread opens the socket and collects the data and does few more things
                            }
                        }
                    } catch (Exception e)
                    {

                        e.printStackTrace();
                    }
                    finally
                    {
                        //Disconnect from the database
                        db.disconnect();
                    }
                }
            };
            scheduler.scheduleAtFixedRate(collector, 0, 60 , TimeUnit.SECONDS);
        } catch (Exception e) {}
    }
}

更新:

你有多少个传感器?我们有大约 400 个传感器(正在增加)。 每个传感器的数据收集 session 需要多长时间?

每个传感器都有一个带有 sim 卡的小型网络服务器,无法连接到互联网。取决于3G网络,正常情况下不会超过3.5秒。

您是否在使用完单个传感器后正确关闭了网络连接?我确保每次都关闭套接字,我还为每个套接字设置了 3.5 秒的超时持续时间。

您使用什么操作系统来收集传感器数据?我们有自己的协议(protocol),使用套接字编程与传感器通信。

它配置为服务器还是桌面?每个传感器都是一个服务器。

最佳答案

您可能需要的是连接池——不是为每个传感器打开一个数据库连接,而是拥有一个共享的已打开连接池,每个线程在需要访问数据库时使用该池。这样,连接的数量可以比传感器的数量小得多(假设大多数时候,程序会做除读/写数据库之外的其他事情,比如与传感器通信或等待传感器响应) .

如果你不使用具有连接池功能的框架,你可以尝试Apache Commons DBCP .

关于java - mysql和tomcat导致服务器过载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33396056/

相关文章:

Java单进程多线程

java - java.time 包中的 of/from 构造函数模式的名称是什么?

java - Webdriver:我无法自动化 slider

java - '<=' 无效字符常量

php - Zend Framework 2 和 mySql 查询

c# - Parallel.For 与 Parallel.Invoke

java - 大 O 符号用于访问链表和二进制搜索中的中间元素?

php - 根据日期回显下一个即将开始的_start

MySQL获取多行成列

python - 如何杀死多处理模块创建的僵尸进程?