基础知识:
b.使用Mongo XML Namespace来配置 好处可以配置更多的选项,server location, replica-sets等等
2.配置MongoDBFactory
1.Mongo Instance:mongo API 的数据库链接对象(com.mongodb.Mongo)
原文: A database connection with internal pooling. For most application, you should have 1 Mongo instance for the entire JVM.
2.MongoDbFactory:spring提供的配置每个数据库的类,包括dbname,username, passwd等信息
3.MongoTemplate:spring提供的便捷操作Mongo数据库的类,可以通过Execution Callbacks直接调用Mongo API
配置项:
1.配置Mongo Instance
两种方式:
a.Spring原生态配置 建议使用MongoFactoryBean来包装一下Mongo而不是使用原生的Mongo配置,因为MongoFactoryBean可以将Mongo的异常转换成spring异常。
exp:
<!-- Factory bean that creates the Mongo instance -->
<bean id="mongo" class="org.springframework.data.mongodb.core.MongoFactoryBean">
<property name="host" value="${mongo.jdbc.host}"/>
<property name="port" value="${mongo.jdbc.port}"/>
</bean>
<!-- Use this post processor to translate any MongoExceptions thrown in @Repository annotated classes -->
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
b.使用Mongo XML Namespace来配置 好处可以配置更多的选项,server location, replica-sets等等
exp
:
<context:property-placeholder location="classpath:/com/myapp/mongodb/config/mongo.properties"/>
<beans>
<mongo:mongo host="localhost" port="27017">
<mongo:options connections-per-host="8"
threads-allowed-to-block-for-connection-multiplier="4"
connect-timeout="1000"
max-wait-time="1500"
auto-connect-retry="true"
socket-keep-alive="true"socket-timeout="1500"
slave-ok="true"
write-number="1"
write-timeout="0"
write-fsync="true"/>
</mongo:mongo/>
</beans>
2.配置MongoDBFactory
如果不需要额外的配置,可以将h
ost和port写到factory里,否则可以使用mongo-ref引用一个配置丰富的mongo配置
a.简单的
3.配置MongoTemplate
<mongo:db-factory dbname="common" host="${mongo.jdbc.host}" port="${mongo.jdbc.port}" id="commonFactory"/>
b.复杂的
<mongo:db-factory dbname="database" mongo-ref="mongo"/>
3.配置MongoTemplate
MongoTemplate有4个构造参数
<mongo:mongo host="localhost" port="27017"/>
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg ref="mongo"/>
<constructor-arg name="databaseName" value="geospatial"/>
</bean>
接口说明:
-
MongoTemplate
(Mongo mongo, String databaseName)
- takes the com.mongodb.Mongo object and the default database name to operate against. -
MongoTemplate
(Mongo mongo, String databaseName, UserCredentials userCredentials)
- adds the username and password for authenticating with the database. -
MongoTemplate
(MongoDbFactory mongoDbFactory)
- takes a MongoDbFactory object that encapsulated the com.mongodb.Mongo object, database name, and username and password. -
MongoTemplate
(MongoDbFactory mongoDbFactory, MongoConverter mongoConverter)
- adds a MongoConverter to use for mapping.
如何获取Mongo API调用:
MongoTemplate提供了e
xecuteCommand和execute两种方法实现回调
boolean hasIndex = template.execute("geolocation", new CollectionCallback<Boolean>() {
public Boolean doInCollection(Venue.class, DBCollection collection) throws MongoException, DataAccessException {
List<DBObject> indexes = collection.getIndexInfo();
for (DBObject dbo : indexes) {
if ("location_2d".equals(dbo.get("name"))) {
return true;
}
}
return false;
}
});
一个完整的配置例子:
<?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.1.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<context:component-scan base-package="org.liuchen.stats" />
<!-- Activate annotation configured components -->
<context:annotation-config/>
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- ============ MongoDB config start ============ -->
<!-- 定义MongoDbFactory -->
<mongo:db-factory dbname="db1" host="${mongo.jdbc.host}" port="${mongo.jdbc.port}" id="db1Factory"/>
<mongo:db-factory dbname="db2" host="${mongo.jdbc.host}" port="${mongo.jdbc.port}" id="db2Factory"/>
<mongo:db-factory dbname="db3" host="${mongo.jdbc.host}" port="${mongo.jdbc.port}" id="db3Factory"/>
<!-- 定义没有_class字段的converter -->
<bean id="mongoMappingContext" class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" />
<bean id="defaultTypeMapper" class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper">
<constructor-arg name="typeKey"><null/></constructor-arg>
</bean>
<bean id="mongoConverter" class="org.springframework.data.mongodb.core.convert.MappingMongoConverter">
<constructor-arg name="mongoDbFactory" ref="db1Factory" />
<constructor-arg name="mappingContext" ref="mongoMappingContext" />
<property name="typeMapper" ref="defaultTypeMapper"></property>
</bean>
<!-- 定义Template -->
<bean id="db1Mongo" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="db1Factory"/>
<constructor-arg name="mongoConverter" ref="mongoConverter"/>
</bean>
<bean id="db2Mongo" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="db2Factory"/>
<constructor-arg name="mongoConverter" ref="mongoConverter"/>
</bean>
<bean id="db3Mongo" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="db3Factory"/>
<constructor-arg name="mongoConverter" ref="mongoConverter"/>
</bean>
<!-- Use this post processor to translate any MongoExceptions thrown in @Repository annotated classes -->
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
<!-- ============ MongoDB config end ============ -->
</beans>