表
2、数据库常用操作
2.1 库和集合操作
show databases; | show dbs;
use 库名
db.dropDatabase( )
db
show collections; | show tables;
db.createCollection( '集合名称' , [ options] )
db.集合名称.drop( ) ;
2.2 文档操作
https://www.mongodb.com/docs/manual/reference/method/
db.集合名称.insert( document)
db.users.insert( { "name" : "shawn" ,"age" :23,"bir" : "2012-12-12" } ) ;
db.users.insertOne( { "name" : "shawn" ,"age" :23,"bir" : "2012-12-12" } ) ;
db.collection.insertMany( )
db.集合名称.insertMany(
[ < document 1 > , < document 2 > , .. . ] ,
{
writeConcern: 1 ,//写入策略,默认为1,即要求确认写操作,0是不要求。
ordered: true //指定是否按顺序写入,默认true,按顺序写入。
}
)
db.users.insert( [
{ "name" : "shawn" ,"age" :23,"bir" : "2012-12-12" } ,
{ "name" : "小黑" ,"age" :25,"bir" : "2012-12-12" }
] ) ;
for( let i = 0 ; i< 100 ; i++) {
db.users.insert( { "_id" :i,"name" : "编程不良人_" +i,"age" :23} ) ;
}
db.集合名称.find( ) ;
db.集合名称.remove(
< query> ,
{
justOne: < boolean> ,
writeConcern: < document>
}
)
db.集合名称.deleteMany( { query} )
db.users.deleteMany( { } ) ;
db.users.deleteMany( { age:23} ) ;
db.集合名称.update(
< query> ,
< update> ,
{
upsert: < boolean> ,
multi: < boolean> ,
writeConcern: < document>
}
) ;
db.集合名称.update( { "name" : "zhangsan" } ,{ name:"11" ,bir:new date( ) } )
db.集合名称.update( { "name" : "xiaohei" } ,{ $set :{ name:"mingming" } } )
db.集合名称.update( { name:”小黑”} ,{ $set :{ name:”小明”} } ,{ multi:true} )
db.集合名称.update( { name:”小黑”} ,{ $set :{ name:”小明”} } ,{ multi:true,upsert:true} )
2.3 文档查询
db.集合名称.find( query, projection)
db.集合名称.find( ) .pretty( )
db.集合名.find( { age:30} ) ;
db.集合名.find( { age:{ $lt :30} } ) ;
db.集合名.find( { age:{ $lte :30} } ) ;
db.集合名.find( { age:{ $gt :30} } ) ;
db.集合名.find( { age:{ $gte :30} } ) ;
db.集合名.find( { age:{ $ne :30} } ) ;
db.集合名称.find( { key1:value1, key2:value2,.. .} ) .pretty( )
db.users.find( { "age" :27,"name" : "欧力给" ,_id:8} ) ;
db.users.find( { "age" :3,"age" :27} ) ;
db.集合名称.find( { $or : [ { key1: value1} , { key2:value2} ] } ) .pretty( )
db.users.find( { $or :[ { _id:3} ,{ age:15} ] } ) ;
db.users.find( { age:{ $gt :15} ,$or :[ { _id:3} ,{ age:15} ] } ) ;
db.集合名称.insert( { "_id" : 11 , "age" : 29 , "likes" : [ "看电视" , "读书xx" , "美女" ] , "name" : "shawn_xx_11" } )
db.users.find( { likes:"看电视" } )
db.users.find( { likes:{ $size :3} } ) ;
db.users.find( { likes:/shawn/} ) ;
db.集合名称.find( ) .sort( { name:1,age:1} )
db.集合名称.find( ) .sort( { 条件} ) .skip( start) .limit( rows) ;
db.集合名称.count( )
db.集合名称.find( { "name" : "shawn" } ) .count( ) ;
db.集合名称.distinct( '字段' )
db.users.distinct( "age" ) ;
db.集合名称.find( { 条件} ,{ name:1,age:1} )
2.4 $type
$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果
db.col.find( { "title" : { $type : 2 } } ) .pretty( ) ;
db.col.find( { "title" : { $type : 'string' } } ) .pretty( ) ;
db.col.find( { "tags" :{ $type : 4 } } ) .pretty( ) ;
db.col.find( { "tags" : { $type : 'array' } } ) .pretty( ) ;
3、索引
3.1 原理
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。 默认_id已经创建了索引
3.2 索引操作
db.集合名称.createIndex( keys, options)
db.集合名称.createIndex( { "title" :1,"description" :-1} )
db.集合名称.getIndexes( )
db.集合名.ensureIndex( { key:1} ) ;
db.集合名.ensureIndex( { key:1} ,{ unique:true} ) ;
db.集合名称.totalIndexSize( )
db.集合名称.dropIndexes( )
db.集合名称.dropIndex( "索引名称" )
db.集合名.find( { age:6} ) .explain( ) ;
createIndex() 接收可选参数,可选参数列表如下:
Parameter
Type
Description
background
Boolean
建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 “background” 可选参数。 “background” 默认值为false
unique
Boolean
建立的索引是否唯一。指定为true创建唯一索引。默认值为false.
name
string
索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。
sparse
Boolean
对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.
expireAfterSeconds
integer
指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。
v
index version
索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。
weights
document
索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。
default_language
string
对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语
language_override
string
对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.
3.3 复合索引
一个索引的值是由多个 key 进行维护的索引的称之为复合索引
db.集合名称.createIndex( { "title" :1,"description" :-1} )
4、聚合
MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似 SQL 语句中的 count(*)
db.test.insertMany( [
{
title: 'MongoDB Overview' ,
description: 'MongoDB is no sql database' ,
by_user: 'runoob.com' ,
url: 'http://www.runoob.com' ,
tags: [ 'mongodb' , 'database' , 'NoSQL' ] ,
likes: 100
} ,
{
title: 'NoSQL Overview' ,
description: 'No sql database is very fast' ,
by_user: 'runoob.com' ,
url: 'http://www.runoob.com' ,
tags: [ 'mongodb' , 'database' , 'NoSQL' ] ,
likes: 10
} ,
{
title: 'Neo4j Overview' ,
description: 'Neo4j is no sql database' ,
by_user: 'Neo4j' ,
url: 'http://www.neo4j.com' ,
tags: [ 'neo4j' , 'database' , 'NoSQL' ] ,
likes: 750
}
] ) ;
db.test.aggregate( [ { $group : {
_id : "$by_user " ,
num_tutorial : { $sum : 1 }
} } ] )
常见聚合表达式
db.mycol.aggregate( [ { $group : { _id : "$by_user " , num_tutorial : { $sum : "$likes " } } } ] )
db.mycol.aggregate( [ { $group : { _id : "$by_user " , num_tutorial : { $avg : "$likes " } } } ] )
db.mycol.aggregate( [ { $group : { _id : "$by_user " , num_tutorial : { $min : "$likes " } } } ] )
db.mycol.aggregate( [ { $group : { _id : "$by_user " , num_tutorial : { $max : "$likes " } } } ] )
db.mycol.aggregate( [ { $group : { _id : "$by_user " , url : { $push : "$url " } } } ] )
db.mycol.aggregate( [ { $group : { _id : "$by_user " , url : { $addToSet : "$url " } } } ] )
db.mycol.aggregate( [ { $group : { _id : "$by_user " , first_url : { $first : "$url " } } } ] )
db.mycol.aggregate( [ { $group : { _id : "$by_user " , last_url : { $last : "$url " } } } ] )
三、应用整合
1、SpringBoot整合
1.1 环境配置
创建springboot工程羡慕,引入依赖
< dependency>
< groupId> org.springframework.boot groupId>
< artifactId> spring-boot-starter-data-mongodb artifactId>
dependency>
编写配置
# mongodb 没有开启任何安全协议
# mongodb(协议)://121.5.167.13(主机):27017(端口)/baizhi(库名)
spring.data.mongodb.uri=mongodb://192.168.31.167:27017/baizhi
# mongodb 存在密码
#spring.data.mongodb.host=shawn
#spring.data.mongodb.port=27017
#spring.data.mongodb.database=baizhi
#spring.data.mongodb.username=root
#spring.data.mongodb.password=root
1.2 集合操作
@Test
public void testCreateCollection ( ) {
mongoTemplate. createCollection ( "users" ) ;
}
@Test
public void testCreateCollection ( ) {
boolean isExist = mongoTemplate. collectionExists ( "products" ) ;
if ( ! isExist) {
mongoTemplate. createCollection ( "products" ) ;
}
}
@Test
public void testDropCollection ( ) {
mongoTemplate. dropCollection ( "products" ) ;
}
1.3 相关注解
Java–>对象–>JSON–>MongoDB
@Document 对应 类
修饰范围: 用在类上
作用: 用来映射这个类的一个对象为 mongo 中一条文档数据
属性:(value 、collection )用来指定操作的集合名称
@Id 对应 要指定为_id的变量名
修饰范围: 用在成员变量、方法上,只能出现一次
作用: 用来将成员变量的值映射为文档的_id 的值
@Field 对应 剩余变量名 (变量名都按照类中属性名定义时,可以不指定,即同名时可不指定)
修饰范围: 用在成员变量、方法上
作用: 用来将成员变量以及值映射为文档中一个key、value对
属性: ( name,value)用来指定在文档中 key 的名称,默认为成员变量名
@Transient 不参与文档转换
修饰范围: 用在成员变量、方法上
作用 : 用来指定改成员变量,不参与文档的序列化
mongoTemplate. insert ( new User ( 4 , "小wangb" , 22 , new Date ( ) ) , "db1" ) ;
mongoTemplate. save ( new User ( 1 , "小米" , 22 , new Date ( ) ) ) ;
mongoTemplate. insert ( Arrays . asList ( new User ( 2 , "小号" , 11 , new Date ( ) ) , new User ( 3 , "chiwan" , 99 , new Date ( ) ) ) , User . class ) ;
1.4 文档查询
mongoTemplate. findById ( 1 , User . class ) ;
mongoTemplate. findAll ( User . class ) ;
mongoTemplate. find ( Query . query ( Criteria . where ( "name" ) . is ( "小红" ) ) , User . class ) ;
mongoTemplate. find ( Query . query ( Criteria . where ( "age" ) . lt ( 33 ) ) , User . class ) ;
mongoTemplate. find ( Query . query ( Criteria . where ( "name" ) . is ( "小号" ) . and ( "age" ) . is ( 11 ) ) , User . class ) ;
Criteria criteria = new Criteria ( ) ;
criteria. orOperator ( Criteria . where ( "name" ) . is ( "小号" ) , Criteria . where ( "name" ) . is ( "小红" ) ) ;
mongoTemplate. find ( Query . query ( criteria) , User . class ) ;
mongoTemplate. find ( Query . query ( Criteria . where ( "age" ) . is ( 22 ) . orOperator ( Criteria . where ( "name" ) . is ( "小红" ) , criteria. where ( "name" ) . is ( "小wangb" ) ) ) , User . class ) ;
mongoTemplate. find ( new Query ( ) . with ( Sort . by ( Sort. Order . desc ( "age" ) ) ) , User . class ) ;
mongoTemplate. find ( new Query ( ) . with ( Sort . by ( Sort. Order . desc ( "age" ) ) ) . skip ( 3 ) . limit ( 2 ) , User . class ) ;
mongoTemplate. count ( new Query ( ) , User . class ) ;
mongoTemplate. findDistinct ( new Query ( ) , "age" , User . class , int . class ) ;
mongoTemplate. find ( new BasicQuery ( "{$or:[{age:22},{age:99}]}" , "{name:0}" ) , User . class ) ;
1.5 文档更新&删除
Query query = new Query ( Criteria . where ( "age" ) . is ( 44 ) ) ;
mongoTemplate. updateFirst ( query, new Update ( ) . set ( "age" , 33 ) . set ( "name" , "小王八" ) , User . class ) ;
mongoTemplate. updateMulti ( query, new Update ( ) . set ( "age" , 11 ) , User . class ) ;
UpdateResult age = mongoTemplate. upsert ( query, new Update ( ) . set ( "age" , 44 ) , User . class ) ;
System . out. println ( age. getModifiedCount ( ) ) ;
System . out. println ( age. getMatchedCount ( ) ) ;
System . out. println ( age. getUpsertedId ( ) ) ;
mongoTemplate. remove ( new Query ( Criteria . where ( "age" ) . is ( 44 ) ) , User . class ) ;
mongoTemplate. remove ( new Query ( ) , User . class ) ;
四、权限配置与可视化
1、概述
刚安装完毕的mongodb默认不使用权限认证方式启动,与MySQL不同,mongodb在安装的时候并没有设置权限,然而公网运行系统需要设置权限以保证数据安全。MongoDB是没有默认管理员账号,所以要先添加管理员账号,并且mongodb服务器需要在运行的时候开启验证模式
用户只能在用户所在数据库登录(创建用户的数据库),包括管理员账号。
管理员可以管理所有数据库,但是不能直接管理其他数据库,要先认证后才可以。
2、权限管理
2.1 创建账户
mongo
use admin
db.createUser( { "user" : "user" ,"pwd" : "password" ,"roles" :[ "root" ] } )
db.createUser(
{ user: "admin" ,
customData:{ description:"superuser" } ,
pwd: "admin" ,
roles: [ { role: "userAdminAnyDatabase" , db: "admin" } ]
}
)
db.createUser( {
user:"user001" ,
pwd:"123456" ,
customData:{
name:'shawn' ,
email:'[email protected] ' ,
age:18,
} ,
roles:[
{ role:"readWrite" ,db:"db001" } ,
{ role:"readWrite" ,db:"db002" } ,
'read' // 对其他数据库有只读权限,对db001、db002是读写权限
]
} )
2.2 账户常用操作
show users
db.system.users.find( )
db.runCommand( { usersInfo:"userName" } )
use admin
db.changeUserPassword( "username" , "xxx" )
db.runCommand(
{
updateUser:"username" ,
pwd:"xxx" ,
customData:{ title:"xxx" }
}
)
use admin
db.dropUser( 'user001' )
db.dropAllUser( )
use admin
db.auth( 'admin' ,'admin' )
use db001
2.3 权限启动认证
mongo --auth
auth = true
3、Docker启动认证
3.1 创建管理员
mkdir /mongo/data/
docker run --name linux-mongo -p 27017 :27017 -v /mongo/data:/data/db -d mongo
docker exec -it linux-mongo mongo admin
db.createUser( { user:'rootuser' ,pwd:'rootpassword' , roles: [ { role: "userAdminAnyDatabase" , db: "admin" } ] } ) ;
exit
docker stop linux-mongo
docker rm linux-mongo
3.2 创建 MongoDB 镜像 - 带验证
docker run --name linux-mongo -p 27017 :27017 -v /mongo/data:/data/db -d mongo --auth
docker exec -it linux-mongo mongo admin
db.auth( "rootuser" ,"rootpassword" ) ;
db.createUser( { user: 'testadmin' , pwd: 'testadmin123' , roles: [ { role: "root" , db: "admin" } ] } ) ;
db.auth( "testadmin" ,"testadmin123" ) ;
exit
show dbs;
show users ;
db.dropUser( "testadmin" )
4、MongoDB可视化
docker run -d \
--name mongo \
-v /home/docker/mongo/db:/data/db \
-p 27017 :27017 \
-e MONGO_INITDB_ROOT_USERNAME = admin \
-e MONGO_INITDB_ROOT_PASSWORD = 123456 \
--restart = always \
mongo:5.0
docker run -d \
--name mongo-express \
-p 8081 :8081 \
--link mongo \
-e ME_CONFIG_MONGODB_SERVER = '172.21.9.203' \
-e ME_CONFIG_MONGODB_ADMINUSERNAME = 'admin' \
-e ME_CONFIG_MONGODB_ADMINPASSWORD = '123456' \
-e ME_CONFIG_BASICAUTH_USERNAME = 'admin' \
-e ME_CONFIG_BASICAUTH_PASSWORD = 'admin123' \
--restart = always \
mongo-express:0.54
五、副本与集群
1、副本集
https://www.mongodb.com/docs/manual/replication/
1.1 概述
MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组成。副本集没有固定的主节点,当主节点发生故障时整个集群会选举一个主节点为系统提供服务以保证系统的高可用。注意:这种方式并不能解决主节点的单点访问压力问题。
**注意:**当MongoDB副本集架构只剩一个节点时,整个节点是不可用的。单主不可写
1.2 自动故障转移
当主节点未与集合的其他成员通信超过配置的选举超时时间(默认为 10 秒)时,合格的辅助节点将调用选举以将自己提名为新的主节点。集群尝试完成新主节点的选举并恢复正常操作。
1.3 副本集搭建
mkdir -p rep1/data1
mkdir -p rep1/data2
mkdir -p rep1/data3
./mongod --port 27017 --dbpath .. /rep1/data1 --bind_ip 0.0 .0.0 --replSet myreplace/[ 1.14 .17.152:27018,1.14.17.152:27019]
./mongod --port 27018 --dbpath .. /rep1/data2 --bind_ip 0.0 .0.0 --replSet myreplace/[ 1.14 .17.152:27017,1.14.17.152:27019]
./mongod --port 27019 --dbpath .. /rep1/data3 --bind_ip 0.0 .0.0 --replSet myreplace/[ 1.14 .17.152:27018,1.14.17.152:27017]
use admin
var config = {
_id:"myreplace" ,
members:[
{ _id:0,host:"121.5.167.13:27017" } ,
{ _id:1,host:"121.5.167.13:27018" } ,
{ _id:2,host:"121.5.167.13:27019" } ]
}
rs.initiate( config) ; //初始化配置
rs.slaveOk( ) ; //旧的
rs.secondaryOk( ) ; //新的
还有一种方式是配置文件
netstat -lnp | grep 27017
cd /opt/home/
cp -r mongodb5.0.5/ mongodb1
cp -r mongodb5.0.5/ mongodb2
cp -r mongodb5.0.5/ mongodb3
mkdir -p /data/mongodb/data1
mkdir -p /data/mongodb/data2
mkdir -p /data/mongodb/data3
cd mongodb1/bin/
vim mongodb.conf
dbpath = /data/mongodb/data1
logpath = /data/mongodb/log1.log
port = 27018
fork = true
bind_ip = 0.0 .0.0
replSet = myreplace/[ 192.168 .200.128:27019,192.168.200.128:27020]
./mongo --port 27018
./mongo --port 27019
./mongo --port 27020
var config = {
_id:"myreplace" ,
members:[
{ _id:0,host:"192.168.200.128:27018" } ,
{ _id:1,host:"192.168.200.128:27019" } ,
{ _id:2,host:"192.168.200.128:27020" } ]
}
rs.initiate( config) ;
use test ;
db.test.insert( { _id:1, name:'java' } ) ;
db.test.find( ) ;
rs.slaveOk( ) ;
rs.secondaryOk( ) ;
db.test.find( ) ;
2、分片集群(sharing cluster)
https://www.mongodb.com/docs/manual/sharding/
2.1 概述
分片(sharding)是指将数据拆分,将其分散存在不同机器的过程 ,有时也用分区(partitioning)来表示这个概念,将数据分散在不同的机器上,不需要功能强大的大型计算机就能存储更多的数据,处理更大的负载。
分片目的是通过分片能够增加更多机器来应对不断的增加负载和数据,还不影响应用运行。MongoDB支持自动分片,可以摆脱手动分片的管理困扰,集群自动切分数据做负载均衡。
MongoDB分片的基本思想就是将集合拆分成多个块,这些快分散在若干个片里,每个片只负责总数据的一部分,应用程序不必知道哪些片对应哪些数据,甚至不需要知道数据拆分了,所以在分片之前会运行一个路由进程,mongos进程,这个路由器知道所有的数据存放位置,应用只需要直接与mongos交互即可。mongos自动将请求转到相应的片上获取数据,从应用角度看分不分片没有什么区别。
2.2 架构
Shard: 用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障
Config Server:mongod实例,存储了整个 ClusterMetadata
Query Routers: 前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用
Shard Key: 片键,设置分片时需要在集合中选一个键,用该键的值作为拆分数据的依据,这个片键称之为(shard key),片键的选取很重要,片键的选取决定了数据散列是否均匀
2.3 分片集群搭建
下面是原生安装集群,docker安装可以参考:Docker部署MongoDB分片+副本集集群(实战)
- Shard Server 1 :27017
- Shard Repl 1 :27018
- Shard Server 2 :27019
- Shard Repl 2 :27020
- Shard Server 3 :27021
- Shard Repl 3 :27022
- Config Server :27023
- Config Server :27024
- Config Server :27025
- Route Process :27026
mkdir -p /data/mongodb/shard/s0
mkdir -p /data/mongodb/shard/s0-repl
mkdir -p /data/mongodb/shard/s1
mkdir -p /data/mongodb/shard/s1-repl
mkdir -p /data/mongodb/shard/s2
mkdir -p /data/mongodb/shard/s2-repl
mkdir -p /data/mongodb/shard/config1
mkdir -p /data/mongodb/shard/config2
mkdir -p /data/mongodb/shard/config3
mkdir -p /data/mongodb/shard/config
启动6个 shard服务
./mongod --port 27017 --dbpath /data/mongodb/shard/s0 --bind_ip 0.0 .0.0 --shardsvr --replSet r0/123.57.80.91:27018 --fork --logpath /data/mongodb/shard/s0/s0.log
./mongod --port 27018 --dbpath /data/mongodb/shard/s0-repl --bind_ip 0.0 .0.0 --shardsvr --replSet r0/123.57.80.91:27017 --fork --logpath /data/mongodb/shard/s0-repl/s0-repl.log
./mongo --port 27017
use admin
config = {
_id:"r0" , members:[
{ _id:0,host:"123.57.80.91:27017" } ,
{ _id:1,host:"123.57.80.91:27018" }
]
}
rs.initiate( config) ;
./mongod --port 27019 --dbpath /data/mongodb/shard/s1 --bind_ip 0.0 .0.0 --shardsvr --replSet r1/123.57.80.91:27020 --fork --logpath /data/mongodb/shard/s1/s1.log
./mongod --port 27020 --dbpath /data/mongodb/shard/s1-repl --bind_ip 0.0 .0.0 --shardsvr --replSet r1/123.57.80.91:27019 --fork --logpath /data/mongodb/shard/s1-repl/s1-repl.log
./mongo --port 27019
use admin
config = {
_id:"r1" , members:[
{ _id:0,host:"123.57.80.91:27019" } ,
{ _id:1,host:"123.57.80.91:27020" }
]
}
rs.initiate( config) ;
./mongod --port 27021 --dbpath /data/mongodb/shard/s2 --bind_ip 0.0 .0.0 --shardsvr --replSet r2/123.57.80.91:27022 --fork --logpath /data/mongodb/shard/s2/s2.log
./mongod --port 27022 --dbpath /data/mongodb/shard/s2-repl --bind_ip 0.0 .0.0 --shardsvr --replSet r2/123.57.80.91:27021 --fork --logpath /data/mongodb/shard/s2-repl/s2-repl.log
./mongo --port 27017
use admin
config = {
_id:"r2" , members:[
{ _id:0,host:"123.57.80.91:27021" } ,
{ _id:1,host:"123.57.80.91:27022" }
]
}
rs.initiate( config) ;
启动3个config服务
./mongod --port 27023 --dbpath /data/mongodb/shard/config1 --bind_ip 0.0 .0.0 --replSet config/[ 123.57 .80.91:27024,123.57.80.91:27025] --configsvr --fork --logpath /data/mongodb/shard/config1/config.log
./mongod --port 27024 --dbpath /data/mongodb/shard/config2 --bind_ip 0.0 .0.0 --replSet config/[ 123.57 .80.91:27023,123.57.80.91:27025] --configsvr --fork --logpath /data/mongodb/shard/config2/config.log
./mongod --port 27025 --dbpath /data/mongodb/shard/config3 --bind_ip 0.0 .0.0 --replSet config/[ 123.57 .80.91:27023,123.57.80.91:27024] --configsvr --fork --logpath /data/mongodb/shard/config3/config.log
初始化 config server 副本集
./mongo --port 27023
use admin
config = {
_id:"config" ,
configsvr: true,
members:[
{ _id:0,host:"123.57.80.91:27023" } ,
{ _id:1,host:"123.57.80.91:27024" } ,
{ _id:2,host:"123.57.80.91:27025" }
]
}
rs.initiate( config) ;
启动 mongos 路由服务
./mongos --port 27026 --configdb config/123.57.80.91:27023,123.57.80.91:27024,123.57.80.91:27025 --bind_ip 0.0 .0.0 --fork --logpath /data/mongodb/shard/config/config.log
登录 mongos 服务
./mongo --port 27026
use admin
db.runCommand( { addshard:"r0/123.57.80.91:27017,123.57.80.91:27018" ,"allowLocal" :true } ) ;
db.runCommand( { addshard:"r1/123.57.80.91:27019,123.57.80.91:27020" ,"allowLocal" :true } ) ;
db.runCommand( { addshard:"r2/123.57.80.91:27021,123.57.80.91:27022" ,"allowLocal" :true } ) ;
db.runCommand( { enablesharding:"users" } ) ;
db.runCommand( { shardcollection: "users.user" , key: { _id:1} } ) ;
db.runCommand( { shardcollection: "users.emp" , key: { _id: "hashed" } } )
测试
./mongo --port 27026
use users ;
for( let i = 0 ; i< 1000 ; i++) {
db.user.insert( { _id:i, name:"java_" +i, age: i} ) ;
}
./mongo --port 27017
use users ;
db.user.count( ) ;
./mongo --port 27019
use users ;
db.user.count( ) ;
./mongo --port 27021
use users ;
db.user.count( ) ;
六、数据备份与恢复
https://www.mongodb.com/docs/database-tools/mongodump/
1、常规数据备份与恢复
1.1 备份 MongoDB 数据库(包括身份验证)
假设我们要备份一个名为 mydatabase
的 MongoDB 数据库,并将备份文件保存在 /backup
目录下。数据库的用户名是 myuser
,密码是 mypassword
,身份验证数据库是 admin
mongodump --host localhost --port 27017 --db mydatabase --username myuser --password mypassword --authenticationDatabase admin --out /backup
mongodump --host < hostname> --port < port> --db < database_name> --username < username> --password < password> --authenticationDatabase < auth_db> --out /backup
: MongoDB 主机名或 IP 地址
: MongoDB 端口,默认为 27017
: 要备份的数据库名称
: 用户名
: 用户密码
: 用户的身份验证数据库
/backup
: 备份文件输出目录
1.2 恢复 MongoDB 数据库(包括身份验证)
假设我们要从之前的备份文件恢复 mydatabase
数据库
mongorestore --host localhost --port 27017 --db mydatabase --username myuser --password mypassword --authenticationDatabase admin /backup/mydatabase
mongorestore --host < hostname> --port < port> --db < database_name> --username < username> --password < password> --authenticationDatabase < auth_db> /backup/< database_name>
: MongoDB 主机名或 IP 地址
: MongoDB 端口,默认为 27017
: 要恢复的数据库名称
: 用户名
: 用户密码
: 用户的身份验证数据库
/backup/
: 备份文件所在的目录
最后,基于docker的可以参考:基于docker的mongodump / mongorestore 备份恢复
你可能感兴趣的:(#,中间件,学习,笔记)
x86-64汇编语言训练程序与实战
十除以十等于一
本文还有配套的精品资源,点击获取简介:汇编语言是一种低级语言,与机器代码紧密相关,特别适用于编写系统级代码及性能要求高的应用。nasm编译器是针对x86和x86-64架构的汇编语言编译器,支持多种语法风格和指令集。项目Euler提供数学和计算机科学问题,鼓励编程技巧应用,前100个问题的答案可共享。x86-64架构扩展了寄存器数量并引入新指令,提升了数据处理效率。学习汇编语言能够深入理解计算机底层
三菱PLC全套学习资料及应用手册
good2know
本文还有配套的精品资源,点击获取简介:三菱PLC作为工业自动化领域的核心设备,其系列产品的学习和应用需要全面深入的知识。本次资料包为学习者提供从基础到进阶的全方位学习资源,包括各种型号PLC的操作手册、编程指南、软件操作教程以及实际案例分析,旨在帮助用户系统掌握PLC的编程语言、指令系统及在各类工业应用中的实施。1.三菱PLC基础知识入门1.1PLC的基本概念可编程逻辑控制器(PLC)是工业自动化
日更006 终极训练营day3
懒cici
人生创业课(2)今天的主题:学习方法一:遇到有用的书,反复读,然后结合自身实际,列践行清单,不要再写读书笔记思考这本书与我有什么关系,我在哪些地方能用到,之后我该怎么用方法二:读完书没映像怎么办?训练你的大脑,方法:每读完一遍书,立马合上书,做一场分享,几分钟都行对自己的学习要求太低,要逼自己方法三:学习深度不够怎么办?找到细分领域的榜样,把他们的文章、书籍、产品都体验一遍,成为他们的超级用户,向
day15|前端框架学习和算法
universe_01
前端 算法 笔记
T22括号生成先把所有情况都画出来,然后(在满足什么情况下)把不符合条件的删除。T78子集要画树状图,把思路清晰。可以用暴力法、回溯法和DFS做这个题DFS深度搜索:每个边都走完,再回溯应用:二叉树搜索,图搜索回溯算法=DFS+剪枝T200岛屿数量(非常经典BFS宽度把树状转化成队列形式,lambda匿名函数“一次性的小函数,没有名字”setup语法糖:让代码更简洁好写的语法ref创建:基本类型的
《极简思维》第三部分
小洋苏兮
整理你的人际关系如何改善人际关系?摘录:因为人际关系问题是人们生活中不快乐的主要原因。感想:感觉这个说的挺对,之前我总是埋头学习,不管舍友不管自己的合作伙伴的一些事情,但实际上,这学期关注了之后好多了摘录:“亲密关系与社交会让你健康而快乐。这是基础。太过于关注成就或不太关心人际关系的人都不怎么快乐。基本上来说,人类就是建立在人脉关系上的。”感想:但是如果有时想的太多就不太好,要以一个开放的心态跟别
你要记住,最重要的是:随时做好准备,为了你可能成为更好的自己,放弃现在的自己。
霖霖z
打卡人:周云日期:2018年11月09日【日精进打卡第180天】【知~学习】《六项精进》0遍共214遍《通篇》1遍共106遍《大学》2遍共347遍《坚强工作,温柔生活》ok《不抱怨的世界》104-108页《经典名句》你要记住,最重要的是:随时做好准备,为了你可能成为更好的自己,放弃现在的自己。【行~实践】一、修身:(对自己个人)1、坚持打卡二、齐家:(对家庭和家人)打扫卫生,接送孩子,洗衣做饭,陪
贫穷家庭的孩子考上985以后会怎样?
Mellisa蜜思言
我出生在一个贫穷的农村家庭,据我妈说,我出生的时候才4斤多,而她生完我以后月子里就瘦到70斤。家里一直很穷,父母都是在菜市场卖菜的,家里还有几亩地种庄稼的。我很小开始就要去帮忙,暑假的生活就是帮忙去卖菜和割稻谷,那时候自己对于割稻谷这种事情有着莫名的恐惧,生怕自己长大以后还是每年都要过着割稻谷这种日子。父母因为忙于生计无暇顾及我的学习,幸好我因为看到他们这样子的生活,内心里有深深的恐惧感,驱使着我
2019-06-05
第十七把巴鲁克
今天去实验田里实习,见到了福寿螺真的可怕且牛皮,六级也快来了,说实话还是害怕。我昨天考了环工原理,真的太难了,太烦了,理工科真的难,烦。实验报告还是没写,要抓紧速度抓紧时间,还是应该学会努力学习,远离一些不上进的事物。
为什么焦虑、抑郁、自残的青少年越来越多?
精神健康
很多家长觉得没缺孩子吃的穿的,他们有安稳的生活,他们有什么可焦虑、抑郁的,但现在的孩子,学习压力越来越大,每天休息的时间越来越少,出现焦虑抑郁是很正常的。从发展的角度看,青少年时期,人的身体、情绪,智力、人格都急剧发展,正从未成熟走向成熟,情绪起伏不定,易冲动,再者,由于缺乏生活经验,以及来自于家长、学校、社会的各种要求和压力,从而不知所措,心中的焦虑、恐惧、彷徨得不到及时的排解,从而导致心理上的
读书打卡《别想太多啦》
chenchen_68ed
第一,世间之事,不去尝试永远不知道其中的奥秘,在尝试中有失败是必然的。如果担心失败,那什么都学不会。第二,经历的失败越多,越会对失败者抱有宽容的态度,“原来如此,我也经历过类似的失败啦,那只是暂时的”。经历越多失败的长者,越能包容别人,这也就是所谓的“越年长越宽容”。成熟的人,就是在众多失败经历中不断学习,并接纳别人的失败。对于他人的小小过失不吹毛求疵,自己的心态会更加平和。在不断失败中学习,让自
2023-01-26
胡喜平
我觉得《可见的学习》一书确实从底层逻辑说清楚了,教学的本质。可是太多术语和概念,一时间难以消化啊。而且知道和懂得有距离,运用就更不行了,需要高手和专家的指导。我需要多听听新课标的讲座了,来反复印证。读论文也有了一点点灵感,明天修改我的论文。
平静得接受自己的笨拙 20190118 晨间日记
吴伯符
图片发自App最近做了一个关于微习惯的分享,这里有八个字:微量开始,超额完成。这里的言下之意其实是要你在一开始的时候,平静地接受自己的笨拙。接受自己的笨拙,理解自己的笨拙,放慢速度尝试,观察哪里可以改进,再反复练习,观察自己哪里可以再进一步改进,再反复…这是学习一切技能的必须的过程。这里的两个关键点是:1.尽快的开始这个过程,这就能够用到微习惯的微量开始。2.尽快的度过这个过程,这就需要用到超额完
【花了N长时间读《过犹不及》,不断练习,可以越通透】
君君Love
我已经记不清花了多长时间去读《过犹不及》,读书笔记都写了42页,这算是读得特别精细的了。是一本难得的好书,虽然书中很多内容和圣经吻合,我不是基督徒,却觉得这样的文字值得细细品味,和我们的生活息息相关。我是个界线建立不牢固的人,常常愧疚,常常害怕他人的愤怒,常常不懂拒绝,还有很多时候表达不了自己真实的感受,心里在说不嘴里却在说好……这本书给我很多的启示,让我学会了怎样去建立属于自己的清晰的界限。建立
二十四节气组诗 谷雨
离陌_6639
图片来源网络,若侵犯了你的权益,请联系我删除6.谷雨文/离陌背上行囊背上如行囊的我从此任行程马不停蹄今天家乡的田野春雨快马加鞭播下希望的种子观音不语目送着我和夏天一道在观音山出关图片来源网络,若侵犯了你的权益,请联系我删除你好啊,我是离陌,已然在懵懂中走过了16年的岁月,为了珍惜当下的每一秒,所以立志做一名终身学习者。文学对于我来说是一种信仰,诗歌是我的生命。人生之道,四通八达,即入文学,自当持之
你好,2020年
瑄瑄妍妍的妈咪
早上好,今天是2020年的第一天,也就是元旦,新年新的一天开始了。新的开始,重新规划未来的一年。从今天开始,用了一个新的记账软件,之前的随手记软件,也没有删除,只是重新下载了一个别的软件,开始一个新的记账旅程,对于理财开支,有个新的规划。通过小红书视频软件,学习了不少育儿知识,和各种不同的美食,以后动手制作,给宝宝做健康美味的营养餐。学习方面,继续学英语吧!虽然是抽出时间学的,进度也比较慢,但是积
基于redis的Zset实现作者的轻量级排名
周童學
Java redis 数据库 缓存
基于redis的Zset实现轻量级作者排名系统在今天的技术架构中,Redis是一种广泛使用的内存数据存储系统,尤其在需要高效检索和排序的场景中表现优异。在本篇博客中,我们将深入探讨如何使用Redis的有序集合(ZSet)构建一个高效的笔记排行榜系统,并提供相关代码示例和详细的解析。1.功能背景与需求假设我们有一个笔记分享平台,用户可以发布各种笔记,系统需要根据用户发布的笔记数量来生成一个实时更新的
常规笔记本和加固笔记本的区别
luchengtech
电脑 三防笔记本 加固计算机 加固笔记本
在现代科技产品中,笔记本电脑因其便携性和功能性被广泛应用。根据使用场景和需求的不同,笔记本可分为常规笔记本和加固笔记本,二者在多个方面存在显著区别。适用场景是区分二者的重要标志。常规笔记本主要面向普通消费者和办公人群,适用于家庭娱乐、日常办公、学生学习等相对稳定的室内环境。比如,人们在家用它追剧、处理文档,学生在教室用它完成作业。而加固笔记本则专为特殊行业设计,像军事、野外勘探、工业制造、交通运输
《云襄传》:云襄做的局是浑水摸鱼吗?
书生号贺
云襄入南都是要浑水摸鱼吗?他是云台的高材生吗?他为啥笃定师父一定会让他留在南都?他为啥觉得他能够做局成功?他是在经商吗?还是在经营人心与欲望?云襄是云台弟子,云台属千门的一支,另一支叫凌渊,云台教人经商之道,重智慧,凌渊以武力取胜,但倍受打压。云襄学习十五年,下高山奔越州,途经南洋,因恩人闻聪被害,囚于白驹镇,念于情分,被卷入这样一个局面里,结识了舒亚南与金十两,于是,复仇小组成立,目标是南都漕帮
心力践行营十二期一阶学习打卡
LX_王彤彤
姓名:王彤彤时间:2021年4月24日一:朗读师父的十大人生哲学二:师父的早安分享感悟很喜欢这句话:所有的行动都是基于目标的尝试,没有所谓的失败,只是不同尝试后得到的不同结果,让我们更好地调整下一次的行动。三:感恩日记1.我太幸福了,我很感恩姑姑,因为姑姑放假又投喂了我,还给我带了饺子回家,这让我感觉很幸福。谢谢,谢谢,谢谢。2.我太幸福了,我很感恩师父晚上的直播,因为听他的分享我知道怎么更好的去
为了在未来的人工智能世界中取得成功,学生们必须学习人类写作的优点
睿邸管家
澳大利亚各地的学生在新学年开始使用铅笔、钢笔和键盘学习写字。在工作场所,机器也在学习写作,如此有效,几年之内,它们可能会写得比人类更好。有时它们已经做到了,就像Grammarly这样的应用程序所展示的那样。当然,人类现在的日常写作可能很快就会由具有人工智能(AI)的机器来完成。手机和电子邮件软件常用的预测文本是无数人每天都在使用的一种人工智能写作形式。据AI行业研究机构称,到2022年,人工智能及
闭组进行时...
李亚青_强化班
今天是2019年12月1号距离开始三月学习的日子:2019年10月07,已经过去将近两个月,回顾这一阶段的学习,收获了什么?又学会了什么呢?图片发自App我想,收获最大的就是身边这一群人吧,有和蔼可亲的学姐,贴心的学长,嬉戏打闹,玩的不亦乐乎,但也同样认真踏实学习小伙伴图片发自App本以为在这样的时刻,有太多太多话,太多太多想法想要表达,可言到此处,又觉得似乎没有什么想要说的了还是那句话,幸运遇到
2021-10-23
赵甄文的幸福
秀荣感恩日记Day42[烟花]感恩语录感恩自己有能力有好身体,可以到处走动,做自己想做的事情10.23感恩日记今天做的事情瑜伽一小时户外散步一小时泡脚20分钟学习打卡和孩子沟通[爱心]感动的瞬间今天瑜伽回来,发现老公在厨房里做鱼。每次老公有时间休息的时候都会给我做硬菜。刘姐约我一起去公园散步晒太阳。虽然完美错过,但心里还是暖暖的。每天睁开眼打开手机,先去自己的群里逛一逛,每每发现有人点赞或者互动都
孤独的守候
怒吼的生命
孤独了时光岁月了寂寞带来了惆怅那些孤独的日子里我们珍惜奋斗起来品味人生的真谛做到更好奋斗当中的你是那么努力格外自律学习起来五彩斑斓那些日子时光匆匆人生的机会很多需要把握痛苦的回忆记得住那些忧愁孤苦五一的日子寂寞当中的你时光荏苒独自带给我荒草学习起来努力奋斗可是我们做的还不够把握发展生活带给我们更多希望静静的述说你的故事你的精彩人生当中我们总是努力把握生活带给我们更多的学习生活当中我们奋斗可是做的还
第八课: 写作出版你最关心的出书流程和市场分析(无戒学堂复盘)
人在陌上
今天是周六,恰是圣诞节。推掉了两个需要凑腿的牌局,在一个手机,一个笔记本,一台电脑,一杯热茶的陪伴下,一个人静静地回听无戒学堂的最后一堂课。感谢这一个月,让自己的习惯开始改变,至少,可以静坐一个下午而不觉得乏味枯燥难受了,要为自己点个赞。我深知,这最后一堂课的内容,以我的资质和毅力,可能永远都用不上。但很明显,无戒学堂是用了心的,毕竟,有很多优秀学员,已经具备了写作能力,马上就要用到这堂课的内容。
AI模型训练中过拟合和欠拟合的区别是什么?
workflower
人工智能 算法 人工智能 数据分析
在AI模型训练中,过拟合和欠拟合是两种常见的模型性能问题,核心区别在于模型对数据的学习程度和泛化能力:欠拟合(Underfitting)-定义:模型未能充分学习到数据中的规律,对训练数据的拟合程度较差,在训练集和测试集上的表现都不好(如准确率低、损失值高)。-原因:-模型结构过于简单(如用线性模型解决非线性问题);-训练数据量不足或特征信息不充分;-训练时间太短,模型尚未学到有效模式。-表现:训练
2018-08-29精进打卡
米兰王
姓名:王兰英【日精进打卡第25天】【知~学习】《六项精进》1遍共39遍《大学》1遍共50遍【经典名句分享】一切都是最好的安排。【行~实践】一、修身:(对自己个人)1,散步1小时。2,每天坚持读书。二、齐家:(对家庭和家人)1,指导孩子开车。2,和家人一起逛超市。三、建功:(对工作)用心做好每件事。{积善}:发愿从2018年8月5日起1年内365个善事。今日1善,累计27善。【省~觉悟】正人先正己。
python笔记14介绍几个魔法方法
抢公主的大魔王
python python
python笔记14介绍几个魔法方法先声明一下各位大佬,这是我的笔记。如有错误,恳请指正。另外,感谢您的观看,谢谢啦!(1).__doc__输出对应的函数,类的说明文档print(print.__doc__)print(value,...,sep='',end='\n',file=sys.stdout,flush=False)Printsthevaluestoastream,ortosys.std
陶勇:要不要参加分班考试学习?看完再说。
陶勇
每年到了升学季,有很多培训机构都特别忙,为什么呢?因为有成千上万的学生,会选择升学前的分班考试的培训。比如说,小升初的孩子,到了暑假,很多孩子都会去选择一个初中,初一的分班考试的培训,那考入高中的孩子也有很多孩子会选择这种新高一的分班考试的培训。当然了,我个人认为这种选择并不是孩子自身的选择,主要还是家长的选择。当然也有少数孩子会对自己有比较高的要求,他们也会主动的去选择。为什么要去上分班考试的这
《感官品牌》读书笔记 1
西红柿阿达
原文:最近我在东京街头闲逛时,与一位女士擦肩而过,我发现她的香水味似曾相识。“哗”的一下,记亿和情感立刻像潮水般涌了出来。这个香水味把我带回了15年前上高中的时候,我的一位亲密好友也是用这款香水。一瞬间,我呆站在那里,东京的街景逐渐淡出,取而代之的是我年少时的丹麦以及喜悦、悲伤、恐惧、困惑的记忆。我被这熟悉的香水味征服了。感想:感官是有记忆的,你所听到,看到,闻到过的有代表性的事件都会在大脑中深深
Anaconda 和 Miniconda:功能详解与选择建议
古月฿
python入门 python conda
Anaconda和Miniconda详细介绍一、Anaconda的详细介绍1.什么是Anaconda?Anaconda是一个开源的包管理和环境管理工具,在数据科学、机器学习以及科学计算领域发挥着关键作用。它以Python和R语言为基础,为用户精心准备了大量预装库和工具,极大地缩短了搭建数据科学环境的时间。对于那些想要快速开展数据分析、模型训练等工作的人员来说,Anaconda就像是一个一站式的“数
深入浅出Java Annotation(元注解和自定义注解)
Josh_Persistence
Java Annotation 元注解 自定义注解
一、基本概述
Annontation是Java5开始引入的新特征。中文名称一般叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。
更通俗的意思是为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且是供指定的工具或
mysql优化特定类型的查询
annan211
java 工作 mysql
本节所介绍的查询优化的技巧都是和特定版本相关的,所以对于未来mysql的版本未必适用。
1 优化count查询
对于count这个函数的网上的大部分资料都是错误的或者是理解的都是一知半解的。在做优化之前我们先来看看
真正的count()函数的作用到底是什么。
count()是一个特殊的函数,有两种非常不同的作用,他可以统计某个列值的数量,也可以统计行数。
在统
MAC下安装多版本JDK和切换几种方式
棋子chessman
jdk
环境:
MAC AIR,OS X 10.10,64位
历史:
过去 Mac 上的 Java 都是由 Apple 自己提供,只支持到 Java 6,并且OS X 10.7 开始系统并不自带(而是可选安装)(原自带的是1.6)。
后来 Apple 加入 OpenJDK 继续支持 Java 6,而 Java 7 将由 Oracle 负责提供。
在终端中输入jav
javaScript (1)
Array_06
JavaScript java 浏览器
JavaScript
1、运算符
运算符就是完成操作的一系列符号,它有七类: 赋值运算符(=,+=,-=,*=,/=,%=,<<=,>>=,|=,&=)、算术运算符(+,-,*,/,++,--,%)、比较运算符(>,<,<=,>=,==,===,!=,!==)、逻辑运算符(||,&&,!)、条件运算(?:)、位
国内顶级代码分享网站
袁潇含
java jdk oracle .net PHP
现在国内很多开源网站感觉都是为了利益而做的
当然利益是肯定的,否则谁也不会免费的去做网站
&
Elasticsearch、MongoDB和Hadoop比较
随意而生
mongodb hadoop 搜索引擎
IT界在过去几年中出现了一个有趣的现象。很多新的技术出现并立即拥抱了“大数据”。稍微老一点的技术也会将大数据添进自己的特性,避免落大部队太远,我们看到了不同技术之间的边际的模糊化。假如你有诸如Elasticsearch或者Solr这样的搜索引擎,它们存储着JSON文档,MongoDB存着JSON文档,或者一堆JSON文档存放在一个Hadoop集群的HDFS中。你可以使用这三种配
mac os 系统科研软件总结
张亚雄
mac os
1.1 Microsoft Office for Mac 2011
大客户版,自行搜索。
1.2 Latex (MacTex):
系统环境:https://tug.org/mactex/
&nb
Maven实战(四)生命周期
AdyZhang
maven
1. 三套生命周期 Maven拥有三套相互独立的生命周期,它们分别为clean,default和site。 每个生命周期包含一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段,用户和Maven最直接的交互方式就是调用这些生命周期阶段。 以clean生命周期为例,它包含的阶段有pre-clean, clean 和 post
Linux下Jenkins迁移
aijuans
Jenkins
1. 将Jenkins程序目录copy过去 源程序在/export/data/tomcatRoot/ofctest-jenkins.jd.com下面 tar -cvzf jenkins.tar.gz ofctest-jenkins.jd.com &
request.getInputStream()只能获取一次的问题
ayaoxinchao
request Inputstream
问题:在使用HTTP协议实现应用间接口通信时,服务端读取客户端请求过来的数据,会用到request.getInputStream(),第一次读取的时候可以读取到数据,但是接下来的读取操作都读取不到数据
原因: 1. 一个InputStream对象在被读取完成后,将无法被再次读取,始终返回-1; 2. InputStream并没有实现reset方法(可以重
数据库SQL优化大总结之 百万级数据库优化方案
BigBird2012
SQL优化
网上关于SQL优化的教程很多,但是比较杂乱。近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充。
这篇文章我花费了大量的时间查找资料、修改、排版,希望大家阅读之后,感觉好的话推荐给更多的人,让更多的人看到、纠正以及补充。
1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where
jsonObject的使用
bijian1013
java json
在项目中难免会用java处理json格式的数据,因此封装了一个JSONUtil工具类。
JSONUtil.java
package com.bijian.json.study;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
[Zookeeper学习笔记之六]Zookeeper源代码分析之Zookeeper.WatchRegistration
bit1129
zookeeper
Zookeeper类是Zookeeper提供给用户访问Zookeeper service的主要API,它包含了如下几个内部类
首先分析它的内部类,从WatchRegistration开始,为指定的znode path注册一个Watcher,
/**
* Register a watcher for a particular p
【Scala十三】Scala核心七:部分应用函数
bit1129
scala
何为部分应用函数?
Partially applied function: A function that’s used in an expression and that misses some of its arguments.For instance, if function f has type Int => Int => Int, then f and f(1) are p
Tomcat Error listenerStart 终极大法
ronin47
tomcat
Tomcat报的错太含糊了,什么错都没报出来,只提示了Error listenerStart。为了调试,我们要获得更详细的日志。可以在WEB-INF/classes目录下新建一个文件叫logging.properties,内容如下
Java代码
handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHa
不用加减符号实现加减法
BrokenDreams
实现
今天有群友发了一个问题,要求不用加减符号(包括负号)来实现加减法。
分析一下,先看最简单的情况,假设1+1,按二进制算的话结果是10,可以看到从右往左的第一位变为0,第二位由于进位变为1。
 
读《研磨设计模式》-代码笔记-状态模式-State
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
/*
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类
状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况
把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化
如果在
CUDA程序block和thread超出硬件允许值时的异常
cherishLC
CUDA
调用CUDA的核函数时指定block 和 thread大小,该大小可以是dim3类型的(三维数组),只用一维时可以是usigned int型的。
以下程序验证了当block或thread大小超出硬件允许值时会产生异常!!!GPU根本不会执行运算!!!
所以验证结果的正确性很重要!!!
在VS中创建CUDA项目会有一个模板,里面有更详细的状态验证。
以下程序在K5000GPU上跑的。
诡异的超长时间GC问题定位
chenchao051
jvm cms GC hbase swap
HBase的GC策略采用PawNew+CMS, 这是大众化的配置,ParNew经常会出现停顿时间特别长的情况,有时候甚至长到令人发指的地步,例如请看如下日志:
2012-10-17T05:54:54.293+0800: 739594.224: [GC 739606.508: [ParNew: 996800K->110720K(996800K), 178.8826900 secs] 3700
maven环境快速搭建
daizj
安装 mavne 环境配置
一 下载maven
安装maven之前,要先安装jdk及配置JAVA_HOME环境变量。这个安装和配置java环境不用多说。
maven下载地址:http://maven.apache.org/download.html,目前最新的是这个apache-maven-3.2.5-bin.zip,然后解压在任意位置,最好地址中不要带中文字符,这个做java 的都知道,地址中出现中文会出现很多
PHP网站安全,避免PHP网站受到攻击的方法
dcj3sjt126com
PHP
对于PHP网站安全主要存在这样几种攻击方式:1、命令注入(Command Injection)2、eval注入(Eval Injection)3、客户端脚本攻击(Script Insertion)4、跨网站脚本攻击(Cross Site Scripting, XSS)5、SQL注入攻击(SQL injection)6、跨网站请求伪造攻击(Cross Site Request Forgerie
yii中给CGridView设置默认的排序根据时间倒序的方法
dcj3sjt126com
GridView
public function searchWithRelated() {
$criteria = new CDbCriteria;
$criteria->together = true; //without th
Java集合对象和数组对象的转换
dyy_gusi
java集合
在开发中,我们经常需要将集合对象(List,Set)转换为数组对象,或者将数组对象转换为集合对象。Java提供了相互转换的工具,但是我们使用的时候需要注意,不能乱用滥用。
1、数组对象转换为集合对象
最暴力的方式是new一个集合对象,然后遍历数组,依次将数组中的元素放入到新的集合中,但是这样做显然过
nginx同一主机部署多个应用
geeksun
nginx
近日有一需求,需要在一台主机上用nginx部署2个php应用,分别是wordpress和wiki,探索了半天,终于部署好了,下面把过程记录下来。
1. 在nginx下创建vhosts目录,用以放置vhost文件。
mkdir vhosts
2. 修改nginx.conf的配置, 在http节点增加下面内容设置,用来包含vhosts里的配置文件
#
ubuntu添加admin权限的用户账号
hongtoushizi
ubuntu useradd
ubuntu创建账号的方式通常用到两种:useradd 和adduser . 本人尝试了useradd方法,步骤如下:
1:useradd
使用useradd时,如果后面不加任何参数的话,如:sudo useradd sysadm 创建出来的用户将是默认的三无用户:无home directory ,无密码,无系统shell。
顾应该如下操作:
第五章 常用Lua开发库2-JSON库、编码转换、字符串处理
jinnianshilongnian
nginx lua
JSON库
在进行数据传输时JSON格式目前应用广泛,因此从Lua对象与JSON字符串之间相互转换是一个非常常见的功能;目前Lua也有几个JSON库,本人用过cjson、dkjson。其中cjson的语法严格(比如unicode \u0020\u7eaf),要求符合规范否则会解析失败(如\u002),而dkjson相对宽松,当然也可以通过修改cjson的源码来完成
Spring定时器配置的两种实现方式OpenSymphony Quartz和java Timer详解
yaerfeng1989
timer quartz 定时器
原创整理不易,转载请注明出处:Spring定时器配置的两种实现方式OpenSymphony Quartz和java Timer详解
代码下载地址:http://www.zuidaima.com/share/1772648445103104.htm
有两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz。
1.Java Timer定时
首先继承jav
Linux下df与du两个命令的差别?
pda158
linux
一、df显示文件系统的使用情况,与du比較,就是更全盘化。 最经常使用的就是 df -T,显示文件系统的使用情况并显示文件系统的类型。 举比例如以下: [root@localhost ~]# df -T Filesystem Type &n
[转]SQLite的工具类 ---- 通过反射把Cursor封装到VO对象
ctfzh
VO android sqlite 反射 Cursor
在写DAO层时,觉得从Cursor里一个一个的取出字段值再装到VO(值对象)里太麻烦了,就写了一个工具类,用到了反射,可以把查询记录的值装到对应的VO里,也可以生成该VO的List。
使用时需要注意:
考虑到Android的性能问题,VO没有使用Setter和Getter,而是直接用public的属性。
表中的字段名需要和VO的属性名一样,要是不一样就得在查询的SQL中
该学习笔记用到的Employee表
vipbooks
oracle sql 工作
这是我在学习Oracle是用到的Employee表,在该笔记中用到的就是这张表,大家可以用它来学习和练习。
drop table Employee;
-- 员工信息表
create table Employee(
-- 员工编号
EmpNo number(3) primary key,
-- 姓