表
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 备份恢复
你可能感兴趣的:(#,中间件,学习,笔记)
Kotlin学习5.4:Map接口
CNwanku
Kotlin入门学习 Kotlin
Kotlin学习5.4:Map接口Map接口简介不可变Map查询操作遍历操作可变MutableMap修改操作批量操作Map接口简介Map接口是一种双列集合,它的每个元素都包含一个键对象Key和一个值对象Value,键和值对象之间存在一种对应关系,称为映射。从Map集合中访问元素时,只要指定了Key就能找到对应的Value。Map集合中的元素是无序可重复的,Map集合与List、Set集合类似,同样
基于Python编程语言实现“机器学习”,用于车牌识别项目
我的sun&shine
Python python 机器学习 计算机视觉
基于Python的验证码识别研究与实现1.摘要验证码的主要目的是区分人类和计算机,用来防止自动化脚本程序对网站的一些恶意行为,目前绝大部分网站都利用验证码来阻止恶意脚本程序的入侵。验证码的自动识别对于减少自动登录时长,识别难以识别的验证码图片有着重要的作用。对验证码图像进行灰度化、二值化、去离散噪声、字符分割、归一化、特征提取、训练和字符识别等过程可以实现验证码自动识别。首先将原图片进行灰度化处理
6.8:Python如何处理文件写入时出现的错误?
小兔子平安
Python完整学习全解答 java windows html
Python是一种功能强大且易于学习的编程语言,已经成为了当今最流行的编程语言之一。随着Python应用领域的不断扩大,越来越多的人开始学习Python,希望能够掌握这个有用的工具,从而实现更多的创意和创新。而文件操作是Python编程中不可或缺的一部分,对于处理文件写入时的错误更是必须掌握的技能。本文主要介绍如何处理Python中文件写入时的错误。我们将详细讲解如何使用try-except语句、
学习记录之游标翻页实现
sjsjsbbsbsn
Java学习之路 项目实战技巧 java mysql redis
游标翻页本方案参考mallchat实现一.深翻页问题普通翻页前端一般会有个分页条。能够指定一页的条数,以及任意选择查看第几页,假设我们想查询第11页的内容传递过来的参数为:pageNo=11,pageSize=10对应的sql查询为:select*fromtablelimit100,10其中100代表需要跳过的条数,10代表跳过指定条数后,往后需要再取的条数。假设翻页到1w条,那我们要先扫描到这1
docker学习整理
24k小善
java 大数据 云计算
一、Docker核心原理:像租房装修一样理解容器1.1容器vs虚拟机:合租vs买别墅虚拟机就像买别墅:每个别墅(虚拟机)自带独立地基(操作系统)、水电系统(系统资源),启动慢(分钟级)、资源占用大(GB级)[1][10]容器就像合租:大家共享小区基础设施(宿主机内核),但每个房间(容器)有自己的家具摆放(应用和依赖)。轻量(MB级)、秒级启动,还能随时搬走(迁移)[9]1.2镜像分层:乐高积木式打
【自学笔记】Linux基础知识点总览-持续更新
Long_poem
笔记 linux 运维
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录Linux基础知识点总览目录Linux简介文件和目录结构常用命令文件操作目录操作权限管理文本处理Shell脚本基础进程管理用户和组管理网络配置总结Linux基础知识点总览目录Linux简介文件和目录结构常用命令文件操作目录操作权限管理文本处理Shell脚本基础进程管理用户和组管理网络配置Linux简介Linux是一个基于Uni
使用Dall-E生成图像:文本到图像的魔力
shuoac
计算机视觉 人工智能 python
使用Dall-E生成图像:文本到图像的魔力技术背景介绍Dall-E是OpenAI开发的一个强大的文本到图像生成模型,它能够根据自然语言描述创造出全新的数字图像。这一技术基于深度学习的方法,使得创意与AI图像生成的结合更具可能性。本文将介绍如何调用Dall-EAPI来生成图像,从而使开发者能够将这一技术应用到自己的项目中。核心原理解析Dall-E利用大型语言模型(LLM)从用户提供的文本描述中提取详
DS/ML:数据科学技术之数据科学生命周期(四大层次+机器学习六大阶段+数据挖掘【5+6+6+4+4+1】步骤)的全流程最强学习路线讲解之详细攻略
一个处女座的程序猿
资深文章(前沿/经验/创新) DataScience ML 数据科学 数据科学的生命周期 机器学习
DS/ML:数据科学技术之数据科学生命周期(四大层次+机器学习六大阶段+数据挖掘【5+6+6+4+4+1】步骤)的全流程最强学习路线讲解之详细攻略导读:本文章是博主在数据科学和机器学习领域,先后实战过几百个应用案例之后的精心总结,应该是完全覆盖了数据科学的整个生命周期及其各个阶段的要点。其中机器学习领域六大阶段更是在整个数据科学生命周期中扮演着极其重要的角色。同时,因为涉及到博主出书中出版社要求在
【从零开始学习计算机科学】软件测试(三)回归测试、系统测试 与 验收测试
贫苦游商
学习 软件测试 回归测试 系统测试 验收测试 测试工具 ab测试
【从零开始学习计算机科学】软件测试(三)回归测试、系统测试与验收测试回归测试回归测试的组织和实施回归测试集回归测试的范围自动回归测试框架自动回归测试框架的技术特点回归测试克服的几个问题回归测试人员应掌握的测试手段回归用例库的维护系统测试系统测试的组织和分工系统测试的过程系统测试方法用户界面测试用户界面测试-符合标准和规范用户界面测试-一致性用户界面测试-直观性用户界面测试-灵活性用户界面测试-舒适
零基础上手Python数据分析 (6):Python 异常处理,告别程序崩溃的烦恼!
kakaZhui
python 数据分析 数据库 excel 数据挖掘
回顾一下,前几篇博客我们学习了Python的基本语法、数据结构和文件操作。现在,我们已经掌握了Python编程的基础知识,可以开始编写更复杂的数据分析代码了。但是,在实际的数据分析工作中,程序并非总能一帆风顺地运行,总会遇到各种意外情况,例如:文件找不到:程序尝试读取一个不存在的数据文件。数据格式错误:数据文件中包含非预期的格式,例如本应是数字的列包含了文本。网络连接中断:程序尝试从网络获取数据,
【深度学习|地学应用】滑坡灾害早期隐患的概念、特征及识别方法,同时解释其与人工边坡、滑坡易发性之间的联系与区别。
985小水博一枚呀
深度学习 人工智能
【深度学习|地学应用】滑坡灾害早期隐患的概念、特征及识别方法,同时解释其与人工边坡、滑坡易发性之间的联系与区别。【深度学习|地学应用】滑坡灾害早期隐患的概念、特征及识别方法,同时解释其与人工边坡、滑坡易发性之间的联系与区别。文章目录【深度学习|地学应用】滑坡灾害早期隐患的概念、特征及识别方法,同时解释其与人工边坡、滑坡易发性之间的联系与区别。1.滑坡灾害早期隐患的概念与特征概念主要特征2.通过光学
c++算法赛万能模板个人笔记适用蓝桥杯,天梯赛,acm等赛事
a东方青
个人笔记 c++ 算法 笔记
算法笔记-更新与2025-3-22点赞收藏+关注持续更新算法基础二分整数二分//在一个单调区间里面去找答案boolcheck(intx){/*...*/}//检查x是否满足某种性质//区间[l,r]被划分成[l,mid]和[mid+1,r]时使用:intbsearch_1(intl,intr){while(l>1;if(check(mid))r=mid;//check()判断mid是否满足性质el
【Azure 架构师学习笔记】- Azure Networking(1) -- Service Endpoint 和 Private Endpoint
發糞塗牆
Azure 架构师学习笔记 Azure 网络安全 azure Network
本文属于【Azure架构师学习笔记】系列。本文属于【AzureNetworking】系列。前言最近公司的安全部门在审计云环境安全性时经常提到serviceendpoint(SE)和priavateendpoint(PE)的术语,为此做了一些研究储备。云计算的本质就是网络,默认情况下资源间及外部都是通过公网也就是互联网访问。为了安全,Azure引入了SE和PE等服务。云环境网络流动主要有两个:inb
MySQL 8.0新特性深度解析:窗口函数与JSON数据处理的10大技巧
墨瑾轩
一起学学数据库【一】 mysql json
关注墨瑾轩,带你探索编程的奥秘!超萌技术攻略,轻松晋级编程高手技术宝库已备好,就等你来挖掘订阅墨瑾轩,智趣学习不孤单即刻启航,编程之旅更有趣第1章:MySQL8.0简介嗨,亲爱的小伙伴们!欢迎来到MySQL8.0的奇妙世界,这里充满了新鲜和惊喜。MySQL8.0是一个数据库界的超级英雄,它带着一系列令人兴奋的新特性,比如窗口函数和JSON数据处理,来拯救我们的数据处理任务。1.1MySQL8.0的
SOFABoot-01-蚂蚁金服开源的 sofaboot 是什么黑科技?
后端java
前言大家好,我是老马。sofastack其实出来很久了,第一次应该是在2022年左右开始关注,但是一直没有深入研究。最近想学习一下SOFA对于生态的设计和思考。sofaboot系列SOFABoot-00-sofaboot概览SOFABoot-01-蚂蚁金服开源的sofaboot是什么黑科技?SOFABoot-02-模块化隔离方案SOFABoot-03-sofaboot介绍SOFABoot-04-快
SOFABoot-00-sofaboot 概览
后端java
sofaboot前言大家好,我是老马。sofastack其实出来很久了,第一次应该是在2022年左右开始关注,但是一直没有深入研究。最近想学习一下SOFA对于生态的设计和思考。sofaboot系列SOFABoot-00-sofaboot概览SOFABoot-01-蚂蚁金服开源的sofaboot是什么黑科技?SOFABoot-02-模块化隔离方案SOFABoot-03-sofaboot介绍SOFAB
NLP高频面试题(七)——GPT和Bert的mask有什么区别?
Chaos_Wang_
NLP常见面试题 自然语言处理 gpt bert
GPT和BERT的Mask机制对比:核心区别与优化策略在NLP领域,GPT和BERT是最具代表性的预训练语言模型之一。它们都在训练过程中使用了Mask机制来引导模型学习语言表示,但具体实现方式和目标却有所不同。本文将深入探讨GPT和BERT的Mask方法的核心区别,并分析其优化策略。1.BERT的Mask机制:基于MLM(MaskedLanguageModel)BERT(Bidirectional
计算机基础:编码02,有符号数编码,原码
水饺编程
MFC学习笔记 Win32学习笔记 c++ windows mfc c语言
专栏导航本节文章分别属于《Win32学习笔记》和《MFC学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。(一)WIn32专栏导航上一篇:计算机基础:编码01,无符号数编码回到目录下一篇:计算机基础:编码03,根据十进制数,求其原码(二)MFC专栏导航上一篇:计算机基础:编码01,无符号数编码回到目录下一篇:计算机基础:编码03,根据十进制数,求其原码本节前言上一节,我是讲解
我的编程学习之旅
Stars·ꦿ໊ོ
学习
大家好,我是一名编程领域的初学者,怀揣着对代码世界的无限热忱,踏上了这充满挑战与惊喜的学习之路。我并非本科出身,在过往的学习,逐渐被编程的魅力所吸引。日常里,我喜欢拆解电子产品、探究其原理,这份好奇心也驱使我深入代码的海洋,期望能从软件层面创造更多“奇迹”。如今,我选择从C语言开始敲开编程世界的大门,它作为一门基础且强大的编程语言,有着广泛的应用场景,无论是底层系统开发、嵌入式编程,还是对理解计算
「Kubernetes Objects」- Service(学习笔记) @20210227
k4nzdroid
Service,服务,用于暴露Pod以供访问。官方文档及手册KubernetesAPIv1.18/Servicev1coreService?Pod会被创建,并且还会消失,这由ReplicaSets控制。每个Pod都有自己的IP地址,但是这些IP地址不能视为可靠的。那么,如果前端的一部分Pod依赖于后端的Pod,那前端的这些Pod如何找出并追踪后端的Pod?ServiceService是一个抽象,定
k8s学习笔记(3)--- kubernetes核心技术概念
梦谜
k8s基础知识 k8基本核心概念
kubernetes核心技术概念1.容器(Container)2.API对象3.集群(Cluster)4.Master5.Node6.Pod7.复制控制器(ReplicationController,RC)8.副本集(ReplicaSet,RS)9.部署(Deployment)10.服务(Service)11.任务(Job)12.定时任务(CronJob)13.后台支撑服务集(DaemonSet)
关于Go那些懒得看又不得不知道的东西
Hock2024
golang 开发语言 后端
写在前面当开始学习go,亦或是cpp、还是java向go进行转职,这部分内容都是比较重要的。go的编译环境,模块管理以及一些基本的语法我认为还是很有必要去学习的,因此重新学习了这个部分并且写下下面的学习笔记!如果有写错或者不全面的地方,还希望大家及时纠正和指导。连接环境首先,作为一个后端er,能使用linux系统是必备的技能,这里我建议可以使用Xshell连接云服务器的方案来完成。云服务器建议使用
C语言基础与进阶学习指南(附运行效果图及术语解析)
算法练习生
C语言 c语言 开发语言
C语言基础与进阶学习指南(附运行效果图及术语解析)目录C语言标准与编译流程CPU与内存基础C语言基础语法数据类型详解变量与内存管理运算符与表达式输入输出函数函数与内存管理指针与内存操作结构体与高级应用1.C语言标准与编译流程1.1C语言标准演进K&RC(1978):最初由DennisRitchie和BrianKernighan开发,无标准,依赖文档。ANSIC/C89(1989):首个国际标准,定
给普通人看的深度学习说明书:用快递系统理解AI如何思考
嵌入式Jerry
Python AI 人工智能 深度学习
第一章:理解AI的思维方式(快递版)1.1快递分拣站的故事假设你管理一个快递分拣站:传统方法:手动制定规则(比如根据邮编分拣)机器学习:观察老员工的分拣记录,总结规律深度学习:搭建自动分拣流水线,自主发现隐藏规则1.2神经网络就像智能分拣机传送带(输入层):接收包裹信息(图片像素/文字等)#就像扫描快递单input_data=[0.2,0.7,0.1]#归一化后的特征数据分拣工人(隐藏层):每个工
AI学习资料|3月最新版可下载
2501_91122183
人工智能 学习
AI学习资料:https://pan.quark.cn/s/d7452a3222d8都说AI是2025年新的风口,都想成为站在风口上的猪,可如何学习AI却成了拦住大多数人的第一道门槛。其实,学习AI很简单,你缺的只是一个信息差!这段时间,清华北大出品AI教学资料,火遍全网,从基础知识到实操应用,各种应用场景和进阶玩法讲解。即便是零基础新人也能轻松上手,从入门到精通。资料我已经帮大家整理好了,放在最
AI学习手册合集|零基础入门宝典
2501_91234994
pdf
DeepSsek资料包:https://pan.quark.cn/s/2672e0be6178现在AI持续火热,越来越多的人开始使用AI辅助工作,大大提高了生产效率。甚至很多自由职业者,通过学习DeepSeek,在互联网淘金日入过万,登上热搜。普通人如何高效入门AI?清华团队亲自下场教学!自从第一弹AI学习手册《DeepSeek入门到精通》火了后,清华大学接连发布多版AI进阶资料,即便零基础也能轻
简单理解机器学习中top_k、top_p、temperature三个参数的作用
无级程序员
机器学习 人工智能
在机器学习中,top_k、top_p和temperature是用于控制生成模型(如语言模型)输出质量的参数,尤其在文本生成任务中常见。然而,网上文章很多很全,但大多晦涩难懂,今天我们来用最简单的语言谈谈它们的具体作用:1.点菜式筛选法:top_k参数英文全称:top-k中文名称:前k个具体意义:top_k参数就像是你在餐厅点菜时,服务员只给你推荐菜单上前k名的招牌菜。在AI文本生成中,top_k参
复习Linux的常用指令
一直开心
linux 常用指令的学习笔记
https://zhuanlan.zhihu.com/p/385065437https://zhuanlan.zhihu.com/p/385065437参考:tar指令的学习linux常用命令(2):tar命令(压缩文件/解压缩文件)_tar压缩-CSDN博客zip指令的学习Linuxzip命令|菜鸟教程tar的工作过程主要分为两个步骤,正向是打包与压缩,反向是解压缩与还原。打包指的是将一大堆文件
Adb与monkey命令学习总结
你醉牛啤
手机测试 adb 软件测试
主要内容adb构成和工作原理adb常用命令查看当前连接设备安装apk文件卸载APP获取包名和界面名adbshellam/pmadb文件传输其他常用命令monkey常用命令事件数频率–throttle(毫秒),延时操作指定执行的应用–p日志-v调试选项完整应用monkey命令进行稳定性测试adb构成和工作原理全称:AndroidDebugBridge就是起到调试桥的作用。顾名思义,adb就是一个de
jquery基础和导航栏
声声codeGrandMaster
django python 后端
jquery基础和导航栏目录1jQuery基础2jQuery事件3jQuery影藏和显示4jQuery滑动5、区块属性6、导航栏1jQuery基础介绍jQuery是一个JavaScript库。jQuery极大地简化了JavaScript编程。jQuery很容易学习。基础语法:$(selector).action()美元符号定义jQuery选择符(selector)“查询"和"查找”HTML元素jQ
深入浅出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,
-- 姓