Будьте в спящем режиме (с аннотациями) - как начать

Я когда-то наследовал код, где кто-то мысль , что хранение IP-адресов как 4 интервала было действительно хорошей вещью, кроме, они провели все свое время, преобразовывая в интервал

Хранение их, поскольку строки в базе данных были намного легче, и это только потребовало единственного индекса. Вы были бы удивлены, как хорошо SQL-сервер может индексировать строки в противоположность 4 столбцам целых чисел. Но этот список IP не был для помещения в черный список. Распространение в прямом и обратном направлениях базы данных является довольно дорогостоящим.

, Если база данных является излишеством, сохраните их в словаре в памяти, но это - просто предположение, так как мы понятия не имеем, сколько необходимо сравнить. Так как большинство хэш-кодов является 32-разрядным интервалом, и адреса IPv4 составляют 32 бита, сам IP-адрес мог бы просто быть хорошим хэш-кодом.

, Но поскольку другие указывают, наилучший вариант мог бы состоять в том, чтобы уменьшить нагрузку на Ваш сервер и купить специализированные аппаратные средства. Возможно, Вы сохраняете недавно помещенный в черный список IP в памяти и периодически публикуете новый к маршрутизатору.

, Если Вы - тот, пытающийся сделать некоторое программное обеспечение в маршрутизаторе, тогда необходимо будет извлечь книгу структур данных и создать что-то как B-дерево.

17
задан WhyNotHugo 12 August 2009 в 02:39
поделиться

3 ответа

Я предполагаю, что у вас проблемы с справочными документами Hibernate ?

Может быть этот учебник Hibernate будет лучше.

2
ответ дан 30 November 2019 в 12:51
поделиться

Path.GetFullPath возможно?

Для меня было бы гораздо больше смысла, если бы доступная документация заняла бы позицию и активно подтолкнула бы меня в этом направлении вместо того, чтобы предлагать мне кучу вариантов и гадать, куда идти. Не имея этого, я извлек следующие уроки, преобразовав стандартный Hibernate Tutorial в аннотации.

Конфигурация

  • Сохраните hibernate.cfg.xml до минимума (см. Ниже).
  • Define имена столбцов / таблиц базы данных явно с аннотациями JPA, чтобы вы получили именно ту схему, которую хотите. Вы можете дважды проверить это, используя SchemaExport.create (true, false). Обратите внимание, что вы можете не получить точную схему, которую ожидаете, если Hibernate пытается обновить схему в существующей базе данных (например, вы не можете добавить ограничение NOT NULL к столбцу, который уже содержит нулевые значения).
  • Создайте конфигурацию SessionFactory с помощью AnnotationConfiguration.addAnnotatedClass (). AddAnnotatedClass () ...

Вот моя копия hibernate.cfg.xml. Он только устанавливает свойства и явно исключает любую конфигурацию сопоставления.

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- Information about the database to be used -->
        <property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
        <property name="connection.url">jdbc:hsqldb:hsql://localhost</property>
        <property name="connection.username">sa</property>
        <property name="connection.password"></property>
        <property name="connection.pool_size">1</property>
        <property name="dialect">org.hibernate.dialect.HSQLDialect</property>

        <!-- Misc. Hibernate configuration -->
        <property name="hbm2ddl.auto">update</property>
        <property name="current_session_context_class">thread</property>
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
        <property name="show_sql">false</property>
    </session-factory>
</hibernate-configuration>

Область

  • Начать / зафиксировать / откатить транзакции вне каждого класса Manager / DAO. Я понятия не имею, почему EventManager учебника запускает / фиксирует свои собственные транзакции, поскольку книга определяет это как антипаттерн. Для сервлета в учебнике это можно сделать, создав фильтр, который запускает транзакцию, вызывает остальную часть FilterChain, а затем фиксирует / откатывает транзакцию.
  • Аналогичным образом сделайте SessionFactory снаружи и передайте его в каждый класс Manager / DAO, который затем вызывает SessionFactory.getCurrentSession () в любое время, когда ему требуется доступ к данным. Когда придет время модульного тестирования ваших классов DAO, создайте свой собственный SessionFactory, который подключается к базе данных в памяти (например, «jdbc: hsqldb: mem: test»), и передайте его в тестируемый DAO.

Например , некоторые фрагменты из моей версии EventManager:

public final class EventManager {

private final SessionFactory sessionFactory;

/** Default constructor for use with JSPs */
public EventManager() {

    this.sessionFactory = HibernateUtil.getSessionFactory();
}

/** @param Nonnull access to sessions with the data store */
public EventManager(SessionFactory sessionFactory) {

    this.sessionFactory = sessionFactory;
}

    /** @return Nonnull events; empty if none exist */
public List<Event> getEvents() {

    final Session db = this.sessionFactory.getCurrentSession();
    return db.createCriteria(Event.class).list();
}

/**
 * Creates and stores an Event for which no people are yet registered.
 * @param title Nonnull; see {@link Event}
 * @param date Nonnull; see {@link Event}
 * @return Nonnull event that was created
 */
public Event createEvent(String title, Date date) {

    final Event event = new Event(title, date, new HashSet<Person> ());
    this.sessionFactory.getCurrentSession().save(event);
    return event;
}

/**
 * Registers the specified person for the specified event.
 * @param personId ID of an existing person
 * @param eventId ID of an existing event
 */
public void register(long personId, long eventId) {

    final Session db = this.sessionFactory.getCurrentSession();
    final Person person = (Person) db.load(Person.class, personId);
    final Event event = (Event) db.load(Event.class, eventId);
    person.addEvent(event);
    event.register(person);
}

...other query / update methods...
}

Классы данных

  • Поля являются частными
  • Методы получения возвращают защитные копии, поскольку Hibernate может напрямую обращаться к полям
  • Не добавляйте методы установки, если в этом нет необходимости.
  • Когда необходимо обновить какое-либо поле в классе, сделайте это таким образом, чтобы сохранить инкапсуляцию. Намного безопаснее вызывать что-то вроде event.addPerson (person) вместо event.getPeople (). Add (person)

Например, я считаю, что эту реализацию Event намного проще понять, если вы помните, что Hibernate обращается к полям прямо, когда это необходимо.

26
ответ дан 30 November 2019 в 12:51
поделиться

Я просто отправил вам ссылку, потому что у меня такая же проблема это хорошая ссылка для вас, которые используют Eclipse Hibernate Tool для Eclipse

некоторая полезная ссылка:

http://docs.jboss.org/hibernate/stable/annotations/reference/en/html/entity.html#d0e2911
http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/
http://boris.kirzner.info/blog/archives/2008/07/19/hibernate-annotations-the-many-to-many-association-with-composite-key/
http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/

но вы должны кое-что заметить 1- создайте свой объект (класс Java) 2- создать Дао для каждой сущности 3- Создать QueryManager и HibernateUtil (получить SessionFactory) 4- и сделайте свои репозитории (слой фасада)

0
ответ дан 30 November 2019 в 12:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: