主頁 > 資料庫 > MYSQL的Java操作器——JDBC

MYSQL的Java操作器——JDBC

2022-08-08 14:47:36 資料庫

MYSQL的Java操作器——JDBC

在學習了Mysql之后,我們就要把Mysql和我們之前所學習的Java所結合起來

而JDBC就是這樣一種工具:幫助我們使用Java語言來操作Mysql資料庫

JDBC簡介

首先我們先來了解一下JDBC

JDBC概念:

  • JDBC是使用Java語言操作關系資料庫的一套API
  • 全稱:(Java DataBase Connectivity)Java資料庫連接

JDBC本質:

  • 官方(sun公司)定義的一套操作所有關系型資料庫的規則,即介面
  • 各個資料庫廠商去實作這套介面,提供資料庫驅動jar包
  • 我們可以使用這套介面(JDBC)編程,真正運行的代碼時驅動jar包中的實作類

JDBC優點:

  • 各資料庫廠商使用相同的介面,Java代碼不需要針對不同資料庫分別開發
  • 可隨時替代基層資料庫,訪問資料庫的Java代碼基本不變

JDBC快速入門

下面我們通過JDBC的基本步驟和一段實體代碼來帶大家體驗一下JDBC

基本步驟:

// 0.創建工程,匯入驅動jar包 (資源可以在網路搜索)
    
// 1.注冊驅動
    Class.forName("com.mysql.jdbc.Driver");
// 2.獲得連接
    Connection conn = DriverManager.getConnection(url,username,password);
// 3.定義MYSQL陳述句
    String sql = "~~~";
// 4.獲得執行物件
    Statement stmt = conn.createStatement();
// 5.執行SQL陳述句
    stmt.executeUpdate(sql);
// 6.處理回傳結果
    
// 7.釋放資源

實體代碼:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

// JDBC快速入門
public class Demo1 {

    public static void main(String[] arg) throws Exception{

        //  1.注冊驅動(這里是固定語法,是Java中的反射)
        Class.forName("com.mysql.jdbc.Driver");

        //  2.獲得連接(Connection是類,最后需要釋放資源)
        //  (url前面固定jdbc:mysql://127.0.0.1:3306/,最后加上你所需要的資料庫test,username為資料庫賬號,password為資料庫密碼)
        String url = "jdbc:mysql://127.0.0.1:3306/test";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url,username,password);

        //   3.定義SQL陳述句(這里SQL陳述句與MYSQL陳述句相同)
        String sql = "update jdbc_test set age = 20 where id = 1";

        //   4.獲得執行SQL物件(這里也是類)
        Statement stmt = conn.createStatement();

        //   5.執行SQL(注意這里回傳的是count,是sql中受影響的行數)
        int count = stmt.executeUpdate(sql);

        //   6.回傳執行結果
        System.out.println(count);

        //   7.釋放記憶體
        stmt.close();
        conn.close();
    }
}

JDBC API詳解

JDBC中的API主要有四種,我們將在下面一一介紹:

DriverManager

DriverManager主要包含兩個作用:

  1. 注冊驅動
// 注冊驅動是JDBC使用的第一步
Class.forName("com.mysql.jdbc.Driver");
// 上述的操作雖然是Class類的forName操作,但實際上是由Driver類的static函陣列成的,如果含興趣可以上網搜索該代碼

注意:

  • MYSQL5之后的版本,我們可以省略注冊驅動的步驟
  • 自動加載jar包中的META-INF/services/java.sql.Driver檔案中的驅動類
  1. 獲取連接
//  2.獲得連接
//  (url前面固定jdbc:mysql://127.0.0.1:3306/,最后加上你所需要的資料庫test,username為資料庫賬號,password為資料庫密碼)

String url = "jdbc:mysql://127.0.0.1:3306/test";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url,username,password);

這里getConnection包含三個引數,username和password分別表示賬號和密碼,不需要解釋

我們主要關注url的構造:

// 語法: jdbc:mysql://ip地址(域名):埠號/資料庫名稱?引數鍵值對1&引數鍵值對2...

// 實體: String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false";

注意:

  • 當我們是主機并在主機進行MYSQL操作時,127.0.0.1:3306可以省略不寫
  • 當我們正常書寫時,會有warning警告,我們可以采用useSSL=false來消除警告

