воскресенье, 9 сентября 2012 г.

Spring + MongoDb. Первое знакомство.

В одном из моих проектов мне понадобилось использовать mongodb в качестве хранилища данных сессии пользователя.

Для работы на java с mongodb можно использовать java драйвер. Это довольно утомительное занятие. Поэтому я нашёл интересный проект spring-data-mongodb, который позволяет упростить работу с mongodb.



В этой заметке я напишу немного о том, как начать свой первый проект. Итак, нам потребуются следующие библиотеки:
aopalliance-1.0.jar
spring-context-3.2.0.M1.jar
commons-logging-1.1.1.jar
spring-core-3.2.0.M1.jar
log4j-1.2-1.2.16.jar     
spring-data-commons-core-1.4.0.RC1.jar
mongo-2.8.0.jar          
spring-data-mongodb-1.1.0.RC1.jar
slf4j-api-1.6.4.jar      
slf4j-log4j12-1.6.4.jar  
spring-aop-3.2.0.M1.jar  
spring-expression-3.2.0.M1.jar
spring-asm-3.2.0.M1.jar  
spring-instrument-3.2.0.M1.jar
spring-beans-3.2.0.M1.jar
spring-tx-3.2.0.M1.jar






Для настройки работы с MongoDB используем следующий конфиг:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:context="http://www.springframework.org/schema/context"
          xmlns:mongo="http://www.springframework.org/schema/data/mongo"
          xsi:schemaLocation=
          "http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context-3.0.xsd
          http://www.springframework.org/schema/data/mongo
          http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
          http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
         
          <context:property-placeholder
                location="classpath:db.properties"/>
               
     <mongo:db-factory id="main" host="${db.host}" port="${db.port}" dbname="${app.db.name}"
      write-concern="SAFE" />          
     
      <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
          <constructor-arg name="mongoDbFactory" ref="main"></constructor-arg>
          <property name="writeResultChecking" value="EXCEPTION"/>
      </bean>
         
          </beans>
         
Содержимое файла db.properties:
db.host=localhost
db.port=27017
app.db.name=booking

Далее в коде делаем:
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");
       
        MongoOperations mongoOps = context.getBean("mongoTemplate", org.springframework.data.mongodb.core.MongoTemplate.class);

Теперь мы можем выполнять требуемые операции на интерфейсе MongoOperations. Можно взять какой-нибудь бин и попробовать его сохранить:
mongoOps.insert(new Person("Joe", 34));

После изучения документации получилось следующее:
1. Тег mongo:db-factory позволяет создавать экземпляры SimpleMongoDbFactory. Такой подход позволит избежать выкидывания проверяемого исключения при создании объекта Mongo и позволит использовать иерархию исключений DataAccessException.

2. Для работы с Mongo следует использовать MongoTemplate, который является thread-safe. Класс MongoTemplate реализует интерфейс MongoOperations. Для работы с Mongo рекомендуется использовать именно этот интерфейс.

3. Свойство write-concern для SimpleMongoDbFactory. Позволяет контролировать поведение операции записи, а также условия появления исключений. Нам вполне подходит уровень SAFE - "Exceptions are raised for network issues, and server errors; waits on a server for the write operation".

4. MongoTemplate.writeResultChecking. Позволяет установить, что делать в случае, если при записи произошла ошибка. Например, писать в лог, выдавать исключение, или ничего не делать. По умолчанию выбрано последнее значение. Поэтому может возникнуть ситуация, что приложение работает с виду корректно, но изменений в базе не происходит.

5. Для ускорения поиска документов необходимо использование индексов. Создание индексов можно упростить с помошью аннотации @Indexed. Для этого её необходимо поставить напротив свойства в документе.

Комментариев нет:

Отправить комментарий