это если вы рассматриваете решение sql:
Если вы можете добавить некоторые ограничения к вашему набору данных, вы можете использовать очень простой SQL. где вы можете даже использовать простые индексы. - это тот случай, когда вы используете GeoCityLite набор данных
если ваши ip-блоки не перекрываются, вы можете просто вставить их в базу данных как беззнаковые 32-битные числа в таблице «блоков» и запросить их так же, как в hibernate:
(GeoipBlocks) getSession()
.createQuery("select gb" +
" from GeoipBlocks gb" +
" where gb.startIpNum <= :ipnumeric " +
" order by gb.startIpNum desc").
setMaxResults(1)
.setParameter("ipnumeric", ipInLongValue)
.uniqueResult()
я записал его в синтаксисе hql, потому что не все базы данных используют одинаковый синтаксис для offset + limit
, который выдает запрос на лучшее соответствие, предполагая, что все блоки не перекрываются. - вам даже не нужен конечный IP для этого, это автоматически определяется преемником.
избегайте запрашивать его таким образом!:
select * from blocks where ipstart <= ip and ipend >= ip
моя база данных не смогла полностью использовать их индексы и провела много сканирования таблиц.