Hibernate/MySQLを使用するSpringブートアプリケーションで問題が発生しています。ロギングエンティティの書き込み操作数を減らす
アプリケーションはセンサデータ(1秒間に複数回)を受信し、着信データをHibernateエンティティとして保存します。以下のセンサーログエンティティのJavaコードを見つけることができます。
システムは、メモリとしてSDカードを使用するRaspberry Piに導入されました。非常に(!)書き込み操作の数が多いとSDカードに負荷がかかり過ぎるように見えます。開発Piで使用された最後のSDカードは、高品質であるにもかかわらず約6ヶ月間続きました。
1秒あたりの書き込み回数を減らしたいとします。最適には、データは5または10分ごとに1回保存されます。電力不足の場合のデータ損失は問題ではありません。私はすでにデータベース用の外付けハードドライブを使用するようなハードウェアソリューションを検討しました。私の唯一の選択肢は、RPiのSDカードを使用することです。だから私のアプローチは、Spring/Hibernate/MySQLを設定することによって書き込み操作を減らすことです。しかし、いくつかの研究の後、私はこれを達成するためのいくつかの異なる方法があることを発見した。そして、どちらが私のニーズに最も適しているかわからない。
1.ナイーブ
私はエンティティを受け入れ、リストにそれらを保存するSpringコンポーネントを書き、その後、定期的にリストの内容が保存されます可能性があります。これはかなりの量のプログラミング作業のようですが、これをよりスマートな方法で実現する方法がいくつかあると思います。
2.休止/ MySQLの/ InnoDBの
私は一種の、私がやりたいように見えるのInnoDB設定sysvar_innodb_flush_log_at_trx_commitを発見しました。私は、MySQLの接続のみが1秒ごとにフラッシュするには、この設定を使用することができますが、これは最適ではありません。
- は、1秒の間隔があまりにも頻繁に
- この動作は私のテーブルのすべてに適用される、まだですしかし、私はこの特定のテーブルのためだけにしたいです
MySQLの設定を直接設定するのではなく、この動作をHibernateで直接定義する方法があると確信していますが、まだ見つかりませんでした。
結論/質問
必要な動作を実現する方法はありますか?クイックリサーチに基づいた私の提案は意味をなさないのでしょうか、あるいは調べたいものについてもっと良い提案をしていますか?その点についてのご意見は大歓迎です!
付録:エンティティコード:
@Table(
name = "sensor_data_point",
indexes = { @Index(name = "sdp_idx", columnList = "sensor_uid,name,created") }
)
@Entity
@EntityListeners({AuditingEntityListener.class})
public class SensorDataPoint {
@Id
@GeneratedValue
private long id;
@Column(name = "sensor_uid", length = 191)
private String sensorUid;
@Column(name = "name", length = 191)
private String name;
@Column(name = "value", length = 191)
private String value;
@CreatedDate
@Column(name = "created")
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
// Constructor, Getters, Setters
// ...
}
この提案をありがとう!私はメモリテーブルを実装し、それは非常にうまくいくようです – Jan