Предположим, у вас есть 10 000 датчиков, отправляющих информацию каждые 15 минут. Чтобы повысить производительность на стороне базы данных, вам, возможно, придется разделить базу данных, возможно, по дате / времени, типу датчика или категории или некоторому другому фактору. Это также зависит от того, как вы будете запрашивать ваши данные.
http://en.wikipedia.org/wiki/Partition_(database)
Другим узким местом будет само ваше приложение Java / Java EE. Это зависит от вашего бизнеса, например, все ли 150 000 датчиков будут отправлять информацию одновременно? и какая архитектура будет следовать вашему Java-приложению. Вам придется читать статьи о высокой масштабируемости и производительности.
Вот моя рекомендация для решения Java / Java EE.
Вместо одного, создайте кластер приложений, получающих данные.
Наличие приложения контроллера, которое управляет связью между тем, какой датчик отправляет данные в какой экземпляр приложения в кластере. Экземпляр приложения может извлекать данные из датчика, или датчик может передавать данные в экземпляр приложения, но контроллер - это тот, кто будет контролировать, какой экземпляр приложения связан с каким набором датчиков. Этот контроллер должен быть динамическим, чтобы датчики можно было добавлять, удалять или обновлять, а также экземпляры приложений могут присоединяться или выходить из кластера в любое время. Убедитесь, что в вашем контроллере есть возможность переключения при сбое.
Таким образом, если у вас есть 10 000 датчиков и 10 экземпляров приложения в кластере, у вас есть 1000 датчиков, связанных с приложением в любой момент времени. Если вам все еще нужна более высокая производительность, вы можете иметь, например, 20 экземпляров приложения в кластере, и у вас будет 500 датчиков, связанных с экземпляром приложения.
Экземпляры приложений могут размещаться на одном или нескольких компьютерах, что позволяет добиться как вертикальной, так и горизонтальной масштабируемости. Каждый экземпляр приложения будет многопоточным и будет иметь локальное постоянство. Это позволит избежать узкого места на главном сервере базы данных и уменьшит время отклика транзакции. Эта локальная персистенция может быть файлом (ами) SAN или локальной СУБД (например, Java DB) или даже MQ. Если вы сохраняете локально в базе данных, то вы можете использовать Hibernate для того же.
Асинхронно перемещать данные из локального хранилища в основную базу данных. Это зависит от того, как вы сохранили данные локально.
Если вы используете постоянство на основе файлов, вам нужен отдельный поток, который считывает данные из файла и вставляет их в основной репозиторий базы данных.
Если вы используете локальную базу данных, тогда этот поток может использовать Hibernate для локального чтения данных и вставки их в основной репозиторий базы данных.
Если вы используете MQ, вы можете создать поток или отдельное приложение для перемещения данных из очереди в основной репозиторий базы данных.
Недостаток этого решения заключается в том, что между датчиком, сообщившим некоторые данные, и появлением данных в основной базе данных будет некоторое отставание.
Преимущество этого решения в том, что оно обеспечит высокую производительность, масштабируемость и отказоустойчивость.