最后我們給出整體代碼來展現DriverManager所學到的部分:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

// JDBC_DriverManager
public class Demo2 {

    public static void main(String[] arg) throws Exception{

        // 我們在MYSQL5.0以上版本可以省略注冊驅動的步驟
        // Class.forName("com.mysql.jdbc.Driver");

        // 當我們在主機使用MYSQL時,可以省略27.0.0.1:3306
        // 如果我們希望省略SSL警告語言可以設定關閉
        String url = "jdbc:mysql:///test?useSSL=false";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url,username,password);

        String sql = "update jdbc_test set age = 20 where id = 1";

        Statement stmt = conn.createStatement();

        int count = stmt.executeUpdate(sql);

        System.out.println(count);

        stmt.close();
        conn.close();
    }
}

Connection

Connection主要包含兩個作用:

  1. 獲得執行SQL物件

我們有三種方法可以獲得SQL執行物件,這里先做出語法介紹,在后續我們會進行詳細解釋:

  • 普通執行SQL物件
Statement stmt = conn.createStatement();
  • 預編譯SQL的執行SQL物件:防止SQL注入
PreparedStatement pstmt = conn.prepareStatement(sql);
  • 執行存盤程序的物件
CallableStatement cstmt = conn,prepareCall(sql);
  1. 事務管理

我們可以通過Connection來進行MYSQL中的事務管理

我們通過對比MYSQL的事務來解釋:

# 開啟事務
BEGIN;

# 提交事務
COMMIT;

# 回滾事務
ROLLBACK;

-- mysql自動提交事務

我們的JDBC也同樣提供三種方法來對應mysql事務:

// 開啟事務 boolean autoCommit有兩種選擇:true為自動提交,false為手動提交(如果希望手動提交設定為false)
conn.setAutoCommit(boolean autoCommit)

// 提交事務
conn.commit();

// 回滾事務
conn.rollback();

最后我們給出整體代碼來展現Connection所學到的部分:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

// JDBC_Connection
public class Demo3 {

    public static void main(String[] arg) throws Exception{

        String url = "jdbc:mysql:///test?useSSL=false";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url,username,password);

        // 我們來研究事務的執行 (我們希望下面兩條陳述句在一個事務中同時執行)
        String sql1 = "update jdbc_test set age = 16 where id = 1";
        String sql2 = "update jdbc_test set age = 16 where id = 2";

        Statement stmt = conn.createStatement();

        // 我們需要在try中進行,因為為了當出錯時可以采用回滾方法
        try {
            // 開啟事務
            conn.setAutoCommit(false);

            int count1 = stmt.executeUpdate(sql1);

            System.out.println(count1);

            int count2 = stmt.executeUpdate(sql2);

            System.out.println(count2);

            // 提交事務
            conn.commit();

        } catch (Exception e){
            // 出錯時回滾事務
            conn.rollback();
        }

        stmt.close();
        conn.close();
    }
}

Statement

Statement只有一個作用:執行SQL陳述句

Statement的執行方式主要分為兩種:

  1. executeUpdate(DML,DDL)

Statement可以執行Update操作,主要針對mysql的DML和DDL操作

// 下述是Statement執行DML和DDL操作的語法,sql為String型別的mysql陳述句

int count = stmt.executeUpdate(sql);

// 注意:回傳值是DML和DDL陳述句所影響的行數

下面我們給出整體案例解釋Statement的executeUpdate操作:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

// JDBC_DriverManager
public class Demo4 {

    public static void main(String[] arg) throws Exception{


    }

    public static void test_DML() throws SQLException {

        String url = "jdbc:mysql:///test?useSSL=false";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url,username,password);

        String sql = "update jdbc_test set age = 20 where id = 1";

        Statement stmt = conn.createStatement();

        int count = stmt.executeUpdate(sql);

        // 我們在實際頁面制作時,需要給用戶反饋是否成功
        // 對于DML陳述句,當count>0時基本為操作成功

        if(count>0){
            System.out.println("操作成功!");
        }else {
            System.out.println("操作失敗~");
        }

