To save on SQL Queries for players jumping back and forward between chunks don't unload Protections as soon as chunks are unloaded, just mark them to be unloaded later.
Possible Implementation
Add a Integer variable to Protection class to store a timestamp, null by default
When a chunk is unloaded for each protection in that chunk set the timestamp variable to now + X amount of seconds
When a Chunk is loaded for any Protections already loaded set the timestamp to null
Run a repeating task (every minute or more, no need to run sooner) to check for any Protections that are due to be unloaded, then unload them (timestamp >= now)
To save on SQL Queries for players jumping back and forward between chunks don't unload Protections as soon as chunks are unloaded, just mark them to be unloaded later.
Possible Implementation