带上我自己初步整合的架构Demo供大家参考:点击下载
废话不多说
这里先带上项目的各jar包,因为版本之间的差异所爬的坑,已经数不胜数:
/ /重要的jar都圈出来了,其他包可能与本题目无关
application.properties:
#mogo
mongo.host=127.0.0.1
mongo.port=27017
mongo.connectionsPerHost=8
mongo.threadsAllowedToBlockForConnectionMultiplier=4
mongo.connectTimeout=10000
mongo.maxWaitTime=120000
mongo.autoConnectRetry=true
mongo.socketKeepAlive=true
mongo.socketTimeout=1500
mongo.slaveOk=true
这里简单解释一下各参数:
host:是对应的服务端地址(IP)
port:服务地址对应的端口
connectionsPerHost:每个host都有对应的链接数,这些链接像java的线程池,空闲时在池中,不够用时,访问就会被阻塞,等待可用。这里(听说)设置为8-10为好
threadsAllowedToBlockForConnectionMultiplier:这个参数主要是配合connectionsPerHost使用的,设置线程最大的阻塞数,为
threadsAllowedToBlockForConnectionMultiplier乘以connectionsPerHost的个数。超过之后的线程会获取到异常
connectTimeout:链接超时的毫秒数
maxWaitTime:最大等待时间,负数表示等待时间不确定
autoConnectRetry:socket读写时,不会阻止异常抛出,驱动已经有自动重建破坏链接和重试读操作. 推荐配置false
socketKeepAlive:保持socket的连接,这个看具体情况设置
socketTimeout:socket I/O读写超时时间
slaveOk: (听说)平均线程读取速度。如果设置为false时,读取线程的读取速度之间会有很多差异,可能第一条线程读了2W行数据,第二条线程1W行还不到。但是如果设置为true,每条线程之间的读取速度就会相对平均
当然还有其他参数,这里就不一一介绍了
mongodb-config.xml
<?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-4.0.xsd
http://www.springframework.org/schema/data/repository
http://www.springframework.org/schema/data/repository/spring-repository-1.8.xsd
http://www.springframework.org/schema/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo-1.8.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
<mongo:mongo-client id="mongo" replica-set="${mongo.host}:${mongo.port}">
<mongo:client-options
connections-per-host="${mongo.connectionsPerHost}"
threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"
connect-timeout="${mongo.connectTimeout}"
max-wait-time="${mongo.maxWaitTime}"
socket-keep-alive="${mongo.socketKeepAlive}"
heartbeat-socket-timeout="100000"
socket-timeout="${mongo.socketTimeout}"/>
</mongo:mongo-client>
<!-- mongo的工厂,通过它来取得mongo实例,dbname为mongodb的数据库名,没有的话会自动创建 -->
<mongo:db-factory dbname="test" mongo-ref="mongo"/>
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg ref="mongo"/>
<constructor-arg name="databaseName" value="test"/>
</bean>
<!-- 映射转换器,扫描back-package目录下的文件,根据注释,把它们作为mongodb的一个collection的映射 -->
<mongo:mapping-converter base-package="jaky.web.*.dao" />
<!-- mongodb bean的仓库目录,会自动扫描扩展了MongoRepository接口的接口进行注入 -->
<mongo:repositories base-package="jaky.web.*" />
</beans>
spring:
applicationContext-init.xml
其他配置我就直接省略了,关键是要加上jackson的配置,接着引入mongodb-config.xml
。。。
<!-- 启用spring mvc 内建的Jackson支持 -->
<!-- 设置json和response的字符编码 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
<ref bean="stringHttpMessageConverter"/>
<ref bean="jsonHttpMessageConverter"/>
</list>
</property>
</bean>
<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
<bean id="jsonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- 引入mongodb -->
<import resource="mongodb-config.xml"/>
。。。
接下来,
1. 先把自己的MongoDB服务开启
2. 开启tomcat
3. 部署访问
下面我带上关键的,也非常简单的代码:
注入mongoTemplate(具体地方你们自己看情况决定)
UserController.java
UserController.java
Service
//我这里用了泛型,你们自己根据实际使用
Dao
接着测试访问:
然后到mongodb客户端
完美
其他mongodb的操作,我就不一一写了,大家举一反三
PS: 好像很简单,其实真的许多坑,必须耐心才行。 如:
java.lang.NoSuchMethodError:
org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation(Ljava/lang/reflect/AnnotatedElement;Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
at org.springframework.data.mapping.model.BasicPersistentEntity.findAnnotation(BasicPersistentEntity.java:371)
at org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity.<init>(BasicMongoPersistentEntity.java:80)
at org.springframework.data.mongodb.core.mapping.MongoMappingContext.createPersistentEntity(MongoMappingContext.java:91)
at org.springframework.data.mongodb.core.mapping.MongoMappingContext.createPersistentEntity(MongoMappingContext.java:39)
at org.springframework.data.mapping.context.AbstractMappingContext.addPersistentEntity(AbstractMappingContext.java:309)
at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentEntity(AbstractMappingContext.java:180)
at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentEntity(AbstractMappingContext.java:140)
at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentEntity(AbstractMappingContext.java:67)
at org.springframework.data.mongodb.core.MongoTemplate.getPersistentEntity(MongoTemplate.java:1996)
at org.springframework.data.mongodb.core.MongoTemplate.save(MongoTemplate.java:959)
at jaky.web.base.nosqlBase.NoSqlBaseDao.save(NoSqlBaseDao.java:23)
at jaky.web.base.nosqlBase.NoSqlBaseService.save(NoSqlBaseService.java:25)
at jaky.web.test.controller.UserController.insert(UserController.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
出现这些问题,立刻要去指定的包下面确实是否有这个方法。
例如 这里我用的是spring-framework-4.1.5,里面的jar包spring-core-4.1.5中的源码就是没有这个方法,但是
spring-core-4.3.5中就有这个方法。所以,果断换了更新的版本,问题解决。
遇到这些静态方法找不到,第一时间去确认jar。该换就换