搜索词>>mongodb Java驱动下载 耗时0.0840
  • Java MongoDB驱动程序

    Java MongoDB驱动程序,下载/升级,Java驱动程序兼容性,第三方框架和库<h1>Java MongoDB驱动程序</h1> <p>在这个页面上</p> <ul> <li><a href="https://docs.mongodb.com/ecosystem/drivers/java/#driver-features" id="id3" rel="nofollow" target="_blank">驱动程序特点</a></li> <li><a href="https://docs.mongodb.com/ecosystem/drivers/java/#download-upgrade" id="id4" rel="nofollow" target="_blank">下载/升级</a></li> <li><a href="https://docs.mongodb.com/ecosystem/drivers/java/#java-driver-compatibility" id="id5" rel="nofollow" target="_blank">Java驱动程序兼容性</a></li> <li><a href="https://docs.mongodb.com/ecosystem/drivers/java/#third-party-frameworks-and-libraries" id="id6" rel="nofollow" target="_blank">第三方框架和图书馆</a></li> <li><a href="https://docs.mongodb.com/ecosystem/drivers/java/#additional-resources" id="id7" rel="nofollow" target="_blank">其他资源</a></li> </ul> <p>从3.0版本开始,官方MongoDB Java驱动程序提供与MongoDB的同步和异步交互。有关官方MongoDB Java Driver参考资料,请参阅:</p> <ul> <li><a href="http://mongodb.github.io/mongo-java-driver/" rel="nofollow" target="_blank">MongoDB Java驱动程序文档</a></li> <li><a href="http://api.mongodb.com/java/current" rel="nofollow" target="_blank">MongoDB Java驱动程序API文档</a></li> </ul> <h2>驱动程序特性</h2> MongoDB驱动<br /> 一个更新的Java驱动程序,其中包括传统的API以及符合新的跨驱动程序CRUD规范的新的通用MongoCollection界面。有关Java驱动程序的文档,包括入门指南,请参阅<a href="http://mongodb.github.io/mongo-java-driver/3.2/driver/" rel="nofollow" target="_blank">Java驱动程序文档</a>。<br /> MongoDB异步驱动<br /> 一种新的异步API,可以利用Netty或Java 7的AsynchronousSocketChannel快速和非阻塞IO。有关Async Java驱动程序(包括入门指南)的<a href="http://mongodb.github.io/mongo-java-driver/3.2/driver-async/" rel="nofollow" target="_blank">文档</a>,请参阅<a href="http://mongodb.github.io/mongo-java-driver/3.2/driver-async/" rel="nofollow" target="_blank">Async Java驱动程序文档</a>。<br /> BSON图书馆<br /> 具有新型编解码器基础架构的独立BSON库,可用于构建高性能编码器和解码器,无需中间地图实例。有关BSON Library的文档,请参阅<a href="http://mongodb.github.io/mongo-java-driver/3.2/bson/" rel="nofollow" target="_blank">BSON Library</a>。<br /> 核心驱动<br /> 一个新的核心库,MongoDB驱动程序和异步驱动程序都在其上构建。用户可以使用新的核心库构建替代或实验高级API。 <h2>下载/升级</h2> <p>将驱动程序合并到项目中的推荐方法是使用依赖关系管理系统。有关更多信息,请参阅 <a href="http://mongodb.github.io/mongo-java-driver/" rel="nofollow" target="_blank">MongoDB Java驱动程序</a>。</p> <p>如果从较早版本的Java驱动程序升级,请参阅 <a href="http://mongodb.github.io/mongo-java-driver/3.2/whats-new/upgrading/" rel="nofollow" target="_blank">最新消息</a>。</p> <h2>Java驱动程序兼容性</h2> <h3>MongoDB兼容性</h3> <p>以下兼容性表格指定了与特定版本的MongoDB一起使用的MongoDB Java驱动程序的推荐版本。</p> <p>第一列列出了驱动程序版本。</p> <table border="1"> <thead> <tr> <th>Java驱动程序版本</th> <th>MongoDB 2.4</th> <th>MongoDB 2.6</th> <th>MongoDB 3.0</th> <th>MongoDB 3.2</th> <th>MongoDB 3.4</th> </tr> </thead> <tbody> <tr> <th>版本3.4</th> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> </tr> <tr> <th>版本3.3</th> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> <td> </td> </tr> <tr> <th>版本3.2</th> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> <td> </td> </tr> <tr> <th>版本2.14</th> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓<a href="https://docs.mongodb.com/ecosystem/drivers/java/#id2" id="id1" rel="nofollow">[*]</a></td> <td> </td> </tr> </tbody> </table> <p>有关其他驱动程序版本,请参阅<a href="https://docs.mongodb.com/ecosystem/drivers/driver-compatibility-reference/#reference-compatibility-mongodb-java" rel="nofollow" target="_blank">Java驱动程序MongoDB兼容性参考</a>。</p> <p>该驱动程序不支持旧版本的MongoDB。</p> <table id="id2"> <tbody> <tr> <td><a href="https://docs.mongodb.com/ecosystem/drivers/java/#id1" rel="nofollow" target="_blank">[*]</a></td> <td>2.14驱动程序不支持所有MongoDB 3.2功能(例如,阅读关注); 但是,如果您当前使用的是2.x版本的驱动程序,并且希望针对MongoDB 3.2运行,但无法升级到驱动程序版本3.2,请使用2.14驱动程序。</td> </tr> </tbody> </table> <h3>语言兼容性</h3> <p>以下兼容性表格指定了与特定版本的Java一起使用的MongoDB Java驱动程序的推荐版本。</p> <p>第一列列出了驱动程序版本。</p> <table border="1"> <thead> <tr> <th>Java驱动程序版本</th> <th>Java 5</th> <th>Java 6</th> <th>Java 7</th> <th>Java 8</th> </tr> </thead> <tbody> <tr> <th>版本3.x</th> <td> </td> <td>✓</td> <td>✓</td> <td>✓</td> </tr> <tr> <th>版本2.x</th> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> </tr> </tbody> </table> <p>有关其他驱动程序版本,请参阅<a href="https://docs.mongodb.com/ecosystem/drivers/driver-compatibility-reference/#reference-compatibility-language-java" rel="nofollow" target="_blank">Java驱动程序语言兼容性参考</a>。</p> <h2>第三方框架和库</h2> <h3>POJO贴片</h3> <ul> <li><a href="https://github.com/mongodb/morphia" rel="nofollow" target="_blank">Morphia</a>。带有DAO / Datastore抽象的Type-Safe Wrapper。</li> <li><a href="http://www.springsource.org/spring-data/mongodb" rel="nofollow" target="_blank">Spring MongoDB</a>。为Spring用户提供熟悉的数据访问功能,包括丰富的POJO映射。</li> <li><a href="http://sboesebeck.github.io/morphium/" rel="nofollow" target="_blank">形态</a>。功能丰富的POJO Mapper包括声明缓存,集群感知,验证,部分更新等功能,支持聚合框架。</li> <li><a href="http://github.com/jannehietamaki/mungbean" rel="nofollow" target="_blank">绿豆</a>(w / clojure支持)。</li> <li><a href="http://www.datanucleus.org/products/accessplatform_3_0/mongodb/support.html" rel="nofollow" target="_blank">DataNucleus JPA / JDO</a>。JPA / JDO包装器</li> <li><a href="https://github.com/dadastream/lib-mongomapper" rel="nofollow" target="_blank">LIB-mongomapper</a>。JavaBean Mapper(无注释)。</li> <li><a href="http://mongojack.org/" rel="nofollow" target="_blank">MongoJack</a>。使用杰克逊(注释)来映射到POJO或从POJO映射,并有一个简单的包装<code>DBCollection</code>。</li> <li><a href="http://kundera.googlecode.com/" rel="nofollow" target="_blank">昆德拉</a>。JPA兼容ORM。适用于多个数据存储。</li> <li><a href="http://dbuschman7.github.io/mongoFS/" rel="nofollow" target="_blank">MongoFS</a>。增强的文件存储库,支持文件压缩,加密和Zip文件扩展。可以在GridFS兼容的桶上使用。</li> <li><a href="http://www.jongo.org/" rel="nofollow" target="_blank">琼戈</a>。在Java中查询<code>mongo</code>(在shell中使用字符串),将结果解组成Java对象(使用Jackson)</li> <li><a href="http://mongolink.org/" rel="nofollow" target="_blank">MongoLink</a>。对象文档映射器(ODM。)使用简单的java DSL进行映射声明。</li> <li><a href="http://www.hibernate.org/ogm/" rel="nofollow" target="_blank">休眠OGM</a>。为MongoDB提供Java持久性支持。</li> <li><a href="http://github.com/ParaPenguin/morphix" rel="nofollow" target="_blank">Morphix</a>。轻量级,易于使用的POJO映射器,具有对象缓存和生命周期方法。</li> </ul> <h3>代码生成</h3> <ul> <li><a href="http://java.dzone.com/articles/using-mongodb-sculptor" rel="nofollow" target="_blank">雕塑家</a>。基于MongoDB的DSL - > Java(代码生成器)</li> <li><a href="http://github.com/mattinsler/com.lowereast.guiceymongo/" rel="nofollow" target="_blank">GuicyData</a>。DSL - > Java生成器与Guice集成。</li> </ul> <h3>杂项</h3> <ul> <li><a href="https://github.com/gaillard/mongo-queue-java" rel="nofollow" target="_blank">mongo-queue-java</a>。Java消息队列使用MongoDB作为后端。</li> <li><a href="https://github.com/deftlabs/mongo-java-logging" rel="nofollow" target="_blank">mongo-java-logging</a>。Java日志记录处理程序。</li> <li><a href="http://code.google.com/p/log4mongo/" rel="nofollow" target="_blank">log4mongo</a>。一个log4j appender</li> <li><a href="http://www.allanbank.com/mongodb-async-driver/" rel="nofollow" target="_blank">Allanbank异步Java驱动程序</a></li> <li><a href="http://www.unityjdbc.com/mongojdbc/" rel="nofollow" target="_blank">MongoDB的JDBC驱动</a></li> <li><a href="http://github.com/erh/mongo-jdbc" rel="nofollow" target="_blank">(实验,Type4)JDBC驱动程序</a></li> <li><a href="http://metamodel.eobjects.org/download.html" rel="nofollow" target="_blank">元模型数据挖掘和查询库</a></li> <li><a href="https://sites.google.com/site/mongodbjavarestserver/home" rel="nofollow" target="_blank">Mongodb Java REST服务器</a>基于<a href="http://www.eclipse.org/jetty/" rel="nofollow" target="_blank">Jetty</a></li> </ul> <h3>Clojure的</h3> <ul> <li><a href="https://github.com/michaelklishin/monger" rel="nofollow" target="_blank">贩子</a></li> <li><a href="https://github.com/aboekhoff/congomongo" rel="nofollow" target="_blank">刚果蒙古</a></li> </ul> <h3>Groovy的</h3> <ul> <li><a href="http://github.com/poiati/gmongo" rel="nofollow" target="_blank">GMongo,一个Groovy包装到MongoDB Java驱动程序</a></li> <li><a href="http://blog.paulopoiati.com/2010/06/20/gmongo-0-5-released" rel="nofollow" target="_blank">GMongo 0.5发行编写</a></li> </ul> <h3>JavaScript(Rhino)</h3> <ul> <li><a href="https://github.com/nlloyd/horn-of-mongo" rel="nofollow" target="_blank">蒙戈的号角</a>。一个基于Java的Rhino JavaScript Engine构建的MongoDB shell。</li> <li><a href="http://code.google.com/p/mongodb-rhino" rel="nofollow" target="_blank">MongoDB犀牛</a>。提供JVM和MongoDB的Rhino JavaScript引擎之间的完全集成的工具集。使用MongoDB Java驱动程序。</li> </ul> <h3>Hadoop的</h3> <p><a href="https://docs.mongodb.com/ecosystem/tools/hadoop/#hadoop-connector" rel="nofollow" target="_blank">MongoDB Connector for Hadoop</a></p> <h2>其他资源</h2> <ul> <li><a href="https://university.mongodb.com/courses/M101J/about?jmp=docs" rel="nofollow" target="_blank">M101J:MongoDB for Java开发者免费在线课程</a></li> <li><a href="http://www.mongodb.com/presentations/webinar-mongodb-java-everything-you-need-know?jmp=docs" rel="nofollow" target="_blank">演示:MongoDB + Java - 你需要知道的一切</a></li> <li><a href="http://docs.mongodb.org/getting-started/java" rel="nofollow" target="_blank">MongoDB入门(Java Edition)</a></li> </ul>
  • Java 类加载机制

    Java 类加载机制<h2>1.Java类加载流程图</h2> <img alt="类加载流程图" class="img-thumbnail" src="/assist/images/blog/a5fad6dfbb004e239876373a08e30a0c.gif" /> <h2>2.类的初始化</h2> 类什么时候才被初始化: <p><span style="color:#16a085">1)创建类的实例,也就是new一个对象<br /> 2)访问某个类或接口的静态变量,或者对该静态变量赋值<br /> 3)调用类的静态方法<br /> 4)反射(Class.forName("com.lyj.load"))<br /> 5)初始化一个类的子类(会首先初始化子类的父类)<br /> 6)JVM启动时标明的启动类,即文件名和类名相同的那个类</span></p> 只有这6中情况才会导致类的类的初始化。 <p>假如这个类存在直接父类,并且这个类还没有被初始化(注意:在一个类加载器中,类只能初始化一次),那就初始化直接的父类(不适用于接口)<br /> 加入类中存在初始化语句(如static变量和static块),那就依次执行这些初始化语句。</p> <h2>3.类的加载</h2>   类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个这个类的Java.lang.Class对象,用来封装类在方法区类的对象。<br /> <img alt="" class="img-thumbnail" src="/assist/images/blog/77a455e73f0548808e25afb18c0d3828.gif" /><br /> 类加载器:<br /> <img alt="类加载器:" class="img-thumbnail" src="/assist/images/blog/35a17133b1c743dd80041c967d51a7ad.gif" /><br />   <pre> <code class="language-java">import java.net.URL; public class Main { public static void main(String[] args) { URL[] urls=sun.misc.Launcher.getBootstrapClassPath().getURLs(); for (int i = 0; i < urls.length; i++) { System.out.println(urls[i].toExternalForm()); } } }</code></pre> <pre> <code>file:/D:/Program%20Files/Java/jdk1.8.0_102/jre/lib/resources.jar file:/D:/Program%20Files/Java/jdk1.8.0_102/jre/lib/rt.jar file:/D:/Program%20Files/Java/jdk1.8.0_102/jre/lib/sunrsasign.jar file:/D:/Program%20Files/Java/jdk1.8.0_102/jre/lib/jsse.jar file:/D:/Program%20Files/Java/jdk1.8.0_102/jre/lib/jce.jar file:/D:/Program%20Files/Java/jdk1.8.0_102/jre/lib/charsets.jar file:/D:/Program%20Files/Java/jdk1.8.0_102/jre/lib/jfr.jar file:/D:/Program%20Files/Java/jdk1.8.0_102/jre/classes</code></pre> <h2>4.Java类加载机制</h2> <p>类装载器就是寻找类的字节码文件,并构造出类在JVM内部表示的对象组件。在Java中,类装载器把一个类装入JVM中,要经过以下步骤:<br /> (1) 装载:查找和导入Class文件;<br /> (2) 链接:把类的二进制数据合并到JRE中;<br />     (a)校验:检查载入Class文件数据的正确性;<br />     (b)准备:给类的静态变量分配存储空间;<br />     (c)解析:将符号引用转成直接引用;<br /> (3) 初始化:对类的静态变量,静态代码块执行初始化操作</p> <p>类加载器和双亲委派模型</p> <p>(1) Bootstrap ClassLoader : 将存放于<JAVA_HOME>\lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如 rt.jar 名字不符合的类库即使放在lib目录中也不会被加载)类库加载到虚拟机内存中。启动类加载器无法被Java程序直接引用<br /> (2) Extension ClassLoader : 将<JAVA_HOME>\lib\ext目录下的,或者被java.ext.dirs系统变量所指定的路径中的所有类库加载。开发者可以直接使用扩展类加载器。<br /> (3) Application ClassLoader : 负责加载用户类路径(ClassPath)上所指定的类库,开发者可直接使用。</p> <p>双亲委派模型的工作过程:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每个层次的类加载器都是如此。因此所有的加载请求最终都应该传达到顶层的启动类加载器中,只有当父加载器反馈无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。</p> <p>双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应有自己的父类加载器。这些类加载器的父子关系不是以继承的关系实现,而都是使用组合关系来复用父加载器的代码。<br />  </p> <pre> <code class="language-java">public class ClassLoaderTest { public static void main(String[] args) { //输出ClassLoaderText的类加载器名称 System.out.println("ClassLoaderText类的加载器的名称:" + ClassLoaderTest.class.getClassLoader().getClass().getName()); System.out.println("System类的加载器的名称:" + System.class.getClassLoader()); System.out.println("ArrayList类的加载器的名称:" + ArrayList.class.getClassLoader()); ClassLoader cl = ClassLoaderTest.class.getClassLoader(); while (cl != null) { System.out.print(cl.getClass().getName() + "->"); cl = cl.getParent(); } System.out.println(cl); } }</code></pre> <pre> <code class="language-html">ClassLoaderText类的加载器的名称:sun.misc.Launcher$AppClassLoader System类的加载器的名称:null ArrayList类的加载器的名称:null sun.misc.Launcher$AppClassLoader->sun.misc.Launcher$ExtClassLoader->null</code></pre> 好处:java类随着它的类加载器一起具备了一种带有优先级的层次关系。例如类java.lang.Object,它存放在rt.jar中,无论哪个类加载器要加载这个类,最终都会委派给启动类加载器进行加载,因此Object类在程序的各种类加载器环境中都是同一个类。相反,如果用户自己写了一个名为java.lang.Object的类,并放在程序的Classpath中,那系统中将会出现多个不同的Object类,java类型体系中最基础的行为也无法保证,应用程序也会变得一片混乱。
  • Spring data-mongodb ID自增长注解实现

    Spring data-mongodb ID自增长注解实现,mongodb ID自增长<h2>1.创建一个文档。类似一个序列的作用</h2> <pre> <code class="language-java">package com.leftso.autoid; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; /** * 系统自增长表id存放表 * * @author xq * */ @Document(collection = "sys_sequence") public class SequenceId { @Id private String id; @Field("seq_id") private long seqId; @Field("coll_name") private String collName; public String getId() { return id; } public void setId(String id) { this.id = id; } public long getSeqId() { return seqId; } public void setSeqId(long seqId) { this.seqId = seqId; } public String getCollName() { return collName; } public void setCollName(String collName) { this.collName = collName; } } </code></pre> <h2>2.创建一个自定义注解用于处理需要自增长的ID</h2> <pre> <code class="language-java">package com.leftso.autoid; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 自定义自增长ID注解 * * @author xq * */ @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.FIELD }) public @interface AutoValue { } </code></pre> <h2><br /> 3.重写新增的监听事件</h2> <span style="color:#27ae60"><strong>注意:各大网站可能会有相似的代码。以下部分和spring data mongodb版本有关。下面代码中重写的public void onBeforeConvert(final Object source)方法在1.8版本开始就废弃了,不过官方推荐: Please use onBeforeConvert(BeforeConvertEvent),以下则为1.8以后版本的使用方法</strong></span> <pre> <code class="language-java">package com.leftso.autoid; import java.lang.reflect.Field; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.FindAndModifyOptions; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener; import org.springframework.data.mongodb.core.mapping.event.BeforeSaveEvent; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Component; import org.springframework.util.ReflectionUtils; @Component public class SaveEventListener extends AbstractMongoEventListener<Object> { @Autowired private MongoTemplate mongo; @Override public void onBeforeSave(BeforeSaveEvent<Object> event) { Object source = event.getSource(); if (source != null) { ReflectionUtils.doWithFields(source.getClass(), new ReflectionUtils.FieldCallback() { public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException { ReflectionUtils.makeAccessible(field); // 如果字段添加了我们自定义的AutoValue注解 if (field.isAnnotationPresent(AutoValue.class) && field.get(source) instanceof Number && field.getLong(source) == 0) { // field.get(source) instanceof Number && // field.getLong(source)==0 // 判断注解的字段是否为number类型且值是否等于0.如果大于0说明有ID不需要生成ID // 设置自增ID field.set(source, getNextId(source.getClass().getSimpleName())); } } }); } } /** * 获取下一个自增ID * * @param collName * 集合(这里用类名,就唯一性来说最好还是存放长类名)名称 * @return 序列值 */ private Long getNextId(String collName) { Query query = new Query(Criteria.where("coll_name").is(collName)); Update update = new Update(); update.inc("seq_id", 1); FindAndModifyOptions options = new FindAndModifyOptions(); options.upsert(true); options.returnNew(true); SequenceId seq = mongo.findAndModify(query, update, options, SequenceId.class); return seq.getSeqId(); } } </code></pre> <h2><br /> 4.使用自定义注解完成ID自增长的实现</h2> <pre> <code class="language-java">package com.leftso.entity; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import com.leftso.autoid.AutoValue; @Document public class Student { @AutoValue @Id private long id; private String name; public Student(String name) { super(); this.name = name; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } </code></pre> <br />  
  • spring boot1.5.2整合spring data mongodb10.1

    Java编程中使用spring boot1.5.2框架整合spring data mongodb10.1,来使用mongodb数据库Java编程中使用spring boot1.5.2框架整合spring data mongodb10.1,来使用mongodb数据库<br /> <br /> 项目结构图:<br /> <img alt="项目结构图" class="img-thumbnail" src="/assist/images/blog/e75e36b8-aabe-46f6-88c3-98ee6d3d8fa4.jpg" /><br /> 本项目主要讲解spring整合mongodb后的一些基本操作,如新增数据,修改数据,删除数据,查询数据<br /> <br /> 代码清单:<br /> <strong>定义一个简单的pojo Customer.java:</strong> <pre> <code class="language-java">package com.leftso.entity; /** * 测试用类 * * @author leftso * */ // @Document public class Customer { private String id; private String firstName; private String lastName; public Customer() { } public Customer(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } @Override public String toString() { return String.format("Customer[id=%s, firstName='%s', lastName='%s']", id, firstName, lastName); } } </code></pre> <br /> <strong>添加数据配置mongo.properties:</strong> <pre> <code>#DB host+port,Multiple host separation with ',' db.host=localhost:27017 #DB name db.name=test1 #DB User Name db.user= #DB User Password db.pwd=</code></pre> <br /> <strong>自定义配置mongodb的数据源<br /> 数据库配置文件MongoProperty.java:</strong> <pre> <code class="language-java">package com.leftso.config; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Component; /** * mongodb的配置文件载入 * * @author leftso * */ @Component @ConfigurationProperties(prefix = "db") @PropertySource("classpath:mongo.properties") public class MongoProperty { /** 主机地址IP+端口 **/ private String host; /** 数据库名称 ***/ private String name; /** 数据库用户(非必须) ***/ private String user; /** 数据库密码 **/ private String pwd; public String getHost() { return host; } public void setHost(String host) { this.host = host; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getUser() { return user; } public void setUser(String user) { this.user = user; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } } </code></pre> <br /> <strong>数据源MongoDBConfig.java:</strong> <pre> <code class="language-java">package com.leftso.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.MongoDbFactory; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.SimpleMongoDbFactory; import org.springframework.util.StringUtils; import com.mongodb.MongoClient; import com.mongodb.MongoClientURI; /** * mongodb 配置类 * * @author leftso * */ @Configuration public class MongoDBConfig { @Autowired MongoProperty mongoProperties; /** * 注入mongodb的工厂类 * * @return */ @Bean public MongoDbFactory mongoDbFactory() { // uri格式mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]] String mongoURI = "mongodb://" + mongoProperties.getHost(); if (!StringUtils.isEmpty(mongoProperties.getUser())) { mongoURI = "mongodb://" + mongoProperties.getUser() + ":" + mongoProperties.getPwd() + "@" + mongoProperties.getHost(); } // 为了方便实现mongodb多数据库和数据库的负债均衡这里使用url方式创建工厂 MongoClientURI mongoClientURI = new MongoClientURI(mongoURI); MongoClient mongoClient = new MongoClient(mongoClientURI); MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient, mongoProperties.getName()); // 注意:以下构造函数已经弃用: // SimpleMongoDbFactory(com.mongodb.Mongo mongo, String databaseName); // 弃用版本1.7 // SimpleMongoDbFactory(com.mongodb.Mongo mongo, String databaseName, // UserCredentials credentials);弃用版本1.7 // SimpleMongoDbFactory(com.mongodb.Mongo mongo, String databaseName, // UserCredentials credentials, String // authenticationDatabaseName);弃用版本1.7 // SimpleMongoDbFactory(com.mongodb.MongoURI uri);弃用版本1.7 return mongoDbFactory; } /** * 获取操作实例 * * @param mongoDbFactory * @return */ @Bean public MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory) { return new MongoTemplate(mongoDbFactory); } } </code></pre> <br /> <strong>创建customer的简单存储操作类<br /> 基于spring data框架的方式CustomerMongoRepository.java</strong><br />   <pre> <code class="language-java">package com.leftso.repository; import java.util.List; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.stereotype.Repository; import com.leftso.entity.Customer; /** * spring data提供接口方式实现简单的操作,通常适合简单的或者测试用 * * @author leftso * */ @Repository public interface CustomerMongoRepository extends MongoRepository<Customer, String> { public Customer findByFirstName(String firstName); public List<Customer> findByLastName(String lastName); } </code></pre> <br /> <strong>自定义方式实现CustomizeCustomerMongoRepository.java</strong><br />   <pre> <code class="language-java">package com.leftso.repository; import java.util.List; import java.util.regex.Pattern; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Repository; import com.leftso.entity.Customer; /** * 自定义数据存储方式 * * @author leftso * */ @Repository public class CustomizeCustomerMongoRepository { @Autowired MongoTemplate mongoTemplate; /** * 保存一个对象 * * @return */ public Customer save(Customer customer) { mongoTemplate.save(customer); return customer; } /** * 删除所有 */ public void deleteAll() { mongoTemplate.dropCollection(Customer.class); } /** * 查询所有 * * @return */ public List<Customer> findAll() { return mongoTemplate.findAll(Customer.class); } /** * 精确查询 * * @param firstName * @return */ public List<Customer> findByFirstName(String firstName) { Query query = new Query(); query.addCriteria(Criteria.where("firstName").is(firstName)); return mongoTemplate.find(query, Customer.class); } /** * 模糊查询不区分大小写 * * @param lastName * @return */ public List<Customer> findByLastName(String lastName) { Query query = new Query(); Pattern pattern = Pattern.compile("^.*" + lastName + ".*$", Pattern.CASE_INSENSITIVE);// Pattern.CASE_INSENSITIVE不区分大小写 query.addCriteria(Criteria.where("lastName").regex(pattern)); return mongoTemplate.find(query, Customer.class); } } </code></pre> <br /> 项目源码下载:<br /> <a rel="nofollow" target="_blank" href="https://github.com/leftso/demo-spring-boot-mongodb">https://github.com/leftso/demo-spring-boot-mongodb</a><br />  
  • mongodb修改数据命令

    mongodb修改数据命令mongodb修改数据命令<br /> <br /> 1.切换至修改数据的数据库 <pre> <code class="language-sql">use your_dbname</code></pre> 2.修改数据 <pre> <code class="language-sql">db.blog.update({type:"programming"},{$set:{type:"coding"}}, { multi: true });</code></pre> 解释:<br /> db.table_name.update({匹配表达式},{$set:{新的值}}, { multi: true });最后一个是否修改匹配条件的所有,如果false则修改一条,默认false
  • mongodb数据库linux安装配置用户创建删除修改

    mongodb数据库linux安装配置用户创建删除修改1.下载mongodb压缩包<br /> 地址:https://www.mongodb.com/download-center?jmp=nav#community<br /> 或者: https://www.mongodb.org/dl/linux/x86_64-amazon?_ga=1.227669659.765724145.1480085547<br /> 2. 文件上传<br /> 上传mongodb文件包到Linux系统<br /> 也可选择使用命令<br /> #wget 详细地址…<br /> 3. 文件解压<br /> 解压文 <pre> <code>#tar –xvf  文件名</code></pre> <br /> 移动文件夹到/usr/local目录下(也可根据自己爱好) <pre> <code>#mv 文件名 /user/mongodb </code></pre> <br /> <strong>创建相关文件目录</strong><br /> #mv 文件名 /user/mongodb创建数据存放目录/usr/local/mogodb/data <pre> <code>#mkdir –p /usr/local/mogodb/data</code></pre> 创建日志存放目录/user/local/mongodb/logs <pre> <code class="language-bash">#mkdir –p /usr/local/mongodb/logs</code></pre> 创建配置文件存放路径/usr/local/mongodb/conf <pre> <code>#mkdir –p /usr/local/mongodb/conf</code></pre> <ul> <li>创建配置文件mongodb.conf</li> <li>vi /usr/local/mongodb/conf/mongodb.conf</li> </ul> <pre> <code>#vi /usr/local/mongodb/conf/mongodb.conf</code></pre>   <ul> <li>:内容</li> </ul> <pre> <code>dbpath = /usr/local/mongodb/data #数据文件存放目录 logpath = /usr/local/mongodb/logs/mongodb.log #日志文件存放目录 port = 27017#端口 fork = true#以守护程序的方式启用,即在后台运行 nohttpinterface = true</code></pre> <br /> <img alt="配置文件内容" class="img-thumbnail" src="/assist/images/blog/e7a875d6-2d04-4ff1-8ed1-9a8fc275e365.png" style="height:126px; width:491px" title="配置文件内容" /> <ul> <li>启动mongodb(无需用户登录权限的启动方式)</li> </ul> <pre> <code class="language-bash">#/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/conf/mongodb.conf</code></pre> <img alt="启动数据库" class="img-thumbnail" src="/assist/images/blog/b4bb43d6-71f1-483e-a3b4-46cd6ba43af1.png" style="height:154px; width:786px" title="启动数据库" /> <ul> <li>进入mongodb</li> <li>[root@MiWiFi-R1CM-srv bin]# ./mongo</li> </ul> <img alt="登录数据库" class="img-thumbnail" src="/assist/images/blog/2636a0ce-1150-4b79-a548-fe6ca70b1fe3.png" style="height:255px; width:982px" title="登录数据库" /> <ol> <li>创建数据库用户</li> <li>mongo shell</li> <li>切换到需要创建用户的数据库</li> </ol> <pre> <code>>use admin</code></pre>   <ul> <li>创建用户并赋予角色</li> </ul> <pre> <code>> db.createUser({user:'root',pwd:'root',roles:[{ role:'root',db: 'admin'}]})</code></pre> <br /> <br /> <img alt="mongodb数据库用户创建" class="img-thumbnail" src="/assist/images/blog/9dbfe29f-a7c5-4e3f-81c3-5ac43c8de54e.png" style="height:134px; width:990px" title="mongodb数据库用户创建" /> <ul> <li> </li> </ul> <em>1. </em><em>数据库用户角色:read</em><em>、readWrite;</em><br /> <em>2. </em><em>数据库管理角色:dbAdmin</em><em>、dbOwner</em><em>、userAdmin</em><em>;</em><br /> <em>3. </em><em>集群管理角色:clusterAdmin</em><em>、clusterManager</em><em>、clusterMonitor</em><em>、hostManager</em><em>;</em><br /> <em>4. </em><em>备份恢复角色:backup</em><em>、restore</em><em>;</em><br /> <em>5. </em><em>所有数据库角色:readAnyDatabase</em><em>、readWriteAnyDatabase</em><em>、userAdminAnyDatabase</em><em>、dbAdminAnyDatabase</em><br /> <em>6. </em><em>超级用户角色:root</em><br /> <em>// </em><em>这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner </em><em>、userAdmin</em><em>、userAdminAnyDatabase</em><em>)</em><br /> <em>7. </em><em>内部角色:__system</em><br />   <ol style="list-style-type:square"> <li>查看刚才创建的用户</li> </ol> <pre> <code>db.system.users.find();</code></pre> <br /> <img alt="查询用户" class="img-thumbnail" src="/assist/images/blog/269a1e61-3134-4716-b4c4-8bbe2be12987.png" style="height:179px; width:878px" title="查询用户" /> <ul> <li>关闭mongodb,修改配置文件,启用安全登录</li> </ul> 编辑配置文件mongodb.conf<br /> 新增最后一行:<br /> auth = true #表示启用用户权限登录<br /> <img alt="启用用户登录" class="img-thumbnail" src="/assist/images/blog/e7c07695-5b74-4b72-ae03-fac59e7facff.png" style="height:149px; width:550px" title="启用用户登录" /><br /> 编辑完成后启动mongodb服务<br /> # /usr/local/mongodb/bin/mongod --config /usr/local/mongodb/conf/mongodb.conf <ul> <li>登录用户</li> </ul> 启用用户登录操作后默认进去再次使用查看命令将提示无权限<br /> <img alt="不用用户登录,且使用数据库查询命令" class="img-thumbnail" src="/assist/images/blog/a66d274c-393e-4edb-b8bb-6968bdf25c81.png" style="height:261px; width:615px" /><br /> 用户切换至自己的数据库并登录(说明:mongodb用户都是在那个库创建即为那个库的用户,登录也需要到对应的数据库)<br /> 登陆用户,再使用查询数据库命令<br /> <img alt="登陆用户,再使用查询数据库命令" class="img-thumbnail" src="/assist/images/blog/038f9ef7-acfe-4235-bb51-c79ac2515ce1.png" style="height:188px; width:252px" title="登陆用户,再使用查询数据库命令" /><br /> 登录后返回1表示成功,登录后将有权限操作数据库相关命令 <ul> <li>修改用户密码</li> </ul> 用户登录后执行: <pre> <code>> db.changeUserPassword('root','root123');</code></pre> <br /> 退出后再次用之前的密码,将提示失败<br /> <img alt="推出后再次用之前的密码,将提示失败" class="img-thumbnail" src="/assist/images/blog/c4724ea4-84a7-49f8-8f4d-c5d8cfcd1efc.png" style="height:71px; width:236px" title="推出后再次用之前的密码,将提示失败" /><br /> 使用修改后的密码成功登录<br /> <img alt="" class="img-thumbnail" src="/assist/images/blog/43165636-4af1-4e7e-9f2d-8555ddc5e15a.png" style="height:66px; width:255px" /><br /> 返回1表示登陆成功 <ul> <li>删除创建的用户(启用的无权限启动模式)</li> </ul> <pre> <code>> db.dropUser('root');</code></pre> <br /> 执行命令后返回 true 表示成功删除 <pre> <code>db.system.users.find();</code></pre> <br /> 再次查询将无用户<br /> <br /> <br /> <br /> <br /> MongoDB主从配置手记: <pre> <code class="language-html">vi /etc/yum.repos.d/mongodb-org-3.4.repo [mongodb-org-3.4] name=MongoDB 3.4 Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/ gpgcheck=0 enabled=1 yum install -y mongodb-org 新建dbpath=/opt/mongodb/db/ logpath=/opt/mongodb/logs/文件夹 /usr/bin/mongod 启动地址 /etc/mongod.conf 配置文件地址 netstat -nltp|grep mongod 查看端口 mongodb1 mongod --config /etc/mongod.conf --source 192.168.3.11:8203 --noauth /usr/bin/mongod --dbpath=/opt/mongodb/db/ --logpath=/opt/mongodb/logs/mongodb.log --master --slave --source 192.168.3.11:8203 --bind_ip=0.0.0.0 --maxConns=20000 --fork --directoryperdb --noauth mongodb2 mongod --config /etc/mongod.conf --source 192.168.3.11:8201 --noauth /usr/bin/mongod --dbpath=/opt/mongodb/db/ --logpath=/opt/mongodb/logs/mongodb.log --master --slave --source 192.168.3.11:8201 --bind_ip=0.0.0.0 --maxConns=20000 --fork --directoryperdb --noauth 进入MongoDB控制台 db.shutdownServer()方式 # mongo 进入本机 如果要进去其他机器加入 localhost:27000 > use admin > db.shutdownServer()</code></pre> <br /> <br />  
  • mongodb数据库备份/恢复

    mongodb数据库备份(mongodump)/恢复(mongorestore)mongodb数据库备份(mongodump)/恢复(mongorestore) <h4>1.备份</h4> 命令: <pre> <code># ./mongodump -h your_host --port your_port -d your_db_name -u=your_db_user -p=your_db_password -o dir_to_save_backup</code></pre> <strong>执行过程...:<br /> <img alt="备份过程" class="img-thumbnail" src="/assist/images/blog/fda64c87-17fc-49b0-a462-4f7568dde149.png" style="height:214px; width:619px" /></strong><br /> 参数说明:<br /> <strong>-h 指定数据库主机地址/IP<br /> --port 指定数据库使用端口,默认27017<br /> -d 指定备份数据库名称<br /> -u 指定数据库用户名称(如果数据库未启用用户验证则忽略该参数,如果启用权限确保该用户有权限)<br /> -p 指定数据库用户密码(如果数据库未启用用户验证则忽略该参数)<br /> -o 指定备份的文件所存放的目录,该目录需提前创建</strong> <h4>2.恢复</h4> 命令: <pre> <code>#mongorestore -h localhost:27017 -d your_db_name -u=your_user_name -p=your_password --dir path_to_backup</code></pre> 参数说明:<br /> <strong>-h 指定数据库地址及端口<br /> -d 指定数据库名称<br /> -u 指定数据库用户名(如果数据库未启用用户验证则忽略该参数,如果启用权限确保该用户有权限)<br /> -p 指定数据库用户密码(如果数据库未启用用户验证则忽略该参数)<br /> --dir 指定数据库备份的目录</strong>
  • MongoDB索引策略和索引类型详解

    MongoDB索引策略和索引类型说明MongoDB索引策略和索引类型说明
  • FastDFS5.10卸载,centos卸载FastDFS(二)

    FastDFS5.10卸载,在centos6系统中卸载FastDFS(二),FastDFS卸载,FastDFS<p><span style="font-family:宋体">由于</span>FastDFS<span style="font-family:宋体">软件并未提供直接的一键卸载,所以卸载有点麻烦</span>,FastDFS<span style="font-family:宋体">卸载步骤如下</span>:</p> <p><strong><em><span style="font-family:宋体"><span style="color:red">注意</span></span><span style="color:red">:</span></em></strong><strong><em><span style="font-family:宋体"><span style="color:red">所有删除操作请务必先查看是否存在文件文件是否为</span></span><span style="color:red">FastDFS</span></em></strong><strong><em><span style="font-family:宋体"><span style="color:red">相关</span></span></em></strong></p> <h3 style="margin-left:18.0pt">1) <span style="font-family:宋体">停止服务</span></h3> <p><strong>[root@bogon fdfs]#service fdfs_trackerd stop</strong></p> <p><strong>[root@bogon fdfs]#service fdfs_storaged stop</strong></p> <p style="margin-left:18.0pt"> </p> <h3 style="margin-left:18.0pt">2) <span style="font-family:宋体">通过</span>storage.conf<span style="font-family:宋体">找到</span>base_path<span style="font-family:宋体">和</span>store_path<span style="font-family:宋体">然后删除</span></h3> <p><strong>[root@bogon fdfs]# cat /etc/fdfs/storage.conf |grep base_path</strong></p> <p>base_path=<strong><span style="color:red">/opt/fastdfs_storage</span></strong></p> <p># store_path#, based 0, if store_path0 not exists, it's value is base_path</p> <p>[root@bogon fdfs]#</p> <p>[root@bogon fdfs]# cat /etc/fdfs/storage.conf |grep store_path</p> <p>store_path_count=1</p> <p># store_path#, based 0, if store_path0 not exists, it's value is base_path</p> <p>store_path0=<strong><span style="color:red">/opt/fastdfs_storage_data</span></strong></p> <p>#store_path1=/home/yuqing/fastdfs2</p> <p># store_path (disk), value can be 1 to 256, default value is 256</p> <p>[root@bogon fdfs]#</p> <p> </p> <p><span style="font-family:宋体">删除上面标红的路径</span>,</p> <p><strong><span style="font-family:宋体"><span style="color:red">注意</span></span><span style="color:red">,</span></strong><strong><span style="font-family:宋体"><span style="color:red">如果有未备份的文件,请先备份再删除</span></span></strong></p> <p> </p> <p><strong>[root@bogon fdfs]# rm -rf /opt/fastdfs_storage</strong></p> <p><strong>[root@bogon fdfs]# rm -rf /opt/fastdfs_storage_data</strong></p> <p> </p> <h3 style="margin-left:18.0pt">3) <span style="font-family:宋体">通过</span>tracker.conf<span style="font-family:宋体">找到</span>base_path<span style="font-family:宋体">然后删除</span></h3> <p><strong>[root@bogon fdfs]# cat /etc/fdfs/tracker.conf |grep base_path</strong></p> <p>base_path=/opt/fastdfs_tracker</p> <p><strong>[root@bogon fdfs]#rm –rf /opt/fastdfs_tracker</strong></p> <h3 style="margin-left:18.0pt">4) <span style="font-family:宋体">删除配置文件目录</span></h3> <p><strong>[root@bogon ~]# pwd</strong></p> <p>/root</p> <p><strong>[root@bogon ~]# rm -rf /etc/fdfs/</strong></p> <p>[root@bogon ~]#</p> <p> </p> <h3 style="margin-left:18.0pt">5) <span style="font-family:宋体">删除链接文件</span></h3> <p><span style="font-family:宋体">删除</span>tracker<span style="font-family:宋体">的链接文件</span></p> <p><strong>#rm –rf /usr/local/bin/fdfs_trackerd</strong></p> <p><strong>#rm –rf /usr/local/bin/stop.sh</strong></p> <p><strong>#rm –rf /usr/local/bin/restart.sh</strong></p> <p><span style="font-family:宋体">删除</span>storage<span style="font-family:宋体">的链接文件</span></p> <p><strong>#rm –rf /usr/local/bin/fdfs_storaged</strong></p> <h3 style="margin-left:18.0pt">6) <span style="font-family:宋体">删除</span>/usr/bin<span style="font-family:宋体">目录下</span>FastDFS<span style="font-family:宋体">的可执行文件</span></h3> <p><span style="font-family:宋体">首先通过</span>ls<span style="font-family:宋体">命令查看文件</span>,<span style="font-family:宋体">然后删除</span></p> <p>[root@bogon ~]# ll /usr/bin/fdfs_*</p> <p>-rwxr-xr-x. 1 root root 262099 Jul 27 03:01 /usr/bin/fdfs_appender_test</p> <p>-rwxr-xr-x. 1 root root 261796 Jul 27 03:01 /usr/bin/fdfs_appender_test1</p> <p>-rwxr-xr-x. 1 root root 252140 Jul 27 03:01 /usr/bin/fdfs_append_file</p> <p>-rwxr-xr-x. 1 root root 251274 Jul 27 03:01 /usr/bin/fdfs_crc32</p> <p>-rwxr-xr-x. 1 root root 252223 Jul 27 03:01 /usr/bin/fdfs_delete_file</p> <p>-rwxr-xr-x. 1 root root 253062 Jul 27 03:01 /usr/bin/fdfs_download_file</p> <p>-rwxr-xr-x. 1 root root 252756 Jul 27 03:01 /usr/bin/fdfs_file_info</p> <p>-rwxr-xr-x. 1 root root 265444 Jul 27 03:01 /usr/bin/fdfs_monitor</p> <p>-rwxr-xr-x. 1 root root 878573 Jul 27 03:01 /usr/bin/fdfs_storaged</p> <p>-rwxr-xr-x. 1 root root 268499 Jul 27 03:01 /usr/bin/fdfs_test</p> <p>-rwxr-xr-x. 1 root root 267636 Jul 27 03:01 /usr/bin/fdfs_test1</p> <p>-rwxr-xr-x. 1 root root 374059 Jul 27 03:01 /usr/bin/fdfs_trackerd</p> <p>-rwxr-xr-x. 1 root root 253166 Jul 27 03:01 /usr/bin/fdfs_upload_appender</p> <p>-rwxr-xr-x. 1 root root 254296 Jul 27 03:01 /usr/bin/fdfs_upload_file</p> <p>[root@bogon ~]#</p> <p><img alt="1" class="img-thumbnail" src="/assist/images/blog/38e2e3de419d45fa9a13c58310f08be4.png" /></p> <p><span style="font-family:宋体">看到全是</span>FastDFS<span style="font-family:宋体">的文件,删除</span>:</p> <p><strong>[root@bogon ~]# rm -rf  /usr/bin/fdfs_*</strong></p> <p>[root@bogon ~]#</p> <h3 style="margin-left:18.0pt">7) <span style="font-family:宋体">删除</span>/usr/include/<span style="font-family:宋体">目录下</span>FastDFS<span style="font-family:宋体">相关的</span>shell<span style="font-family:宋体">脚本</span></h3> <p><span style="font-family:宋体">首先查看文件</span>:</p> <p>[root@bogon ~]# ll /usr/include/fastdfs/*</p> <p>-rw-r--r--. 1 root root  3752 Jul 27 03:01 /usr/include/fastdfs/client_func.h</p> <p>-rw-r--r--. 1 root root   794 Jul 27 03:01 /usr/include/fastdfs/client_global.h</p> <p>-rw-r--r--. 1 root root   531 Jul 27 03:01 /usr/include/fastdfs/fdfs_client.h</p> <p>-rw-r--r--. 1 root root   946 Jul 27 03:01 /usr/include/fastdfs/fdfs_define.h</p> <p>-rw-r--r--. 1 root root  1005 Jul 27 03:01 /usr/include/fastdfs/fdfs_global.h</p> <p>-rw-r--r--. 1 root root  3117 Jul 27 03:01 /usr/include/fastdfs/fdfs_http_shared.h</p> <p>-rw-r--r--. 1 root root  2699 Jul 27 03:01 /usr/include/fastdfs/fdfs_shared_func.h</p> <p>-rw-r--r--. 1 root root   990 Jul 27 03:01 /usr/include/fastdfs/mime_file_parser.h</p> <p>-rw-r--r--. 1 root root 20104 Jul 27 03:01 /usr/include/fastdfs/storage_client1.h</p> <p>-rw-r--r--. 1 root root 21755 Jul 27 03:01 /usr/include/fastdfs/storage_client.h</p> <p>-rw-r--r--. 1 root root 11555 Jul 27 03:01 /usr/include/fastdfs/tracker_client.h</p> <p>-rw-r--r--. 1 root root 11983 Jul 27 03:01 /usr/include/fastdfs/tracker_proto.h</p> <p>-rw-r--r--. 1 root root 14349 Jul 27 03:01 /usr/include/fastdfs/tracker_types.h</p> <p>-rw-r--r--. 1 root root  6945 Jul 27 03:01 /usr/include/fastdfs/trunk_shared.h</p> <p>[root@bogon ~]#</p> <p><img alt="2" class="img-thumbnail" src="/assist/images/blog/325929d5f44c4e49bc2b4d35495e05cd.png" /></p> <p><span style="font-family:宋体">删除</span>:</p> <p><strong>[root@bogon ~]# rm -rf /usr/include/fastdfs/</strong></p> <p>[root@bogon ~]#</p> <p> </p> <h3 style="margin-left:18.0pt">8) <span style="font-family:宋体">删除</span>/usr/lib64<span style="font-family:宋体">目录下的库文件</span></h3> <p><span style="font-family:宋体">查看</span>:</p> <p>[root@bogon lib64]# ll libfdfsclient*</p> <p>-rwxr-xr-x. 1 root root 255538 Jul 27 03:01 libfdfsclient.so</p> <p><span style="font-family:宋体">删除</span>:</p> <p><strong>[root@bogon lib64]# rm -rf libfdfsclient*</strong></p> <p> </p> <h3 style="margin-left:18.0pt">9) <span style="font-family:宋体">删除</span>/usr/lib/<span style="font-family:宋体">目录下的库</span></h3> <p><span style="font-family:宋体">查看</span>:</p> <p>[root@bogon lib64]# ll libfdfsclient*</p> <p>-rwxr-xr-x. 1 root root 255538 Jul 27 03:01 libfdfsclient.so</p> <p><span style="font-family:宋体">删除</span>:</p> <p><strong>[root@bogon lib64]# rm -rf libfdfsclient*</strong></p> <p> </p> <p> </p> <h3><span style="font-family:宋体">经过以上步骤</span>,FastDFS<span style="font-family:宋体">已经卸载。</span></h3>
  • Cassandra数据库使用Datastax详解

    今天我又回到了更多的Cassandra和Java集成中,重点关注使用Datastax Java驱动程序,而不是我已经写了很多的Spring Data Cassandra今天我又回到了更多的Cassandra和Java集成中,重点关注使用Datastax Java驱动程序,而不是我已经写了很多的Spring Data Cassandra。Spring Data实际上使用了Datastax驱动程序来与Cassandra进行交互,但是它还带有一些额外的好东西。但我们今天不想要这些!我们将直接使用Datastax驱动程序,并且在看到如何使用Datastax驱动程序后,我们会将其与Spring Data进行比较。这篇文章假设你已经熟悉Cassandra和Spring Data Cassandra。由于我已经写了很多关于这个主题的文章,所以我仅仅关心Cassandra如何在需要上下文的情况下工作。如果您没有这个背景信息,我建议您阅读Spring Data Cassandra入门,我明显谈到了使用Spring Data Cassandra,但也对Cassandra的工作方式做了比本文更加全面的解释。还有Datastax Academy提供了一些非常有用的资源来学习如何使用Cassandra。首先,依赖关系。<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>com.datastax.cassandra</groupId> <artifactId>cassandra-driver-core</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>com.datastax.cassandra</groupId> <artifactId>cassandra-driver-mapping</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.7</version> </dependency> </dependencies>和往常一样,我使用的是Spring Boot,只是因为我们剥夺了Spring的数据并不意味着我们需要从所有Spring库中完全变冷的火鸡。Datastax相关的依赖关系是cassandra-driver-core和cassandra-driver-mapping。cassandra-driver-core,顾名思义就是提供了与Cassandra交互的核心功能,例如设置会话和编写查询。cassandra-driver-mapping不需要查询Cassandra,但提供了一些对象映射,与核心驱动程序一起使用,它现在将作为ORM使用,而不仅仅是允许我们执行CQL语句。我们现在已经对我们的依赖关系进行了排序,下一步是连接到Cassandra,以便我们可以真正开始查询它。@Configuration public class CassandraConfig { @Bean public Cluster cluster( @Value("${cassandra.host:127.0.0.1}") String host, @Value("${cassandra.cluster.name:cluster}") String clusterName, @Value("${cassandra.port:9042}") int port) { return Cluster.builder() .addContactPoint(host) .withPort(port) .withClusterName(clusterName) .build(); } @Bean public Session session(Cluster cluster, @Value("${cassandra.keyspace}") String keyspace) throws IOException { final Session session = cluster.connect(); setupKeyspace(session, keyspace); return session; } private void setupKeyspace(Session session, String keyspace) throws IOException { final Map<String, Object> replication = new HashMap<>(); replication.put("class", "SimpleStrategy"); replication.put("replication_factor", 1); session.execute(createKeyspace(keyspace).ifNotExists().with().replication(replication)); session.execute("USE " + keyspace); // String[] statements = split(IOUtils.toString(getClass().getResourceAsStream("/cql/setup.cql")), ";"); // Arrays.stream(statements).map(statement -> normalizeSpace(statement) + ";").forEach(session::execute); } @Bean public MappingManager mappingManager(Session session) { final PropertyMapper propertyMapper = new DefaultPropertyMapper() .setNamingStrategy(new DefaultNamingStrategy(LOWER_CAMEL_CASE, LOWER_SNAKE_CASE)); final MappingConfiguration configuration = MappingConfiguration.builder().withPropertyMapper(propertyMapper).build(); return new MappingManager(session, configuration); } }与使用Spring Data的类似设置相比,这里有更多的核心(与Spring Boot的自动配置结合使用时,甚至不需要这个类),但类本身非常简单。这里显示的Cluster和Sessionbean 的基本设置是应用程序工作所需的最低限度的最低限度,并且对于您编写的任何应用程序而言可能保持不变。提供了更多方法,以便您可以添加任何其他配置以使其适合您的使用情况。通过使用来自application.properties我们的值来设置主机地址,集群名称和端口Cluster。在Cluster随后被用来创建一个Session。这样做有两种选择,可以设置默认的键盘空间。如果你想设置默认密钥空间,那么你所需要做的就是使用下面的代码。@Bean public Session session(Cluster cluster, @Value("${cassandra.keyspace}") String keyspace) throws IOException { final Session session = cluster.connect(keyspace); // any other setup return session; }密钥空间被传递给connect将创建一个Session然后执行的方法,USE <keyspace>从而设置默认密钥空间。这依赖于在创建会话之前存在的密钥空间,如果它不会在执行USE语句时失败。如果您不知道启动时是否存在密钥空间,或者您知道您肯定希望根据属性文件中的密钥空间值动态创建密钥空间,那么您将需要调用connect而不指定密钥空间。然后你需要自己创建它,所以你实际上有东西可以使用。要做到这一点使用由createKeyspace提供的方法SchemaBuilder。以下是创建密钥空间的CQL语句。CREATE KEYSPACE IF NOT EXISTS <keyspace> WITH REPLICATION = { 'class':'SimpleStrategy', 'replication_factor':1 };我还在下面添加了密码空间代码,因为它现在有点远了。private void setupKeyspace(Session session, String keyspace) throws IOException { final Map<String, Object> replication = new HashMap<>(); replication.put("class", "SimpleStrategy"); replication.put("replication_factor", 1); session.execute(createKeyspace(keyspace).ifNotExists().with().replication(replication)); session.execute("USE " + keyspace); }这SchemaBuilder是很好,易于使用,看起来非常类似于你通过它的CQL。我们增加一个ifNotExists条款,先调用设定的复制因子with,然后传递Map<String, Object>到replicationMethod。此映射需要包含类和复制因子,基本上使用这里显示的键,但将映射的值更改为您需要的值。不要忘记execute语句,然后告诉会话使用刚刚创建的密钥空间。不幸的是,没有更好的方法来手动设置默认密钥空间,并且执行USE语句是唯一的选择。继以前两个有关设置默认密钥空间的选项之后。如果我们选择不设置默认密钥空间,那么我们需要在每个我们创建的表上以及每个执行的查询上加上一个密钥空间。Datastax提供了将密钥空间名称添加到查询以及映射到实体的方法,这并不难。我不会再深入研究这个主题,但要知道,如果您已经正确设置了其他所有内容,则不设置密钥空间不会阻止您的应用程序工作。一旦设置了密钥空间,我们就可以开始创建表格。有两种可能的方法来做到这一点。一,执行一些CQL语句,无论它们是Java代码中的字符串,还是从外部CQL脚本中读取。二,使用SchemaBuilder来创建它们。让我们先看看执行CQL语句,还是更准确地从CQL文件执行它们。您可能已经注意到,在原始示例中留下了一些注释掉的代码,但未注释代码将找到名为的文件setup.cql,读出单个CQL语句,执行它,然后移至下一个语句。这里又是。String[] statements = split(IOUtils.toString(getClass().getResourceAsStream("/cql/setup.cql")), ";"); Arrays.stream(statements).map(statement -> normalizeSpace(statement) + ";").forEach(session::execute); 下面是创建Cassandra表的文件中包含的CQL。REATE TABLE IF NOT EXISTS people_by_country( country TEXT, first_name TEXT, last_name TEXT, id UUID, age INT, profession TEXT, salary INT, PRIMARY KEY((country), first_name, last_name, id) );的主键由的country,first_name,last_name和id字段。分区键仅由country字段组成,而集群列是键中的其余键,id仅用于唯一性,因为您显然可以使用具有相同名称的人。在我的早期文章Spring Data Cassandra入门中,我深入探讨了主键的主题。此代码使用commons-io和commons-lang3依赖关系。如果我们不以这种方式执行CQL,那么可以删除这些依赖关系(在这篇文章的上下文中)。怎么样使用SchemaBuilder?我没有包含任何代码来创建原始代码片段中的表格,因为我正在玩耍并试图找出最好的地方放置它,现在我已将其卡在存储库中,但我仍然不相信那是它是完美的地方。无论如何,我会在这里粘贴代码,以便我们现在可以查看它,然后当它重新出现时我们可以跳过它。private void createTable(Session session) { session.execute( SchemaBuilder.createTable(TABLE) .ifNotExists() .addPartitionKey("country", text()) .addClusteringColumn("first_name", text()) .addClusteringColumn("last_name", text()) .addClusteringColumn("id", uuid()) .addColumn("age", cint()) .addColumn("profession", text()) .addColumn("salary", cint())); }这与上面显示的CQL很好地匹配。我们能够使用addPartitionKey和定义不同的列类型addClusteringColumn来创建我们的主键和addColumn标准字段。还有很多其他的方法,比如addStaticColumn和withOptions允许你再调用clusteringOrder来定义集群列的排序方向。您调用这些方法的顺序非常重要,因为分区键和聚簇列将按其各自方法的调用顺序创建。Datastax还提供了DataType该类来更容易地定义列类型,例如text匹配TEXT和cint匹配INT。和上次一样SchemaBuilder,一旦我们对桌子设计感到满意,我们就需要execute 它。在MappingManager下面,创建bean的代码片段如下。@Bean public MappingManager mappingManager(Session session) { final PropertyMapper propertyMapper = new DefaultPropertyMapper() .setNamingStrategy(new DefaultNamingStrategy(LOWER_CAMEL_CASE, LOWER_SNAKE_CASE)); final MappingConfiguration configuration = MappingConfiguration.builder().withPropertyMapper(propertyMapper).build(); return new MappingManager(session, configuration); }该MappingManagerbean来自于cassandra-driver-mapping依赖关系,并将映射ResultSet到一个实体(我们稍后会看到)。现在我们只需要创建bean。如果我们对在Cassandra中将Java驼峰案例转换为全部小写字母并且没有分隔符的默认命名策略不满意,我们需要设置自己的。要做到这一点,我们可以传入一个DefaultNamingStrategy来定义我们在Java类中使用的情况以及我们在Cassandra中使用的情况。由于在Java中,我们通常使用骆驼案例LOWER_CAMEL_CASE,因为我喜欢在Cassandra中使用蛇案例,所以我们可以使用它们LOWER_SNAKE_CASE(这些都在NamingConventions课堂中找到)。对lower的引用指定了字符串中第一个字符的大小写,LOWER_CAMEL_CASE表示firstName和UPPER_CAMEL_CASE表示FirstName。DefaultPropertyMapper为更具体的配置提供额外的方法,但MappingConfiguration只有一个工作PropertyMapper需要传递给a MappingManager。接下来我们应该看到的是将会持续到Cassandra并从Cassandra中检索的实体,这为我们节省了手动设置插入值和转换读取结果的工作量。Datastax驱动程序为我们提供了一种相对简单的方法,通过使用注释来标记属性,例如它所映射到的表的名称,哪个字段与Cassandra列以及主键所组成的字段相匹配。@Table(name = "people_by_country") public class Person { @PartitionKey private String country; @ClusteringColumn private String firstName; @ClusteringColumn(1) private String lastName; @ClusteringColumn(2) private UUID id; private int age; private String profession; private int salary; private Person() { } public Person(String country, String firstName, String lastName, UUID id, int age, String profession, int salary) { this.country = country; this.firstName = firstName; this.lastName = lastName; this.id = id; this.age = age; this.profession = profession; this.salary = salary; } // getters and setters for each property // equals, hashCode, toString } 这个实体表示如people_by_country表所示的表@Table。我再次将下表中的CQL作为参考。CREATE TABLE IF NOT EXISTS people_by_country( country TEXT, first_name TEXT, last_name TEXT, id UUID, age INT, profession TEXT, salary INT, PRIMARY KEY((country), first_name, last_name, id) );该@Table注释必须指定实体代表表的名称,还配备了根据您的要求,如各种其他的选择keyspace,如果你不想使用密钥空间的默认Sessionbean被配置为使用,caseSensitiveTable这是自我解释。主键是什么?如上所述,主键由分区键组成,分区键本身包含一个或多个列和/或集群列。为了匹配上面定义的Cassandra表,我们在必填字段中添加了注释@PartitionKey和@ClusteringColumn注释。这两个注释都有一个属性,value它指定列在主键中的显示顺序。默认值是0这是为什么一些注释不包含值的原因。获得这个实体的最后一个要求是getter,setter和一个默认的构造函数,这样mapper就可以做到这一点。如果你不想让任何人访问它,默认的构造函数可以是私有的,因为映射器使用反射来检索它。你可能不希望在你的实体上放置setter,因为你希望这个对象是不可变的,不幸的是,对于这件事你没有什么可以做的,你只能承认这个争斗。虽然我个人认为这很好,因为你可以(也许应该)将实体转换为另一个可以在应用程序中传递的对象,而不需要任何实体注释,因此不需要知道数据库本身。然后,实体可以保持可变状态,并且您传递的其他对象可以按照您的意愿完全工作。在我们继续之前,我想提到的最后一件事。还记得DefaultNamingConvention我们之前定义的吗?这意味着我们的字段正在匹配正确的列,而无需在实体中做任何额外的工作。如果您没有这样做或想要为列名提供不同的字段名称,那么您可以使用@Column注释并在那里指定它。我们几乎拥有构建示例应用程序所需的所有组件。倒数第二个组件正在创建一个存储库,该存储库将包含用于持续读取和从Cassandra读取数据的所有逻辑。我们将利用MappingManager我们之前创建的bean和我们放到实体上的注释将a ResultSet转换为实体,而不需要我们自己做任何事情。@Repository public class PersonRepository { private Mapper<Person> mapper; private Session session; private static final String TABLE = "people_by_country"; public PersonRepository(MappingManager mappingManager) { createTable(mappingManager.getSession()); this.mapper = mappingManager.mapper(Person.class); this.session = mappingManager.getSession(); } private void createTable(Session session) { // use SchemaBuilder to create table } public Person find(String country, String firstName, String secondName, UUID id) { return mapper.get(country, firstName, secondName, id); } public List<Person> findAll() { final ResultSet result = session.execute(select().all().from(TABLE)); return mapper.map(result).all(); } public List<Person> findAllByCountry(String country) { final ResultSet result = session.execute(select().all().from(TABLE).where(eq("country", country))); return mapper.map(result).all(); } public void delete(String country, String firstName, String secondName, UUID id) { mapper.delete(country, firstName, secondName, id); } public Person save(Person person) { mapper.save(person); return person; } }通过MappingManager构造函数注入in并调用该类的mapper方法Person,我们将返回一个Mapper<Person>将亲自处理我们所有映射需求的函数。我们还需要检索Session能够执行很好包含在MappingManager我们注入的查询。对于三个查询,我们直接依靠映射器与Cassandra进行交互,但这只适用于单个记录。get,save并且delete每个工作都通过接受构成Person实体主键的值来工作,并且必须以正确的顺序输入,否则您将遇到意外的结果或异常将被抛出。其他情况需要执行查询才能调用映射器,将返回的数据ResultSet转换为实体或实体集合。我已经利用QueryBuilder写查询,我也选择了这个职位,不写预先准备的语句。尽管在大多数情况下,您应该使用准备好的陈述,我认为我将在未来的一篇文章中介绍这些陈述,虽然它们足够相似,QueryBuilder仍然可以使用,所以我相信如果需要,您可以自己弄清楚。QueryBuilder提供的静态方法来创建select,insert,update并且delete然后可以链接在一起,以语句(我知道这听起来很明显)构建查询。这里QueryBuilder使用的也是您可以在Spring Data Cassandra中使用的那个,当您需要手动创建自己的查询并且不依赖来自Cassandra存储库的推断查询时。创建这个小应用程序的最后一步是实际运行它。由于我们使用Spring Boot,我们只需添加标准@SpringBootApplication并运行该类。我已经完成了下面的工作,以及使用CommandLineRunner执行存储库中的方法,以便我们可以检查他们是否在做我们期望的。@SpringBootApplication public class Application implements CommandLineRunner { @Autowired private PersonRepository personRepository; public static void main(String args[]) { SpringApplication.run(Application.class); } @Override public void run(String... args) { final Person bob = new Person("UK", "Bob", "Bobbington", UUID.randomUUID(), 50, "Software Developer", 50000); final Person john = new Person("UK", "John", "Doe", UUID.randomUUID(), 30, "Doctor", 100000); personRepository.save(bob); personRepository.save(john); System.out.println("Find all"); personRepository.findAll().forEach(System.out::println); System.out.println("Find one record"); System.out.println(personRepository.find(john.getCountry(), john.getFirstName(), john.getLastName(), john.getId())); System.out.println("Find all by country"); personRepository.findAllByCountry("UK").forEach(System.out::println); john.setProfession("Unemployed"); john.setSalary(0); personRepository.save(john); System.out.println("Demonstrating updating a record"); System.out.println(personRepository.find(john.getCountry(), john.getFirstName(), john.getLastName(), john.getId())); personRepository.delete(john.getCountry(), john.getFirstName(), john.getLastName(), john.getId()); System.out.println("Demonstrating deleting a record"); System.out.println(personRepository.find(john.getCountry(), john.getFirstName(), john.getLastName(), john.getId())); } } 该run方法包含一些打印行,所以我们可以看到发生了什么,下面是他们输出的内容。Find all Person{country='US', firstName='Alice', lastName='Cooper', id=e113b6c2-5041-4575-9b0b-a0726710e82d, age=45, profession='Engineer', salary=1000000} Person{country='UK', firstName='Bob', lastName='Bobbington', id=d6af6b9a-341c-4023-acb5-8c22e0174da7, age=50, profession='Software Developer', salary=50000} Person{country='UK', firstName='John', lastName='Doe', id=f7015e45-34d7-4f25-ab25-ca3727df7759, age=30, profession='Doctor', salary=100000} Find one record Person{country='UK', firstName='John', lastName='Doe', id=f7015e45-34d7-4f25-ab25-ca3727df7759, age=30, profession='Doctor', salary=100000} Find all by country Person{country='UK', firstName='Bob', lastName='Bobbington', id=d6af6b9a-341c-4023-acb5-8c22e0174da7, age=50, profession='Software Developer', salary=50000} Person{country='UK', firstName='John', lastName='Doe', id=f7015e45-34d7-4f25-ab25-ca3727df7759, age=30, profession='Doctor', salary=100000} Demonstrating updating a record Person{country='UK', firstName='John', lastName='Doe', id=f7015e45-34d7-4f25-ab25-ca3727df7759, age=30, profession='Unemployed', salary=0} Demonstrating deleting a record null我们可以看到findAll已经返回了所有记录,find并且只检索到与输入主键值相匹配的记录。findAllByCountry已经排除了爱丽丝,并只发现了英国的记录。save再次调用现有记录将更新记录而不是插入。最后delete将从数据库中删除该人的数据(如删除Facebook?!?!)。这是一个包装。我将尝试在未来写一些后续文章,因为我们可以使用Datastax驱动程序进行一些更有趣的事情,这是我们在本文中未涉及到的。我们在这里涵盖的内容应该足以让您使用驱动程序的第一步,并从您的应用程序开始查询Cassandra。在我们走之前,我想对Datastax驱动程序和Spring Data Cassandra进行一些比较。与Spring Data Cassandra相比,Datastax驱动程序(在我看来)中缺少支持创建表格的支持。Spring Data能够根据您的实体创建您的表格这一事实可以消除所有这些额外的工作,以基本上重写您已经编写的内容。显然,如果您不想使用实体注释,则差异将消失,因为您需要在Datastax和Spring Data中手动创建表。实体设计的方式和使用的注释也很不相同。这一点与我之前提到的观点密切相关。由于Spring Data可以为您创建表格,因此更需要更精确的注释,以便您指定表格的设计,例如聚类列的排序顺序。这显然可以使课堂变得混乱,并且会带来一系列通常不被看好的注释。Spring Data还为标准查询提供了更好的支持,例如findAll插入一组实体。显然,这不是完全世界的尽头,实现这些将花费很少的努力,但这几乎总结了Datastax驱动程序和Spring Data Cassandra之间的主要区别。Spring Data更容易使用。关于这个问题我不认为还有什么可说的。由于Spring Data Cassandra是基于Datastax驱动程序构建的,因此显然它可以执行驱动程序的所有功能,如果缺少任何需要的内容,则可以直接访问Datastax类并执行所需的操作。但是Spring Data提供的便利不应该被查看,我认为我甚至没有涉及它提供的一些更有用的部分,因为这篇文章只是介绍基础知识。一旦您使用Spring Boot的自动配置和Cassandra存储库为您产生的推断查询,甚至不要让我开始了解它的容易程度。我应该停止......这正在变成一场咆哮。总之,使用Datastax驱动程序连接和查询Cassandra数据库是相当直接的。建立与Cassandra的连接,创建您需要的实体并编写使用前者的存储库,然后获得所需的一切。我们还将Datastax驱动程序与Spring Data Cassandra进行了比较,Datastax将尽其所能满足您的需求,但Spring Data使其更容易。项目源码下载:demo-datastax-java-driver-master.zip