精华内容
下载资源
问答
  • IndexedDB详解

    千次阅读 2021-01-11 11:00:49
    IndexedDB是一种在浏览器端存储数据的方式。既然称之为DB,是因为它丰富了客户端的查询方式,并且因为是本地存储,可以有效的减少网络对页面数据的影响。 有了IndexedDB,浏览器可以存储更多的数据,从而丰富了...

    简介

    IndexedDB是一种在浏览器端存储数据的方式。既然称之为DB,是因为它丰富了客户端的查询方式,并且因为是本地存储,可以有效的减少网络对页面数据的影响。

    有了IndexedDB,浏览器可以存储更多的数据,从而丰富了浏览器端的应用类型。

    IndexedDB简介

    IndexedDB和传统的关系型数据不同的是,它是一个key-value型的数据库。

    value可以是复杂的结构体对象,key可以是对象的某些属性值也可以是其他的对象(包括二进制对象)。你可以使用对象中的任何属性做为index,以加快查找。

    IndexedDB是自带transaction的,所有的数据库操作都会绑定到特定的事务上,并且这些事务是自动提交了,IndexedDB并不支持手动提交事务。

    IndexedDB API大部分都是异步的,在使用异步方法的时候,API不会立马返回要查询的数据,而是返回一个callback。

    异步API的本质是向数据库发送一个操作请求,当操作完成的时候,会收到一个DOM event,通过该event,我们会知道操作是否成功,并且获得操作的结果。

    IndexedDB是一种 NoSQL 数据库,和关系型数据库不同的是,IndexedDB是面向对象的,它存储的是Javascript对象。

    IndexedDB还有一个很重要的特点是其同源策略,每个源都会关联到不同的数据库集合,不同源是不允许访问其他源的数据库,从而保证了IndexedDB的安全性。

    IndexedDB的使用

    这一节,我们将会以具体的例子来讲解如何使用IndexedDB。

    IndexedDB的浏览器支持

    不同的浏览器对于IndexedDB有不同的实现,正常来说,我们可以使用window.indexedDB来获取到浏览器的indexedDB对象。但是对于某些浏览器来说,还没有使用标准的window.indexedDB,而是用带前缀的实现。

    所以我们在使用过程中通常需要进行判断和转换:

    // In the following line, you should include the prefixes of implementations you want to test.
    window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
    // DON'T use "var indexedDB = ..." if you're not in a function.
    // Moreover, you may need references to some window.IDB* objects:
    window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction || {READ_WRITE: "readwrite"}; // This line should only be needed if it is needed to support the object's constants for older browsers
    window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange;
    // (Mozilla has never prefixed these objects, so we don't need window.mozIDB*)
    

    上面我们从window获取了indexedDB,IDBTransaction和IDBKeyRange三个对象。

    其中indexedDB表示的是数据库的连接。IDBTransaction表示的是transaction,而IDBKeyRange则是用从数据库的某个特定key range中取出数据。

    但是,通常来说带前缀的实现一般都是不稳定的,所以我们通常不建议在正式环境中使用,所以如果不支持标准表达式的话,需要直接报错:

    if (!window.indexedDB) {
        console.log("Your browser doesn't support a stable version of IndexedDB. Such and such feature will not be available.");
    }
    

    创建IndexedDB

    要使用IndexedDB,我们首先需要open it:

    // Let us open our database
    var request = window.indexedDB.open("MyTestDatabase", 3);
    

    open方法返回一个IDBOpenDBRequest对象,同时这是一个异步操作,open操作并不会立马打开数据库或者开启事务,我们可以通过监听request的事件来进行相应的处理。

    open方法传入两个参数,第一个参数是数据库的名字,第二个参数是数据库的版本号。

    当你创建一个新的数据库或者升级一个现有的数据库版本的时候,将会触发一个onupgradeneeded事件,并在事件中传入IDBVersionChangeEvent,我们可以通过event.target.result来获取到IDBDatabase对象,然后通过这个对象来进行数据库的版本升级操作。如下所示:

    // This event is only implemented in recent browsers   
    request.onupgradeneeded = function(event) { 
      // Save the IDBDatabase interface 
      var db = event.target.result;
    
      // Create an objectStore for this database
      var objectStore = db.createObjectStore("name", { keyPath: "myKey" });
    };
    

    注意,这里的版本号是一个整数。如果你传入一个float,那么将会对该float进行取整操作。

    有了request,我们可以通过监听onerror或者onsuccess事件来进行相应的处理。

    var db;
    var request = indexedDB.open("MyTestDatabase");
    request.onerror = function(event) {
      console.log("Why didn't you allow my web app to use IndexedDB?!");
    };
    request.onsuccess = function(event) {
      db = event.target.result;
    };
    

    拿到db对象之后,我们可以设置全局的异常处理:

    db.onerror = function(event) {
      // Generic error handler for all errors targeted at this database's
      // requests!
      console.error("Database error: " + event.target.errorCode);
    };
    

    IndexedDB中的table叫做object stores,和关系型数据库中的table一样,object stores中的每一个对象都和一个key相关联,和key相关的有两个概念 key path 和 key generator.

    如果存储的是javascript Object对象,那么可以指定该对象中的某一个属性作为key path,那么这个属性将会被作为key。

    如果没有指定key path,那么存储的Object可以是任何对象,甚至是基础类型比如数字和String。

    而key generator就是key的生成器。

    假如我们想要存储这样的数据:

    // This is what our customer data looks like.
    const customerData = [
      { ssn: "444-44-4444", name: "Bill", age: 35, email: "bill@company.com" },
      { ssn: "555-55-5555", name: "Donna", age: 32, email: "donna@home.org" }
    ];
    

    看一下对应的数据库操作是怎么样的:

    const dbName = "the_name";
    
    var request = indexedDB.open(dbName, 2);
    
    request.onerror = function(event) {
      // Handle errors.
    };
    request.onupgradeneeded = function(event) {
      var db = event.target.result;
    
      // Create an objectStore to hold information about our customers. We're
      // going to use "ssn" as our key path because it's guaranteed to be
      // unique - or at least that's what I was told during the kickoff meeting.
      var objectStore = db.createObjectStore("customers", { keyPath: "ssn" });
    
      // Create an index to search customers by name. We may have duplicates
      // so we can't use a unique index.
      objectStore.createIndex("name", "name", { unique: false });
    
      // Create an index to search customers by email. We want to ensure that
      // no two customers have the same email, so use a unique index.
      objectStore.createIndex("email", "email", { unique: true });
    
      // Use transaction oncomplete to make sure the objectStore creation is 
      // finished before adding data into it.
      objectStore.transaction.oncomplete = function(event) {
        // Store values in the newly created objectStore.
        var customerObjectStore = db.transaction("customers", "readwrite").objectStore("customers");
        customerData.forEach(function(customer) {
          customerObjectStore.add(customer);
        });
      };
    };
    

    我们需要在onupgradeneeded事件中处理所有的schema相关的操作。

    首先使用db.createObjectStore创建了一个customers的ObjectStore,并且使用了对象的keypath作为key。

    除了key之外,我们创建了两个index,以提高查询速度。

    最后我们监听transaction.oncomplete事件,并在里面加入存储object的操作。

    上面的代码中,我们使用了keyPath作为key。

    下面是一个使用key Generator的例子:

     var objStore = db.createObjectStore("names", { autoIncrement : true });
    

    indexdb中的CURD

    indexedDB的所有操作都需要在事务中,我们看一个开启事务的操作:

    var transaction = db.transaction(["customers"], "readwrite");
    

    上面的例子中使用readwrite来操作customers ObjectStore。

    transaction接收两个参数,第一个参数是一个数组,数组中是这个trans中将会处理的ObjectStores,第二个参数是处理的模式。

    有了transaction之后,我们可以监听事务的complete和error操作,然后就可以进行add操作了:

    // Do something when all the data is added to the database.
    transaction.oncomplete = function(event) {
      console.log("All done!");
    };
    
    transaction.onerror = function(event) {
      // Don't forget to handle errors!
    };
    
    var objectStore = transaction.objectStore("customers");
    customerData.forEach(function(customer) {
      var request = objectStore.add(customer);
      request.onsuccess = function(event) {
        // event.target.result === customer.ssn;
      };
    });
    

    上面的例子中,我们使用了add方法,add的前提是数据库中并不存在相同key的对象。除了add方法之外,我们还可以使用put方法,put方法主要用来进行更新操作。

    再看一个删除的操作:

    var request = db.transaction(["customers"], "readwrite")
                    .objectStore("customers")
                    .delete("444-44-4444");
    request.onsuccess = function(event) {
      // It's gone!
    };
    

    现在我们的数据库已经有了数据,我们看下怎么进行查询:

    var transaction = db.transaction(["customers"]);
    var objectStore = transaction.objectStore("customers");
    var request = objectStore.get("444-44-4444");
    request.onerror = function(event) {
      // Handle errors!
    };
    request.onsuccess = function(event) {
      // Do something with the request.result!
      console.log("Name for SSN 444-44-4444 is " + request.result.name);
    

    这里,我们直接使用了db.transaction,默认情况下是readonly模式的。

    下面是一个更新的例子:

    var objectStore = db.transaction(["customers"], "readwrite").objectStore("customers");
    var request = objectStore.get("444-44-4444");
    request.onerror = function(event) {
      // Handle errors!
    };
    request.onsuccess = function(event) {
      // Get the old value that we want to update
      var data = event.target.result;
      
      // update the value(s) in the object that you want to change
      data.age = 42;
    
      // Put this updated object back into the database.
      var requestUpdate = objectStore.put(data);
       requestUpdate.onerror = function(event) {
         // Do something with the error
       };
       requestUpdate.onsuccess = function(event) {
         // Success - the data is updated!
       };
    };
    

    更新我们使用的是put方法。

    使用游标cursor

    indexedDB支持游标操作,我们可以使用cursor来遍历objectStore的数据:

    var objectStore = db.transaction("customers").objectStore("customers");
    
    objectStore.openCursor().onsuccess = function(event) {
      var cursor = event.target.result;
      if (cursor) {
        console.log("Name for SSN " + cursor.key + " is " + cursor.value.name);
        cursor.continue();
      }
      else {
        console.log("No more entries!");
      }
    };
    

    openCursor可以接受多个参数,第一个参数可以接受key的查询范围,第二个参数用来指定遍历的方向。如果两个参数都为空的话,默认是所有的数据的以升序的顺序遍历。

    如果想遍历下一个游标,则可以调用cursor.continue。

    我们看一下两个参数的游标使用:

    // Only match "Donna"
    var singleKeyRange = IDBKeyRange.only("Donna");
    
    // Match anything past "Bill", including "Bill"
    var lowerBoundKeyRange = IDBKeyRange.lowerBound("Bill");
    
    // Match anything past "Bill", but don't include "Bill"
    var lowerBoundOpenKeyRange = IDBKeyRange.lowerBound("Bill", true);
    
    // Match anything up to, but not including, "Donna"
    var upperBoundOpenKeyRange = IDBKeyRange.upperBound("Donna", true);
    
    // Match anything between "Bill" and "Donna", but not including "Donna"
    var boundKeyRange = IDBKeyRange.bound("Bill", "Donna", false, true);
    
    // To use one of the key ranges, pass it in as the first argument of openCursor()/openKeyCursor()
    index.openCursor(boundKeyRange, "prev").onsuccess = function(event) {
      var cursor = event.target.result;
      if (cursor) {
        // Do something with the matches.
        cursor.continue();
      }
    };
    

    除了openCursor,我们还可以通过使用openKeyCursor来遍历KeyCursor:

    // Using a normal cursor to grab whole customer record objects
    index.openCursor().onsuccess = function(event) {
      var cursor = event.target.result;
      if (cursor) {
        // cursor.key is a name, like "Bill", and cursor.value is the whole object.
        console.log("Name: " + cursor.key + ", SSN: " + cursor.value.ssn + ", email: " + cursor.value.email);
        cursor.continue();
      }
    };
    
    // Using a key cursor to grab customer record object keys
    index.openKeyCursor().onsuccess = function(event) {
      var cursor = event.target.result;
      if (cursor) {
        // cursor.key is a name, like "Bill", and cursor.value is the SSN.
        // No way to directly get the rest of the stored object.
        console.log("Name: " + cursor.key + ", SSN: " + cursor.primaryKey);
        cursor.continue();
      }
    };
    

    除此之外,我们还可以直接通过index来进行查询:

    var index = objectStore.index("name");
    
    index.get("Donna").onsuccess = function(event) {
      console.log("Donna's SSN is " + event.target.result.ssn);
    };
    

    要使用index的前提就是需要在request.onupgradeneeded中创建index。

    本文作者:flydean程序那些事

    本文链接:http://www.flydean.com/indexeddb-kickoff/

    本文来源:flydean的博客

    欢迎关注我的公众号:「程序那些事」最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

    展开全文
  • 在为SQL SERVER创建ORACLE的连接服务器时,没有ORACLE provider for OLE DB 的连接服务驱动。经网上搜索,把PDF安装说明和驱动程序一起收藏,请各位下载;
  • 中国城市 db文件

    2015-06-10 16:04:08
    中国城市 db文件,可以用到android端的数据库
  • db文件打开工具

    热门讨论 2014-12-11 13:53:20
    db文件打开的工具
  • sqlcipher-3.0.1-windows含使用教程,可以直接加密db文件,直接解密db文件,直接查看数据库表数据。windows可用!含使用教程!自己用过整理的,很好用,所以2分不亏!
  • 1. 创建 创建记录: user := User{Name: "Jinzhu", ...db.NewRecord(user) // => 主键为空返回`true` db.Create(&user) db.NewRecord(user) // => 创建`user`后返回`false` 设置默认值: 可以在gorm ...

    1. 创建

    创建记录:

    user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
    
    db.NewRecord(user) // => 主键为空返回`true`
    
    db.Create(&user)
    
    db.NewRecord(user) // => 创建`user`后返回`false`
    

    设置默认值:
    可以在gorm tag中定义默认值,然后插入SQL将忽略具有默认值的这些字段,并且其值为空,并且在将记录插入数据库后,gorm将从数据库加载这些字段的值。

    type Animal struct {
        ID   int64
        Name string `gorm:"default:'galeone'"`
        Age  int64
    }
    
    var animal = Animal{Age: 99, Name: ""}
    db.Create(&animal)
    
    INSERT INTO animals("age") values('99');
    SELECT name from animals WHERE ID=111; // 返回主键为 111
    animal.Name => 'galeone'
    

    2. 查询

    获取:第一条记录/ 最后一条记录/ 所有记录

    // 获取第一条记录,按主键排序
    db.First(&user)
     SELECT * FROM users ORDER BY id LIMIT 1;
    
    // 获取最后一条记录,按主键排序
    db.Last(&user)
     SELECT * FROM users ORDER BY id DESC LIMIT 1;
    
    // 获取所有记录
    db.Find(&users)
     SELECT * FROM users;
    
    // 使用主键获取记录
    db.First(&user, 10)
     SELECT * FROM users WHERE id = 10;
    

    Where查询条件

    // 获取第一个匹配记录
    db.Where("name = ?", "jinzhu").First(&user)
     SELECT * FROM users WHERE name = 'jinzhu' limit 1;
    
    // 获取所有匹配记录
    db.Where("name = ?", "jinzhu").Find(&users)
     SELECT * FROM users WHERE name = 'jinzhu';
    // IN
    db.Where("name in (?)", []string{"jinzhu", "jinzhu 2"}).Find(&users)
    
    // LIKE
    db.Where("name LIKE ?", "%jin%").Find(&users)
    
    // AND
    db.Where("name = ? AND age >= ?", "jinzhu", "22").Find(&users)
    
    
    

    注意:当使用struct查询时,GORM将只查询那些具有值的字段

    // Struct
    db.Where(&User{Name: "zhangyang", Age: 20}).First(&user)
     SELECT * FROM users WHERE name = "zhangyang" AND age = 20 LIMIT 1;
    
    // Map
    db.Where(map[string]interface{}{"name": "zhangyang", "age": 20}).Find(&users)
     SELECT * FROM users WHERE name = "zhangyang" AND age = 20;
    
    // 主键的Slice
    db.Where([]int64{20, 21, 22}).Find(&users)
     SELECT * FROM users WHERE id IN (20, 21, 22);
    

    Not条件查询

    db.Not("name", "jinzhu").First(&user)
     SELECT * FROM users WHERE name <> "jinzhu" LIMIT 1;
    
    // Not In
    db.Not("name", []string{"jinzhu", "jinzhu 2"}).Find(&users)
     SELECT * FROM users WHERE name NOT IN ("jinzhu", "jinzhu 2");
    
    // Not In slice of primary keys
    db.Not([]int64{1,2,3}).First(&user)
     SELECT * FROM users WHERE id NOT IN (1,2,3);
    
    db.Not([]int64{}).First(&user)
     SELECT * FROM users;
    

    Or条件查询

    db.Where("role = ?", "admin").Or("role = ?", "super_admin").Find(&users)
     SELECT * FROM users WHERE role = 'admin' OR role = 'super_admin';
    
    // Struct
    db.Where("name = 'jinzhu'").Or(User{Name: "jinzhu 2"}).Find(&users)
     SELECT * FROM users WHERE name = 'jinzhu' OR name = 'jinzhu 2';
    

    Select 指定要从数据库检索的字段,默认情况下,将选择所有字段;

    db.Select("name, age").Find(&users)
     SELECT name, age FROM users;
    
    db.Select([]string{"name", "age"}).Find(&users)
     SELECT name, age FROM users;
    

    Order

    db.Order("age desc, name").Find(&users)
     SELECT * FROM users ORDER BY age desc, name;
    
    // Multiple orders
    db.Order("age desc").Order("name").Find(&users)
     SELECT * FROM users ORDER BY age desc, name;
    
    // ReOrder 从数据库检索记录时指定顺序,将重排序设置为true以覆盖定义的条件
    db.Order("age desc").Find(&users1).Order("age", true).Find(&users2)
     SELECT * FROM users ORDER BY age desc; (users1)
     SELECT * FROM users ORDER BY age; (users2)
    

    Limit , Offset
    指定要检索的记录数

    db.Limit(3).Find(&users)
     SELECT * FROM users LIMIT 3;
    

    指定在开始返回记录之前要跳过的记录数

    db.Offset(3).Find(&users)
     SELECT * FROM users OFFSET 3;
    
    // Cancel offset condition with -1
    db.Offset(10).Find(&users1).Offset(-1).Find(&users2)
     SELECT * FROM users OFFSET 10; (users1)
     SELECT * FROM users; (users2)
    

    Count,Group & Having,Join
    获取记录数

    db.Where("name = ?", "jinzhu").Or("name = ?", "jinzhu 2").Find(&users).Count(&count)
     SELECT * from USERS WHERE name = 'jinzhu' OR name = 'jinzhu 2'; (users)
     SELECT count(*) FROM users WHERE name = 'jinzhu' OR name = 'jinzhu 2'; (count)
    
    db.Model(&User{}).Where("name = ?", "jinzhu").Count(&count)
     SELECT count(*) FROM users WHERE name = 'jinzhu'; (count)
    
    //指定表deleted_users
    db.Table("deleted_users").Count(&count)
    //
    
    rows, err := db.Table("orders").Select("date(created_at) as date, sum(amount) as total").Group("date(created_at)").Rows()
    
    rows, err := db.Table("users").Select("users.name, emails.email").Joins("left join emails on emails.user_id = users.id").Rows()
    

    3. 更新

    更新全部字段
    Save将包括执行更新SQL时的所有字段,即使它没有更改

    db.First(&user)
    
    user.Name = "jinzhu 2"
    user.Age = 100
    db.Save(&user)
    
     UPDATE users SET name='jinzhu 2', age=100, birthday='2016-01-01', updated_at = '2013-11-17 21:34:10' WHERE id=111;
    

    更新指定字段
    如果只想更新指定字段,可以使用Update, Updates

    // 更新单个属性(如果更改)
    db.Model(&user).Update("name", "hello")
     UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111;
    
    // 使用组合条件更新单个属性
    db.Model(&user).Where("active = ?", true).Update("name", "hello")
     UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111 AND active=true;
    
    // 使用`map`更新多个属性,只会更新这些更改的字段
    db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false})
     UPDATE users SET name='hello', age=18, actived=false, updated_at='2013-11-17 21:34:10' WHERE id=111;
    
    // 使用`struct`更新多个属性,只会更新这些更改的和非空白字段
    db.Model(&user).Updates(User{Name: "hello", Age: 18})
     UPDATE users SET name='hello', age=18, updated_at = '2013-11-17 21:34:10' WHERE id = 111;
    
    // 警告:当使用struct更新时,FORM将仅更新具有非空值的字段
    // 对于下面的更新,什么都不会更新为"",0,false是其类型的空白值
    db.Model(&user).Updates(User{Name: "", Age: 0, Actived: false})
    

    更新选择的字段
    如果您只想在更新时更新或忽略某些字段,可以使用Select, Omit

    db.Model(&user).Select("name").Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false})
     UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111;
    
    db.Model(&user).Omit("name").Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false})
     UPDATE users SET age=18, actived=false, updated_at='2013-11-17 21:34:10' WHERE id=111;
    

    4. 删除

    警告:删除记录时,需要确保其主要字段具有值,GORM将使用主键删除记录,如果主要字段为空,GORM将删除模型的所有记录

    // 删除存在的记录
    db.Delete(&email)
     DELETE from emails where id=10;
    
    // 为Delete语句添加额外的SQL选项
    db.Set("gorm:delete_option", "OPTION (OPTIMIZE FOR UNKNOWN)").Delete(&email)
     DELETE from emails where id=10 OPTION (OPTIMIZE FOR UNKNOWN);
    

    批量删除
    删除所有匹配记录

    db.Where("email LIKE ?", "%jinzhu%").Delete(Email{})
     DELETE from emails where email LIKE "%jinhu%";
    
    db.Delete(Email{}, "email LIKE ?", "%jinzhu%")
     DELETE from emails where email LIKE "%jinhu%";
    
    展开全文
  • DB数据库编辑器(破解版)_3.1.6.54

    热门讨论 2014-07-03 21:14:55
    DB数据库编辑器(破解版)_3.1.6.54
  • TimescaleDB部署

    千次阅读 2018-12-03 17:35:23
    1、准备 ...Timescale: timescaledb(只支持pgsql9.x和10.x) Timescale release_tag: 1.0.0 cmake: cmake-3.10.2.tar(Timescale要求CMake 3.4或更高版本) 安装TimescaleDB时序数据库需要...

    1、准备

    操作系统: CentOS 7 64位操作系统

    安装程序: postgresql-10.2.tar.gz

    Timescale: timescaledb(只支持pgsql9.x和10.x)

    Timescale release_tag: 1.0.0

    cmake: cmake-3.10.2.tar(Timescale要求CMake 3.4或更高版本)

    安装TimescaleDB时序数据库需要提前安装PostgresSQL数据库,因为TimescaleDB是实时数据库PostgresSQL的插件。并且,目前TimescaleDB只支持在PostgresSQL9.x和10.x中运行。

    PostgresSQL数据库安装程序依然可以通过官网或第三方网站下载(坚定的支持从官网下载)。可以直接将程序下载到本地,然后通过FTP/SFTP方式上传到服务,也可以通过命令wget直接下载到服务器(如果服务器能够连接到以太网,推荐此方式)。

    2、部署

    Timescale的安装分为两部分。一部分为安装PostgresSQL,另一部分为安装TimescaleDB插件。

    2.1、部署PostgresSQL

    获取安装包

    现将 PostgreSQL 的安装包下载到服务器器中,我们在 /opt/⽬目录下创建保存安装包的目录/postgresql_pkg

    此处选择直接从服务器器下载 PostgreSQL 安装包。

    执⾏命令:

    > mkdir /opt/postgresql_pkg
    > cd /opt/postgresql_pkg
    > wget https://ftp.postgresql.org/pub/source/v10.2/postgresql-10.2.tar.gz
    

    关闭selinux

    在Linux系统中,如果selinux没有设置为permissive或者是disable的情况下,有些Linux系统上的应用程序运行时可能会被拒绝,导致无法正常运行,所以需要关闭selinux(如果有专业运维人员可以进行详细配置来规避此问题)。

    执行命令:

    > vim /etc/selinux/config
    

    修改内容:

    SELINUX=disable
    #SELINUXTYPE=targeted
    

    创建用户

    需要注意的是PostgresSQL是禁止使用超级管理员来运行服务命令的,所以我们需要创建一个账号来进行后续的PostgresSQL的安装。

    我们创建一个用户组,向创建的用户组中添加一个用户账号,并且给该用户创建密码。

    执行命令:

    > groupadd postgres
    > useradd -g postgres postgres
    > passwd postgres
    

    创建安装目录

    创建 PostgreSQL需要的⽬录,并且为⽬录 /mnt/db1 赋予读写权限。

    > mkdir -p /mnt/db1/pgdata/pgsql /mnt/db1/pgdata/pgtbs /mnt/db1/archivelog /backups
    > chmod -R 775 /mnt/db1
    > chown -R postgres:postgres /mnt/db1
    

    安装依赖

    在编译安装程序之前先安装PostgresSQL需要的依赖。

    > yum install -y gcc gcc-c++  epel-release llvm5.0 llvm5.0-devel clang libicu-
    devel perl-ExtUtils-Embed zlib-devel openssl openssl-devel pam-devel libxml2-devel
    libxslt-devel openldap-devel systemd-devel tcl-devel python-devel
    > yum install -y llvm5.0 llvm5.0-devel
    

    编译安装

    进入保存 PostgreSQL 安装包的目录 /opt/postgresql_pkg,解压、编译、安装等操作

    执行命令:

    > cd /opt/postgresql_pkg
    

    进入保存安装包的目录之后,解压安装包并进入解压后的目录。

    执行命令:

    > tar -zxvf ./postgresql-11.1.tar.gz
    > mkdir -p ./postgresql-11.1/build_dir
    > cd ./postgresql-11.1/build_dir
    

    开始编译

    > ../configure --prefix=/usr/local/pgsql --without-readline --with-openssl
    > make world
    > make install
    

    启动配置

    添加启动配置文件。

    执行命令:

    > vim /usr/lib/systemd/system/postgresql-10.service
    

    向新建的文件中贴入一下内容。

    [Unit]
    Description=PostgreSQL 10 database server
    Documentation=https://www.postgresql.org/docs/10/static/
    After=syslog.target
    After=network.target
     
    [Service]
    Type=notify
    User=postgres
    Group=postgres
    Environment=PGDATA=/mnt/db1/pgdata/pgsql/
    OOMScoreAdjust=-1000
    Environment=PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj
    Environment=PG_OOM_ADJUST_VALUE=0
    ExecStart=/usr/local/pgsql/bin/postmaster -D ${PGDATA}
    ExecReload=/bin/kill -HUP $MAINPID
    KillMode=mixed
    KillSignal=SIGINT
    TimeoutSec=0
     
    [Install]
    WantedBy=multi-user.target
    

    环境变量

    需要设置环境变量,否则 PostgreSQL 的安装命令无法正常使用。

    修改 /etc/profile文件。

    执行命令:

    > vim /etc/profile
    

    向打开的配置文件最后处添加一下内容。

    export PGPORT=5432
    export PGHOME=/usr/local/pgsql
    export PGDATA=/mnt/db1/pgdata/pgsql
    export PATH=$PGHOME/bin:$PATH
    export MANPATH=$PGHOME/share/man:$MANPATH
    export LANG=en_US.UTF-8
    export DATE='date +"%Y%m%d%H%M"'
    export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH
    export PGHOST=$PGDATA
    export PGUSER=postgres
    export PGDATABASE=postgres
    

    保存之后,执行命令使环境变量生效。

    > source /etc/profile
    

    初始化数据库

    初始化 PostgreSQL数据库,切换账号到postgres,进行初始化操作。

    > su - postgres
    > initdb -D $PGDATA -U postgres --locale=en_US.UTF8 -E UTF8
    

    需要注意的是,如果此处没有切换账号,仍然使用root账号进行初始化时,会反馈错误信息,无法初始化数据库。

    可能报出错误信息如下:

    initdb: cannot be run as root
    Please log in (using, e.g., "su") as the (unprivileged) user that will
    own the server process.
    

    报出此错误时需要先执行切换用户命令。

    修改数据库参数

    修改监听地址权限、端口等信息。

    > vim /mnt/db1/pgdata/pgsql/postgresql.conf
    

    需要修改如下内容:

    listen_addresses = '*'
    unix_socket_directories = '.'
    port = 5432
    

    此处需要注意,PostgreSQL默认端口为5432,此处将端口修改为8432。

    修改访问权限

    > vim /mnt/db1/pgdata/pgsql/pg_hba.conf
    

    添加如下命令

    host    all     all     0.0.0.0/0     trust 
    

    所有配置文件修改成功后,执行 exit命令退出 postgres用户。

    > exit
    

    设置防火墙规则

    > firewall-cmd --zone=public --add-port=5432/tcp --permanent
    > firewall-cmd --reload
    

    设置开机自启动

    设置开机自动启动服务,并且启动PostgreSQL服务。

    > systemctl enable postgresql-10.service
    > systemctl start postgresql-10.service
    

    至此PostgreSQL已经安装成功并且启动。

    2.2、部署TimescaleDB

    安装Cmake

    在当前操作系统中检查是否安装了Cmake,如果已经安装,并且版本高于3.4则跳过本操作。

    查看版本号命令:

    > cmake --version
    

    如果已经安装了Cmake并且版本低于3.4则需要卸载Cmake重新安装更高版本。

    卸载Cmake命令:

    > yum -y remove cmake
    

    开始安装高版本的Cmake,此处选择版本号为3.10.2。通过wget命令获取安装包,并且进行解压。

    > wget https://cmake.org/files/v3.10/cmake-3.10.2.tar.gz
    > tar -zxvf cmake-3.10.2.tar.gz && cd cmake-3.10.2
    

    开始编译安装Cmake。

    执行命令:

    > ./bootstrap
    > gmake
    > gmake install
    

    查看编译后的cmake版本

    执行命令:

    > /usr/local/bin/cmake --version
    

    新建软连接

    执行命令:

    > ln -s /usr/local/bin/cmake /bin/
    

    终端查看版本

    执行命令:

    > cmake --version
    

    出现版本表示成功!

    cmake编译完成。

    获取TimescaleDB

    通过git命令获取TimescaleDB的安装包。

    进入PostgresSQL的安装目录(是否存在强制要求,暂时不确定,不过可以直接放到PostgresSQL的安装目录之下),载TimescaleDB。

    > git clone https://github.com/timescale/timescaledb/
    > cd timescaledb
    

    获取timescaledb的安装版本。

    > wget https://github.com/timescale/timescaledb/archive/1.0.0.tar.gz
    

    编译TimescaleDB

    此操作最容易发生错误,如果发生错误,请仔细查看错误日志。错误日志上都会有详细的错误信息。

    开始编译TimescaleDB

    执行命令:

    > ./bootstrap
    > cd ./build && make  
    > make install
    

    出现如下信息则编译安装成功(可能存在却别)。

    [  2%] Built target sqlupdatefile  
    [  4%] Built target sqlfile  
    [100%] Built target timescaledb  
    Install the project...  
    -- Install configuration: "Release"  
    -- Installing: /home/dege.zzz/pgsql10/share/extension/timescaledb.control  
    -- Installing: /home/dege.zzz/pgsql10/share/extension/timescaledb--1.0.0.sql  
    -- Installing: /home/dege.zzz/pgsql10/share/extension/timescaledb--0.7.1--0.8.0.sql  
    -- Installing: /home/dege.zzz/pgsql10/share/extension/timescaledb--0.1.0--0.2.0.sql  
    -- Installing: /home/dege.zzz/pgsql10/share/extension/timescaledb--0.2.0--0.3.0.sql  
    -- Installing: /home/dege.zzz/pgsql10/share/extension/timescaledb--0.3.0--0.4.0.sql  
    -- Installing: /home/dege.zzz/pgsql10/share/extension/timescaledb--0.4.0--0.4.1.sql  
    -- Installing: /home/dege.zzz/pgsql10/share/extension/timescaledb--0.4.1--0.4.2.sql  
    -- Installing: /home/dege.zzz/pgsql10/share/extension/timescaledb--0.4.2--0.5.0.sql  
    -- Installing: /home/dege.zzz/pgsql10/share/extension/timescaledb--0.5.0--0.6.0.sql  
    -- Installing: /home/dege.zzz/pgsql10/share/extension/timescaledb--0.6.0--0.6.1.sql  
    -- Installing: /home/dege.zzz/pgsql10/share/extension/timescaledb--0.6.1--0.7.0.sql  
    -- Installing: /home/dege.zzz/pgsql10/share/extension/timescaledb--0.6.1--0.7.1.sql  
    -- Installing: /home/dege.zzz/pgsql10/share/extension/timescaledb--0.7.0--0.7.1.sql  
    -- Installing: /home/dege.zzz/pgsql10/lib/timescaledb.so  
    

    配置postgresql.conf,在数据库启动时自动加载timescale lib库。

    vi $PGDATA/postgresql.conf  
    shared_preload_libraries = 'timescaledb'  
      
    pg_ctl restart -m fast  
    

    对需要使用timescaledb的数据库,创建插件.

    psql  
    psql (10.2)  
    Type "help" for help.  
      
    postgres=# create extension timescaledb ; 
    

    执行后会展示如下信息:

    waiting for server to shut down.... done
    server stopped
    waiting for server to start....2018-11-14 15:42:53.803 CST [8593] LOG:  listening on IPv4 address "0.0.0.0", port 5432
    2018-11-14 15:42:53.803 CST [8593] LOG:  listening on IPv6 address "::", port 5432
    2018-11-14 15:42:53.845 CST [8593] LOG:  listening on Unix socket "./.s.PGSQL.5432"
    2018-11-14 15:42:53.929 CST [8594] LOG:  database system was shut down at 2018-11-14 15:42:53 CST
    2018-11-14 15:42:53.954 CST [8593] LOG:  database system is ready to accept connections
    2018-11-14 15:42:53.955 CST [8600] LOG:  TimescaleDB background worker launcher connected to shared catalogs
     done
    server started
    [postgres@localhost ~]$ exit
    logout
    [root@localhost build]# psql
    psql (10.2)
    Type "help" for help.
    
    postgres=# create extension timescaledb;
    2018-11-14 15:43:26.909 CST [8605] WARNING:  
            WELCOME TO
             _____ _                               _     ____________  
            |_   _(_)                             | |    |  _  \ ___ \ 
              | |  _ _ __ ___   ___  ___  ___ __ _| | ___| | | | |_/ / 
              | | | |  _ ` _ \ / _ \/ __|/ __/ _` | |/ _ \ | | | ___ \ 
              | | | | | | | | |  __/\__ \ (_| (_| | |  __/ |/ /| |_/ /
              |_| |_|_| |_| |_|\___||___/\___\__,_|_|\___|___/ \____/
                           Running version 1.0.0
            For more information on TimescaleDB, please visit the following links:
    
             1. Getting started: https://docs.timescale.com/getting-started
             2. API reference documentation: https://docs.timescale.com/api
             3. How TimescaleDB is designed: https://docs.timescale.com/introduction/architecture
    
            Note: TimescaleDB collects anonymous reports to better understand and assist our users.
            For more information and how to disable, please see our docs https://docs.timescaledb.com/using-timescaledb/telemetry.
    
    2018-11-14 15:43:26.909 CST [8605] CONTEXT:  PL/pgSQL function inline_code_block line 3 at RAISE
    WARNING:  
    WELCOME TO
     _____ _                               _     ____________  
    |_   _(_)                             | |    |  _  \ ___ \ 
      | |  _ _ __ ___   ___  ___  ___ __ _| | ___| | | | |_/ / 
      | | | |  _ ` _ \ / _ \/ __|/ __/ _` | |/ _ \ | | | ___ \ 
      | | | | | | | | |  __/\__ \ (_| (_| | |  __/ |/ /| |_/ /
      |_| |_|_| |_| |_|\___||___/\___\__,_|_|\___|___/ \____/
                   Running version 1.0.0
    For more information on TimescaleDB, please visit the following links:
    
     1. Getting started: https://docs.timescale.com/getting-started
     2. API reference documentation: https://docs.timescale.com/api
     3. How TimescaleDB is designed: https://docs.timescale.com/introduction/architecture
    
    Note: TimescaleDB collects anonymous reports to better understand and assist our users.
    For more information and how to disable, please see our docs https://docs.timescaledb.com/using-timescaledb/telemetry.
    
    CREATE EXTENSION
    

    3、维护

    维护后期会持续更新。

    展开全文
  • OleDb驱动程序

    热门讨论 2012-09-04 23:54:41
    OleDb驱动程序
  • 找回消失QQ表情 提取CustomFace.db

    热门讨论 2011-01-31 05:44:14
    提取CustomFace.db 找回消失QQ表情 QQ2010版本软件采用了新的图片保存模式,以前是直接用文件夹,保存所有图片,现在用的DB数据库进行保存所有的个人QQ表情,聊天记录等信息,该文件位于你的QQ安装目录->Users->你...
  • dB(分贝)定义及其应用

    千次阅读 2020-11-30 15:17:26
    目录 1.1 dB的诞生背景 1.2 dB的定义 ...而关于dB的讨论也是一个历久常新的话题,因为每一位从业者都会经历一个“搞懂dB是什么”的阶段,尤其是在声学领域,dB经常用作为表征声压级SPL(Sound Pressure

    目录

    1.1 dB的诞生背景

    1.2 dB的定义

    1.3 dB的应用

    1.4 dBA

    1.5dB叠加

    参考文章:


    1.1 dB的诞生背景

    dB是英文“decibel”的简写,其中deci表示十分之一,Bel表示“贝”。Decibel,分贝就是十分之一贝。 “贝”是“贝尔”的简称,是以杰出科学家Alexander Graham Bell的名字来命名的单位。贝尔在1876年获得了电话发明的专利,并在电话的应用和发展上做出了巨大的突破。Bel并不是国际单位制(System International)的单位,但是受到国际单位制的规则影响,用人名表示的单位符号的首字母要大写,所以我们看到dB中B应为大写。由于“Bel”这个单位比较大,使用不方便,更常用的是十分之一贝尔,即分贝。

    今天在音频工程和声学领域中,工程师、音响师几乎每天都会用到dB这个词。比如“将1000Hz衰减3dB”,“把推子推高3dB”,或者“这款音箱灵敏度是98dB SPL”,可以说dB在音频行业中是个无处不在的单位。而关于dB的讨论也是一个历久常新的话题,因为每一位从业者都会经历一个“搞懂dB是什么”的阶段,尤其是在声学领域,dB经常用作为表征声压级SPL(Sound Pressure Level)的大小。声压的单位是帕斯卡,Pa,声压的参考值是20μPa,这个值表示人耳在1000Hz处的平均可听阈值,或者是人耳在1000Hz处可被感知的平均最小声压波动值。声音是叠加在大气压之上的声压波动,大气压为1.01325×10^5Pa。相比于大气压,声压幅值波动非常小。人耳可听的声压幅值波动范围为2×10^-5Pa~20Pa,这个声压幅值波动区间很大,二者的比值达到了10^6。似乎从线性角度来说这个声压幅值的波动区间,很不方便。数字位数一多,读起来都头痛,要仔细逐一数一数位数,我反正是这样的,我不知道您是不是也是这样!有没有懒人方法呢,能方便的反映出这个波动的幅值呢?大师Bell早就在思考:有没有好的方法解决这个问题。因此,引入了以dB表示的声压级的概念。他发现我们人类耳朵对声音强度的反应是成对数形式的,大概意思就是当声音的强度增加到某一程度时,人的听觉会变的较不敏锐,刚好近似对数的单位刻度。这使得对数的单位可以拿来代表人类听觉变化的比例,因此,以对数dB形式表示的声压级应孕而生了。人耳可听的声压幅值波动范围为2×10^-5Pa~20Pa,用幅值dB表示对应的分贝数为0~120dB,因此,当用分贝表示声压级的大小时,表征起来更为方便。现实世界中各种常见情况中声音分贝大小如下图所示。

    preview

    用图表表示声压幅值和分贝数如下表所示:

     

    1.2 dB的定义

    理解dB的第一个要点,就是要知道它是表示两个具有相同单位的同一种物理量的相对关系。即两种电或声功率之比或两种电压或电流值或类似声量之比。它还是一种测量声音相对响度的单位。最初在电话工程领域,dB是用于定义于表示两个功率比,是P1/P0的比值再取以10为底的对数,再乘以10,其数学式为:

    dB是一个比值,是一个数值,是一个纯计数方法,没有任何单位标注。由于它在不同领域有着不同的名称,因此它也代表不同的实际意义。常见的领域有:声音、信号、增益等。

    1.3 dB的应用

    1、声音的大小

    在实际日常生活中,住宅小区告知牌上面标示噪音要低于60分贝,也就是要低于60dB,在这里dB(分贝)的定义为噪声源功率与基准声功率比值的对数乘10的数值,不是一个单位,而是一个数值,用来形容声音的大小。

     

    2、信号强度

    在无线通讯领域,衡量一个地点的某一无线基站通信信号强度也可以用dB表示。如测的某宾馆402房间的1号无线基站通信信号强度为-90dBm,这里的定义为该房间的有用信号强度与所有信号(包括干扰信号)的比值。

    3、增益

    在天线技术方面,dB是衡量天线性能的一个参数,名称为增益。它是指在输入功率相等的条件下,实际天线与理想天线在空间同一点处所产生的信号的功率密度之比。

    dB 是一个纯计数单位,在工程中有不同的定义方式(仅仅是看上去不同)。对于功率,dB = 10*log()。对于电压或电流,dB = 20*log()。

    dB的意义其实再简单不过了,就是把一个很大(后面跟一长串0的)或者很小(前面有一长串0的)的数比较简短地表示出来。如(此处以功率为例):

    X = 100000 = 10*log(10^5) = 50 dB

    X = 0.000000000000001 = 10*log(10^-15) = -150 dB

    dBm 定义的是 miliwatt。 0 dBm = 10log(1) mW = 1 mW;

    dBw 定义 watt。 0 dBw = 10log1 W = 10*log(1000) mw = 30 dBm。

    dB在缺省情况下总是定义功率单位,以 10*log 为计。当然某些情况下可以用信号强度(Amplitude)来描述功和功率,这时候就用 20log 为计。不管是控制领域还是信号处理领域都是这样。比如有时候大家可以看到 dBmV 的表达。

    在dB,dBm,dBw计算中,要注意基本概念。比如前面说的 0dBw = 10log1W = 10log1000mw = 30dBm;又比如,用一个dBm 减另外一个dBm时,得到的结果是dB。如:30dBm - 0dBm = 30dB。

    一般来讲,在工程中,dB和dB之间只有加减,没有乘除。而用得最多的是减法:dBm 减 dBm 实际上是两个功率相除,信号功率和噪声功率相除就是信噪比(SNR)。dBm 加 dBm 实际上是两个功率相乘,这个已经不多见(我只知道在功率谱卷积计算中有这样的应用)。

    简单地说,分贝就是放大器增益的单位。放大器输出与输入的比值为放大倍数,单位是“倍”,如10倍放大器,100倍放大器。当改用“分贝”做单位时,放大倍数就称之为增益,这是一个概念的两种称呼。电学中分贝与放大倍数的转换关系为:AV(I)(dB)=20lg[Vo/Vi(Io/Ii)];Ap(dB)=10lg(Po/Pi)分贝定义时电压(电流)增益和功率增益的公式不同,但我们都知道功率与电压、电流的关系是P=V2/R=I2R。采用这套公式后,两者的增益数值就一样了:10lg[Po/Pi]=10lg(V2o/R)/(V2i/R)=20lg(Vo/Vi)。使用分贝做单位主要有三大好处。(1)数值变小,读写方便。电子系统的总放大倍数常常是几千、几万甚至几十万,一架收音机从天线收到的信号至送入喇叭放音输出,一共要放大2万倍左右。用分贝表示先取个对数,数值就小得多。附表为放大倍数与增益的对应关系。

    运算方便。放大器级联时,总的放大倍数是各级相乘。用分贝做单位时,总增益就是相加。若某功放前级是100倍(20dB),后级是20倍(13dB),那么总功率放大倍数是100×20=2000倍,总增益为20dB+13dB=33dB。

    1.4 dBA

    dBA是指对声音的A计权。通常对A计权的结果,用单位dBA或dB(A)来表示。
    人耳可听的声音有一定的频率范围(20-20KHz)和一定的声压级范围(0-130dB),如下图所示。

     

    人耳不是对所有频率的敏感度都相同。正常人耳最敏感的频带是 3000 Hz 到 6000 Hz,它的频响会随着声音大小的变化而变化。通常,低频段和高频段声音感知能力不如中频段,效果是在低声压级更明显,在高声压级时会被压平,如图中各条曲线(等响曲线)所示,声压级越小的区间,曲线越陡峭,声压级越大的区段,曲线越平坦。

    preview

    正是因为人耳对不同的频率,敏感度不一样,即使声压级的量级一样,听起来也不一样,所以,需要对真正听到的声压级通过增益因子进行修正,而用得最多的则是A计权。当然还有B,C,D计权。A计权对应的是40方的等响曲线,也就是上图中红色线条所表示的曲线。而B,C计权则对应70和100方的等响曲线,4种计权曲线如下图所示。

    preview

    对同一信号采用不同的计权方式,最后得到的声压级是不一样的。如下图所示,对一随机信号计算不计权和A计权下的1/3倍频程曲线,可见二者差异明显。因此,当计权不同时,结果也是不同的。

    preview

    除了dBA和其它三种计权之外,其实在其他领域还有dBm,dBW,dBu,dBv,dBi,dBd,dBc等等,但在NVH领域还是dBA最常用。

    1.5dB叠加

    dB可以任意相加吗?怎么相加?如70dB+60dB等于130dB吗?要是这么简单,世界就安静了,不会有那么多争论了,也不会有人说NVH是「玄学」了。

    在这以声压级的叠加来进行说明。SPLresult=SPL1+SPL2+SPL3+…+SPLn?声压级的合成运算不是简单的加减运算,声压级不能直接相加,必须以能量形式相加计算,因此,声压级的合成公式如下

    preview

    若两个声压级SPL1=SPL2=60dB,但两个声源是相关、同相位的,则合成后的声压级SPL为66dB,因为60dB对应0.02Pa,两个相加为0.04Pa,对应66dB。现实有这么美好吗?很少有相关同相位的两个声源,所以,这个等于白说了。是不是砍我的心都有了? 若任意两个声压级SPL1=SPL2,则合成后的声压级为

    preview

    preview

    也就是说两个声压级相同,则合成后的声压级比之前大3dB。也可以用以下图来表示,横轴表示两个声压级的差值,纵轴表示在原来的基础上要增加多少dB。二者相差0dB时,合成之后大3dB, 当两个声压级相差15dB以上,数值小的声压级影响可以忽略。通过查询下图也可以求得合成后的声压级大小。

    preview

    回到这一小节开始时提到的问题:70dB+60dB等于多少?我们可以根据这一节第一个公式计算或者对比上图可以得到结果为70.4dB,记住不是130dB

    说完了声压级的合成,再说说声压级的分解吧。声压级的分解通常用于修正背景噪声的影响,如噪声测量值Lmeasured 修正背景噪音LBGN 的影响,不是简简单单地Lsource =Lmeasured-LBGN, 而是

     

    国际规范中关于背景噪声的修正原则如下图表示。当背景噪音与声源的声压级差值小于6dB时,测量无效;当二者差值位于6~15dB之间时需要修正,修正按以上公式修正;当二者差值大于15dB时,可忽略背景噪声对测量结果的影响。

    preview

    参考文章:

    https://zhuanlan.zhihu.com/p/22821588

    http://www.prozs.com/edu/detail.asp?id=1440

    https://www.cnblogs.com/jsdy/p/12728493.html

     

     

    展开全文
  • BerkeleyDB库简介

    千次阅读 2019-02-22 19:29:02
    BerkeleyDB(简称为BDB)是一种以key-value为结构的嵌入式数据库引擎: 嵌入式:bdb提供了一系列应用程序接口(API),调用这些接口很简单,应用程序和bdb所提供的库一起编译/链接成为可执行程序; NOSQL:bdb不...
  • RocksDB简介

    万次阅读 2019-10-07 18:04:49
    RocksDB是FaceBook起初作为实验性质开发的,旨在充分实现快存上存储数据的服务能力。由Facebook的Dhruba Borthakur于2012年4月创建的LevelDB的分支,最初的目标是提高服务工作负载的性能,最大限度的发挥闪存和RAM的...
  • 本文介绍RocksDB的一些基本概念和术语,及Java程序如何使用RocksDB
  • 通信领域的dB计量单位

    千次阅读 2021-01-07 09:20:16
    在通信技领域,尤其是射频领域,常常碰到dB开头的计量单位,如dBm,dBi,dBc,dBr等等,初学时容易迷糊。这里做一个小结。 dB 首先说说dB的概念。dB是英文单词decible的缩写,译作是分贝;英文还有个单词bel,也...
  • 文章目录初始GaussDBGaussDB的版本GaussDB版本的区别OLTP和OLAP比较GaussDB T介绍GaussDB A 介绍MPP架构介绍架构组件介绍 初始GaussDB 名字的由来:GaussDB是华为数据库产品品牌名,致敬数据加高斯(Gauss) GaussDB...
  • GaussDB系列数据库简介

    千次阅读 2020-08-07 10:45:56
    GaussDB目前支持TD、Natezza、Oracle、MySQL、DB2、sybase、PG的离线数据迁移, 支持Oracle的全量+增强的在线迁移。 GaussDB版本的区别: GaussDB T(OLTP): 前身是GauussDB 100, 主打OLTP在线事务处理。 用于存储...
  • 这里以官方的Microsoft SQL Server 2012 Express LocalDB加以说明,VS从2012开始应该都集成了此功能。 Microsoft SQL Server 2012 Express LocalDB 是面向程序开发人员的 SQL Server Express 的执行模式。 LocalDB ...
  • 时序数据库:TimescaleDB的安装

    千次阅读 2019-03-15 14:58:41
    TimescaleDB是由PostgreSQL支持 的开源时间序列数据库,昨晚PG插件的形式存在,如果要使用到相关时序的功能,需要安装上此插件。安装方法有以下两种 YUM安装 如果你的PG是使用YUM网络安装,则可以同样使用该方法安装...
  • 阿里云发布超高性能云数据库POLARDB》,彼时,阿里云数据库“宝拉”(POLARDB )刚刚发布。而到老孙再次在云栖大会上见到“宝拉”时,已经是时隔一年。那么,在这一年中,POLARDB 到底取得了怎样的进展?到底在市场...
  • 图数据库 OrientDB 安装 及 初步使用

    千次阅读 2018-08-07 21:56:18
    图数据库 OrientDB 安装 及 初步使用
  • GaussDB的产品,最初GaussDB的产品定义有三大产品线系列GaussDB 100、GaussDB 200、GaussDB300,简单介绍下: 1)GaussDB 100:主要以OLTP为主。目前该产品已经应用在招商银行。在 2020年6月,将会开源单机版本; 2...
  • RocksDB系列二:RocksDB Option

    千次阅读 2018-07-16 10:55:45
     RocksDB用户可以通过Options类将配置信息传入引擎,除此之外,还可以以下其他方法设置,分别为:通过option file生成一个option class从option string中获取option 信息从string map中获取option信息option string...
  • dB的换算

    千次阅读 2020-09-12 13:38:02
    dB的意义 1.        dB基本上是一个比例数值,也就是一种倍数的表示单位。也就是 测试数据 与 参考标准的相对差异表示。   2.      &...
  • DB数据库文件查看器

    千次下载 热门讨论 2011-10-12 15:24:37
    绿色 小巧 的DB数据库文件查看器,可以查看和修改DB文件。
  • RocksDB原理介绍

    千次阅读 2019-07-28 12:26:48
    RocksDBRocksDB介绍B+树LSM树(Log-Structured Merge Tree)LevelDB特点RocksDB对LevelDB的优化RocksDB 写入与删除RocksDB 读取记录 RocksDB介绍 RocksDB是facebook开源的NOSQL存储系统,其设计是基于Google开源的...
  • TimescaleDB数据库

    千次阅读 2018-06-04 15:48:56
    2018年6月4日星期一随笔 笔记 TimescaleDBl 什么是TimescaleDB?TimeSeldB是唯一支持完整SQL的开放源代码时间序列数据库。为快速摄取和复杂查询优化,TimeSeleDB易于使用,如传统的关系数据库,但按以前为NoSQL...
  • Microsoft.ACE.OLEDB.12.0

    千次下载 热门讨论 2012-05-17 15:10:24
    解决 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序。的问题
  • dB 数值范围根据实际测量的参考值有变化。计算能量: 计算场量: 领域 电压 dBu/dBv dBmV dB(1 mVRMS)–电压相对于75 Ω阻抗上的1毫伏。[16]广泛用于有线电视网,其接收端的单路电视信号强度名义为0 dBmV。...
  • POLARDB v2.0 技术解读

    千次阅读 2019-06-24 14:44:45
    回顾POLARDB 1.0 POLARDB 1.0 主要的改进包括采用了计算存储分离的架构,完全兼容MYSQL,性能是原生MySQL的6倍。一个用户集群可以在分钟级弹性扩展到16个计算节点,对业务完全透明的计算和存储分离代理,从库延迟仅...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,070,026
精华内容 828,010
关键字:

db