        stmt.close();
        conn.close();
    }

    public static void test_DDL() throws SQLException {

        String url = "jdbc:mysql:///test?useSSL=false";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url,username,password);

        String sql = "update jdbc_test set age = 20 where id = 1";

        Statement stmt = conn.createStatement();

        int count = stmt.executeUpdate(sql);

        // 我們在實際頁面制作時,需要給用戶反饋是否成功
        // 對于DDL陳述句,DROP時count為0,所以不能用count判斷,基本情況下不報錯即為成功

        stmt.close();
        conn.close();
    }
}
  1. executeQuery(DQL)

Statement可以執行Query操作,主要針對mysql的DQL操作

// 下述是Statement執行DQL操作的語法,sql為String型別的mysql陳述句
ResultSet resultSet = stmt.executeQuery(sql);

// 注意:ResultSet是stmt.executeQuery的回傳型別,下面我們將著重介紹一下

ResultSet的作用:

  • 封裝了DQL查詢陳述句的結果

那么如何獲得ResultSet所儲存的值:

// ResultSet具有next()方法,其作用是:將當前游標向前移動一行,并判斷當前行是否為有效行并回傳true或false
// ResultSet在獲得結果后的游標指向目錄行,移動一行后得到第一行資料,
boolean next():

/*
true:表示當前行有資料,可以提取或者直接輸出搜索成功
false:表示當前行沒有資料,表示搜索失敗
*/
// ResultSet具有getXxx(引數)方法,其作用是獲得當前行保存的資料
Xxx name = resultSet.getXxx(引數);

/*
Xxx 表示資料型別:Int,Double,String等
引數有兩種:
	1.數字引數,表示列數
	2.字串引數,表示列名
*/
// 具體遍歷采用while語法
while(rs.next()){
    //獲得資料
    int i = rs.getInt(1);
}

下面我們給出整體案例解釋Statement的executeQuery操作:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

// JDBC_SQL
public class Demo5 {

    public static void main(String[] arg) throws Exception{

        String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url,username,password);

        // 我們接下來講解SQL,因為SQL所獲得的資料型別為ResultSet,所以我們單獨講解

        // 先設定SQL陳述句
        String sql = "select * from jdbc_test";

        // 然后獲得物件
        Statement stmt = conn.createStatement();

        // 然后開始執行陳述句
        ResultSet resultSet = stmt.executeQuery(sql);

        // 然后我們回圈得到資料

        // next最開始指向非資料行,然后開始執行:向下運行一行,并且判斷是否為有效行
        while (resultSet.next()){
            // 當為有效行,獲得資料(可以通過列數,也可以通過列名)
            int id = resultSet.getInt("id");
            String string = resultSet.getString(2);
            int age = resultSet.getInt("age");

            System.out.println(id);
            System.out.println(string);
            System.out.println(age);

            System.out.println("----------------");
        }

        // 釋放資源
        resultSet.close();
        stmt.close();
        conn.close();
    }
}

我們再給出一個mysql和Java結合的常用案例:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import pojo.Student;

// JDBC_SQL案例演示
// 查詢jdbc_test資料庫,封裝進Student物件,并存盤到ArrayList集合中
public class Demo6 {

    public static void main(String[] arg) throws Exception{
        // 創建集合
        List<Student> list = new ArrayList<>();

        String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url,username,password);

        // 先設定SQL陳述句
        String sql = "select * from jdbc_test";

        // 然后獲得物件
        Statement stmt = conn.createStatement();

        // 然后開始執行陳述句
        ResultSet resultSet = stmt.executeQuery(sql);

        // 然后我們回圈得到資料
        while (resultSet.next()){
            // 創建物件
            Student s = new Student();

            int id = resultSet.getInt("id");
            String string = resultSet.getString(2);
            int age = resultSet.getInt("age");

            // 賦值
            s.setId(id);
            s.setName(string);
            s.setAge(age);

            // 把物件插入集合
            list.add(s);
        }

        // 我們查看結果
        System.out.println(list);

        // 釋放資源
        resultSet.close();
        stmt.close();
        conn.close();
    }
}

PreparedStatement

PreparedStatement的作用有兩個:

  1. 預防SQL注入問題

首先我們先來介紹SQL注入問題:

我們給出一段Web端之前的賬號登錄匹配代碼:

import com.itheima.pojo.Account;
import org.junit.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 * 用戶登錄
 */
public class JDBCDemo6_UserLogin {

    @Test
    public void testLogin() throws  Exception {
       //2. 獲取連接:如果連接的是本機mysql并且埠是默認的 3306 可以簡化書寫
       String url = "jdbc:mysql:///db1?useSSL=false";
       String username = "root";
       String password = "1234";
       Connection conn = DriverManager.getConnection(url, username, password);

       // 接收用戶輸入 用戶名和密碼(這里直接寫入,我們會在JavaWeb部分學到互動)
        String name = "zhangsan";
        String pwd = "fhsjkfhdsk";

        String sql = "select * from tb_user where username = '"+name+"' and password = '"+pwd+"'";

        // 獲取stmt物件
        Statement stmt = conn.createStatement();

        // 執行sql
        ResultSet rs = stmt.executeQuery(sql);

        // 判斷登錄是否成功
        if(rs.next()){
            System.out.println("登錄成功~");
        }else{
            System.out.println("登錄失敗~");
        }

        //7. 釋放資源
        rs.close();
        stmt.close();
        conn.close();
    }
}

我們可以注意到上述的sql陳述句采用的是字串拼接,

因而當我們采用一些特殊字符時,就會導致mysql的搜索陳述句變為true,搜索到所有的mysql內容然后進入第一個賬號

import com.itheima.pojo.Account;
import org.junit.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
* 用戶登錄
*/
public class JDBCDemo6_UserLogin {
    
	 /**
     * 演示SQL注入
     * @throws Exception
     */
    @Test
    public void testLogin_Inject() throws  Exception {
        //2. 獲取連接:如果連接的是本機mysql并且埠是默認的 3306 可以簡化書寫
        String url = "jdbc:mysql:///db1?useSSL=false";
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url, username, password);

        // 接收用戶輸入 用戶名和密碼
        String name = "hfkjsfhskj";
        // 注意這里"' or '1' = '1"帶入到sql陳述句中就會導致變為select * from tb_user where true
        String pwd = "' or '1' = '1";

        String sql = "select * from tb_user where username = '"+name+"' and password = '"+pwd+"'";
        System.out.println(sql);
        // 獲取stmt物件
        Statement stmt = conn.createStatement();
        // 執行sql
        ResultSet rs = stmt.executeQuery(sql);

        // 判斷登錄是否成功
        if(rs.next()){
            System.out.println("登錄成功~");
        }else{
            System.out.println("登錄失敗~");
        }

        //7. 釋放資源
        rs.close();
        stmt.close();
        conn.close();
    }

因而我們采用PreparedStatement來預防SQL注入問題

我們先來介紹PreparedStatement的語法:

// 獲得PreparedStatement物件

// 首先我們需要設定sql陳述句,并且將引數用?代替
String sql = "select * from table where usename = ? and password = ?";
    
// 我們在創建PreparedStatement物件時需要直接將sql陳述句帶入
PreparedStatement pstmt = conn.PreparedStatement(sql);

// 然后我們需要設定引數值
pstmt.setXxx(引數1,引數2);

/*
Xxx: 資料型別,包括Int,Double,String等
引數1:?的位置編號,從1開始
引數2:?的值
*/

// 最后執行SQL
pstmt.executeQuery();

下面我們給出整體案例解釋PreparedStatement操作:

import org.junit.Test;

import java.sql.*;
import java.util.Date;

/**
 * API詳解:PreparedStatement
 */
public class JDBCDemo7_PreparedStatement {

    @Test
    public void testPreparedStatement() throws  Exception {
       //2. 獲取連接:如果連接的是本機mysql并且埠是默認的 3306 可以簡化書寫
       String url = "jdbc:mysql:///db1?useSSL=false";
       String username = "root";
       String password = "1234";
       Connection conn = DriverManager.getConnection(url, username, password);

       // 接收用戶輸入 用戶名和密碼
        String name = "zhangsan";
        String pwd = "' or '1' = '1";

        // 定義sql
        String sql = "select * from tb_user where username = ? and password = ?";

        // 獲取pstmt物件
        PreparedStatement pstmt = conn.prepareStatement(sql);

        // 設定?的值
        pstmt.setString(1,name);
        pstmt.setString(2,pwd);

        // 執行sql
        ResultSet rs = pstmt.executeQuery();

        // 判斷登錄是否成功
        if(rs.next()){
            System.out.println("登錄成功~");
        }else{
            System.out.println("登錄失敗~");
        }

        //7. 釋放資源
        rs.close();
        pstmt.close();
        conn.close();
    }
}

然后我們稍微拓展一下為什么PreparedStatement為什么不會導致字串拼接錯誤:

  • 因為PreparedStatement將?直接看作字串的內容來帶入,
  • 你所寫入的’或者“相當于/'和/",不會被當作java代碼的一部分識別
  1. 預編譯SQL,提高性能

PreparedStatement預編譯原理:

  • 在獲得PreparedStatement物件時,將sql陳述句發送給mysql服務器進行檢查編譯(耗時)
  • 執行后將不再執行這些步驟,因而速度變快
  • 如果sql模板一樣,則只需進行一次檢查,編譯

資料庫連接池

首先我們對資料庫連接池做出簡單介紹:

  • 資料庫連接池是一個容器,負責分配,管理資料庫連接(Connction)
  • 它允許應用程式重復使用一個現有的資料庫連接,而不是重新建立一個
  • 釋放空閑時間超過最大空閑時間的資料庫連接來避免因為沒有釋放資料庫連接而引起的資料庫連接遺漏

資料庫連接池優點:

  • 資源重用
  • 提高系統回應速度
  • 避免資料庫連接遺漏

我們采用通俗解釋來說:

  • 正常情況:

我們的資料庫會有很多人訪問,每當來一個人操作資料庫,MYSQL創建一個Connection,在這個人使用后,再將Connection洗掉,

這種資源重復創造洗掉,導致資料庫效率低下

  • 資料庫連接池:

我們的資料庫具有一定的Connection數量,當每來一個人,MYSQL分配給它一個Connection,并在使用后回收;

如果這個人的使用時間超過正常時間,MYSQL將會自動回收

資料庫連接池實作

我們從三個方法講解資料庫連接池的實作:

  • 標準介面:DataSource

    • 官方(SUN)提供的資料庫連接池標準介面,由第三方組織實作此介面
    • 功能:獲得連接
    Connection conn = DataSource.getConnection();
    
  • 常見資料庫連接池:

    • DBCP
    • C3P0
    • Druid
  • Druid(德魯伊)

    • Druid連接池是阿里巴巴開發的資料庫連接池
    • 功能強大,性能優秀,是Java語言最好的資料庫連接池之一

Druid(德魯伊)使用

Druid的使用分為五步:

  • 匯入jar包
  • 定義組態檔
  • 加載組態檔
  • 獲得資料庫連接池物件
  • 獲得連接

我們給出實體代碼:

# 定義組態檔

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///db1?useSSL=false&useServerPrepStmts=true
username=root
password=1234
# 初始化連接數量
initialSize=5
# 最大連接數
maxActive=10
# 最大等待時間
maxWait=3000
import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;

/**
 * Druid資料庫連接池演示
 */
public class DruidDemo {

    public static void main(String[] args) throws Exception {
        //1.匯入jar包(在網上可以找到,同JDBC包一樣)
        
        //2.定義組態檔

        //3. 加載組態檔
        Properties prop = new Properties();
        prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
        //4. 獲取連接池物件
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);

        //5. 獲取資料庫連接 Connection
        Connection connection = dataSource.getConnection();

        System.out.println(connection);


        //System.out.println(System.getProperty("user.dir"));
    }
}

結束語

好的,關于JDBC的內容我們就講解到這里!

附錄

該文章屬于學習筆記,主要學習B站黑馬JDBC視頻

這里附上鏈接:黑馬JDBC視頻全套視頻教程,快速入門jdbc原理+jdbc實戰,一套掌握_嗶哩嗶哩_bilibili

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/501221.html

標籤:其他

上一篇:我說MySQL聯合索引遵循最左前綴匹配原則,面試官讓我回去等通知

下一篇:Redis進階(一)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more