婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 關于JDBC與MySQL臨時表空間的深入解析

關于JDBC與MySQL臨時表空間的深入解析

熱門標簽:外呼系統服務 400電話辦理都選易號網 高德地圖標注模式 如何在高德地圖標注新地址 寶應電信400電話辦理費用 外呼系統防封號違法嗎 高德地圖標注中心個人注冊 電銷機器人針對的 湘潭電銷機器人咨詢電話

背景

臨時表空間用來管理數據庫排序操作以及用于存儲臨時表、中間排序結果等臨時對象,相信大家在開發中經常會遇到相關的需求,下面本文將給大家詳細JDBC與MySQL臨時表空間的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧

應用 JDBC 連接參數采用 useCursorFetch=true,查詢結果集存放在 mysqld 臨時表空間中,導致ibtmp1 文件大小暴增到90多G,耗盡服務器磁盤空間。為了限制臨時表空間的大小,設置了:

innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:2G

問題描述

在限制了臨時表空間后,當應用仍按以前的方式訪問時,ibtmp1文件達到2G后,程序一直等待直到超時斷開連接。 SHOW PROCESSLIST顯示程序的連接線程為sleep狀態,state和info信息為空。 這個對應用開發來說不太友好,程序等待超時之后要分析原因也缺少提示信息。

問題分析過程

為了分析問題,我們進行了以下測試

測試環境:

mysql:5.7.16

java:1.8u162

jdbc 驅動:5.1.36

OS:Red Hat 6.4

1.手工模擬臨時表超過最大限制的場景

模擬以下環境:

ibtmp1:12M:autoextend:max:30M

將一張 500萬行的 sbtest 表的 k 字段索引刪除

運行一條 group by 的查詢,產生的臨時表大小超過限制后,會直接報錯:

select sum(k) from sbtest1 group by k;
ERROR 1114 (HY000): The table '/tmp/#sql_60f1_0' is full

2.檢查驅動對 mysql 的設置

我們上一步看到,sql 手工執行會返回錯誤,但是 jdbc 不返回錯誤,導致連接一直 sleep,懷疑是 mysql 驅動做了特殊設置,驅動連接 mysql,通過 general_log 查看做了哪些設置。未發現做特殊設置。

3.測試 JDBC 連接

問題的背景中有對JDBC做特殊配置:useCursorFetch=true,不知道是否與隱藏報錯有關,接下來進行測試:

發現以下現象:

·加參數 useCursorFetch=true時,做同樣的查詢確實不會報錯

這個參數是為了防止返回結果集過大而采用分段讀取的方式。即程序下發一個 sql 給 mysql 后,會等 mysql 可以讀結果的反饋,由于 mysql 在執行sql時,返回結果達到 ibtmp 上限后報錯,但沒有關閉該線程,該線程處理 sleep 狀態,程序得不到反饋,會一直等,沒有報錯。如果 kill 這個線程,程序則會報錯。

·不加參數 useCursorFetch=true時,做同樣的查詢則會報錯

結論

1.正常情況下,sql 執行過程中臨時表大小達到 ibtmp 上限后會報錯;

2.當JDBC設置 useCursorFetch=true,sql 執行過程中臨時表大小達到 ibtmp 上限后不會報錯。

解決方案

進一步了解到使用 useCursorFetch=true 是為了防止查詢結果集過大撐爆 jvm;

但是使用 useCursorFetch=true 又會導致普通查詢也生成臨時表,造成臨時表空間過大的問題;

臨時表空間過大的解決方案是限制 ibtmp1 的大小,然而 useCursorFetch=true 又導致JDBC不返回錯誤。

所以需要使用其它方法來達到相同的效果,且 sql 報錯后程序也要相應的報錯。除了 useCursorFetch=true 這種段讀取的方式外,還可以使用流讀取的方式。流讀取程序詳見附件部分。

·報錯對比

·段讀取方式,sql 報錯后,程序不報錯

·流讀取方式,sql 報錯后,程序會報錯

·內存占用對比

這里對比了普通讀取、段讀取、流讀取三種方式,初始內存占用 28M 左右:

·普通讀取后,內存占用 100M 多

·段讀取后,內存占用 60M 左右

·流讀取后,內存占用 60M 左右

補充知識點

MySQL共享臨時表空間知識點

MySQL 5.7在 temporary tablespace上做了改進,已經實現將 temporary tablespace 從 ibdata(共享表空間文件)中分離。并且可以重啟重置大小,避免出現像以前 ibdata 過大難以釋放的問題。
其參數為:innodb_temp_data_file_path

1.表現

MySQL啟動時 datadir 下會創建一個 ibtmp1 文件,初始大小為 12M,默認值下會無限擴展:

通常來說,查詢導致的臨時表(如group by)如果超出 tmp_table_size、max_heap_table_size 大小限制則創建 innodb 磁盤臨時表(MySQL5.7默認臨時表引擎為 innodb),存放在共享臨時表空間;

如果某個操作創建了一個大小為100 M的臨時表,則臨時表空間數據文件會擴展到 100M大小以滿足臨時表的需要。當刪除臨時表時,釋放的空間可以重新用于新的臨時表,但 ibtmp1 文件保持擴展大小。

2.查詢視圖

可查詢共享臨時表空間的使用情況:

SELECT FILE_NAME, TABLESPACE_NAME, ENGINE, INITIAL_SIZE, TOTAL_EXTENTS*EXTENT_SIZE AS TotalSizeBytes, DATA_FREE,MAXIMUM_SIZE FROM INFORMATION_SCHEMA.FILES WHERE TABLESPACE_NAME = 'innodb_temporary'\G
*************************** 1. row ***************************
    FILE_NAME: /data/mysql5722/data/ibtmp1
TABLESPACE_NAME: innodb_temporary
      ENGINE: InnoDB
    INITIAL_SIZE: 12582912
   TotalSizeBytes: 31457280
    DATA_FREE: 27262976
  MAXIMUM_SIZE: 31457280
1 row in set (0.00 sec)

3.回收方式

重啟 MySQL 才能回收

4.限制大小

為防止臨時數據文件變得過大,可以配置該 innodb_temp_data_file_path (需重啟生效)選項以指定最大文件大小,當數據文件達到最大大小時,查詢將返回錯誤:

innodb_temp_data_file_path=ibtmp1:12M:autoextend:max:2G

5. 臨時表空間與 tmpdir 對比

共享臨時表空間用于存儲非壓縮InnoDB臨時表(non-compressed InnoDB temporary tables)、關系對象(related objects)、回滾段(rollback segment)等數據;

tmpdir 用于存放指定臨時文件(temporary files)和臨時表(temporary tables),與共享臨時表空間不同的是,tmpdir存儲的是compressed InnoDB temporary tables。

可通過如下語句測試:

CREATE TEMPORARY TABLE compress_table (id int, name char(255)) ROW_FORMAT=COMPRESSED;
CREATE TEMPORARY TABLE uncompress_table (id int, name char(255)) ;

附件

SimpleExample.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicLong;
public class SimpleExample {
 public static void main(String[] args) throws Exception {
  Class.forName("com.mysql.jdbc.Driver");
  Properties props = new Properties();
  props.setProperty("user", "root");
  props.setProperty("password", "root");
  SimpleExample engine = new SimpleExample();
//  engine.execute(props,"jdbc:mysql://10.186.24.31:3336/hucq?useSSL=false");
  engine.execute(props,"jdbc:mysql://10.186.24.31:3336/hucq?useSSL=falseuseCursorFetch=true");
 }
 final AtomicLong tmAl = new AtomicLong();
 final String tableName="test";
 public void execute(Properties props,String url) {
  CountDownLatch cdl = new CountDownLatch(1);
  long start = System.currentTimeMillis();
  for (int i = 0; i  1; i++) {
   TestThread insertThread = new TestThread(props,cdl, url);
   Thread t = new Thread(insertThread);
   t.start();
   System.out.println("Test start");
  }
  try {
   cdl.await();
   long end = System.currentTimeMillis();
   System.out.println("Test end,total cost:" + (end-start) + "ms");
  } catch (Exception e) {
  }
 }
 
 class TestThread implements Runnable {
  Properties props;
  private CountDownLatch countDownLatch;
  String url;
  public TestThread(Properties props,CountDownLatch cdl,String url) {
   this.props = props;
   this.countDownLatch = cdl;
   this.url = url;
  }
  public void run() {
   Connection connection = null;
   PreparedStatement ps = null;
   Statement st = null;
   long start = System.currentTimeMillis();
   try {
    connection = DriverManager.getConnection(url,props);
    connection.setAutoCommit(false);
    st = connection.createStatement();
     
    //st.setFetchSize(500);
    st.setFetchSize(Integer.MIN_VALUE); //僅修改此處即可
     
    ResultSet rstmp;
     
    st.executeQuery("select sum(k) from sbtest1 group by k");
    rstmp = st.getResultSet();
    while(rstmp.next()){
      
    }
   } catch (Exception e) {
    System.out.println(System.currentTimeMillis() - start);
    System.out.println(new java.util.Date().toString());
    e.printStackTrace();
   } finally {
    if (ps != null)
     try {
      ps.close();
     } catch (SQLException e1) {
      e1.printStackTrace();
     }
    if (connection != null)
     try {
      connection.close();
     } catch (SQLException e1) {
      e1.printStackTrace();
     }
    this.countDownLatch.countDown();
   }
  }
 }
}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • Mysql臨時表及分區表區別詳解
  • Mysql臨時表原理及創建方法解析
  • mysql臨時表用法分析【查詢結果可存在臨時表中】
  • MySQL 5.7臨時表空間如何玩才能不掉坑里詳解
  • MySQL問答系列之什么情況下會用到臨時表
  • MySQL臨時表的簡單用法介紹
  • MySQL中Update、select聯用操作單表、多表,及視圖與臨時表的區別
  • MySQL兩種臨時表的用法詳解
  • 淺談MySQL臨時表與派生表
  • MySQL中臨時表的基本創建與使用教程
  • MySQL中關于臨時表的一些基本使用方法
  • MySQL使用臨時表加速查詢的方法
  • MySQL中臨時表的使用示例

標簽:佛山 賀州 黃山 馬鞍山 蘭州 宿遷 黔南 南充

巨人網絡通訊聲明:本文標題《關于JDBC與MySQL臨時表空間的深入解析》,本文關鍵詞  關于,JDBC,與,MySQL,臨時,表空,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《關于JDBC與MySQL臨時表空間的深入解析》相關的同類信息!
  • 本頁收集關于關于JDBC與MySQL臨時表空間的深入解析的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    成人a区在线观看| 日本在线播放一区二区三区| www.色综合.com| 国产在线观看一区二区| 男人的天堂亚洲一区| 亚洲成人av资源| 亚洲宅男天堂在线观看无病毒| 国产精品全国免费观看高清| 久久综合狠狠综合久久综合88| 日韩视频一区在线观看| 欧美bbbbb| 福利电影一区二区三区| 成人av在线播放网站| 色综合久久九月婷婷色综合| 欧美在线视频全部完| 日韩欧美国产1| 国产精品青草久久| 美女脱光内衣内裤视频久久影院| 狠狠色丁香婷婷综合| 色av成人天堂桃色av| 精品欧美久久久| 亚洲欧美另类在线| 国产永久精品大片wwwapp| 91碰在线视频| 日本一区二区三区在线不卡| 91精品国产麻豆国产自产在线| 久久久久久久久久久久电影 | 国产成人超碰人人澡人人澡| 欧美美女喷水视频| 亚洲欧美色综合| 国产成人精品影视| 精品国产乱码久久久久久久 | 久久久久成人黄色影片| 亚洲a一区二区| 91在线观看美女| 国产日韩精品一区二区三区| 调教+趴+乳夹+国产+精品| 菠萝蜜视频在线观看一区| 国产欧美精品日韩区二区麻豆天美| 三级影片在线观看欧美日韩一区二区| av激情综合网| 国产精品美女一区二区在线观看| 豆国产96在线|亚洲| 国产精品色哟哟网站| 91农村精品一区二区在线| 亚洲色图欧美偷拍| 色婷婷av久久久久久久| 亚洲福利视频一区二区| 日韩欧美一区二区久久婷婷| 日本成人在线不卡视频| 日韩欧美的一区| 国产精品亚洲成人| 日本一区二区三区dvd视频在线| 丝袜美腿一区二区三区| 亚洲va韩国va欧美va精品| 91在线精品一区二区三区| 亚洲精品免费一二三区| 日本不卡的三区四区五区| 26uuu国产一区二区三区| 高清视频一区二区| 亚洲综合无码一区二区| 欧美大片一区二区| 日本道色综合久久| 美女免费视频一区二区| 欧美国产丝袜视频| 欧美日韩高清一区二区三区| 国产主播一区二区| 午夜精品福利一区二区三区av | 色综合久久久久综合体 | 大尺度一区二区| 偷窥少妇高潮呻吟av久久免费| 久久精品视频一区二区| 欧美精品粉嫩高潮一区二区| 成人免费看片app下载| 久久精品99国产精品日本| 一区二区三区在线观看动漫 | 久久久精品国产99久久精品芒果| 色欧美乱欧美15图片| 国产aⅴ综合色| 国产精品免费久久久久| 视频一区二区三区入口| 国产mv日韩mv欧美| 欧美一区二区在线视频| 日本va欧美va欧美va精品| 日韩成人免费电影| 大胆亚洲人体视频| 色婷婷久久久亚洲一区二区三区| 精品国产一区二区在线观看| 久久99精品久久久| 奇米综合一区二区三区精品视频| 欧美中文字幕一区二区三区亚洲| 亚洲激情校园春色| 成人丝袜高跟foot| 国产欧美日韩麻豆91| 亚洲女与黑人做爰| 久久99精品久久久久久国产越南 | 久久国内精品视频| 国产成人精品亚洲777人妖| 亚洲猫色日本管| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 亚洲综合在线电影| 亚洲va中文字幕| 国产白丝精品91爽爽久久| 99久久99久久精品免费观看| 69久久99精品久久久久婷婷| 亚洲精品一区二区三区福利| 综合激情网...| 国产一区二区91| 色悠悠亚洲一区二区| 久久久久久久久久久99999| 国产精品国产三级国产三级人妇 | 精品亚洲aⅴ乱码一区二区三区| 国产一区二区日韩精品| 丁香婷婷综合色啪| 欧美亚洲国产怡红院影院| 欧美日韩免费电影| 久久久高清一区二区三区| 一区精品在线播放| 一区二区高清在线| 国产在线日韩欧美| 欧美在线观看视频一区二区| 1024成人网| 国模套图日韩精品一区二区| 99视频热这里只有精品免费| 中文一区二区完整视频在线观看| 一区二区三区在线影院| 国产91高潮流白浆在线麻豆| 91精品国产91综合久久蜜臀| 欧美日韩精品欧美日韩精品一综合| 26uuu国产在线精品一区二区| 亚洲精品成a人| 国产福利不卡视频| 色狠狠桃花综合| 欧美日韩国产小视频在线观看| 中文av一区二区| 成人午夜碰碰视频| 久久蜜桃av一区精品变态类天堂 | 中文子幕无线码一区tr | 亚洲精品你懂的| 日韩三级在线免费观看| 成人听书哪个软件好| 国产女人aaa级久久久级 | 一本久久精品一区二区| 欧美人体做爰大胆视频| 亚洲国产精品久久一线不卡| 久久精品男人天堂av| 91麻豆福利精品推荐| 麻豆久久久久久久| 亚洲va韩国va欧美va| 国产精品视频在线看| 制服丝袜av成人在线看| 色综合天天做天天爱| 丝袜亚洲另类丝袜在线| 国产精品美女久久久久aⅴ国产馆| 亚洲精品成a人| 久久电影网站中文字幕| 国产亚洲精品bt天堂精选| eeuss鲁片一区二区三区在线观看| 欧美精品一区二区三| 日本中文字幕一区二区有限公司| 中文一区二区在线观看| 欧美日韩久久不卡| 91在线精品一区二区三区| 粉嫩av一区二区三区| 天天av天天翘天天综合网| 精品国产污污免费网站入口 | 亚洲精品欧美激情| 日韩三级.com| 欧美亚洲图片小说| 99久久夜色精品国产网站| 午夜精品一区二区三区三上悠亚| 7777精品伊人久久久大香线蕉的 | 91麻豆免费观看| 国产成人鲁色资源国产91色综| 午夜精品一区在线观看| 亚洲免费观看高清| 国产精品你懂的| 国产亚洲一区字幕| 久久久久青草大香线综合精品| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 欧美卡1卡2卡| 99久久久免费精品国产一区二区| 日本特黄久久久高潮| 国产麻豆视频一区| 国产91丝袜在线播放0| 国产美女娇喘av呻吟久久| 国产一区二区美女诱惑| 91蜜桃网址入口| 国产一区二区免费在线| 色综合色狠狠综合色| 97国产一区二区| 91香蕉视频污在线| 欧美日本一区二区三区四区| 精品国产伦一区二区三区观看方式 | 欧美电影在线免费观看| 欧美人狂配大交3d怪物一区| 欧美区视频在线观看| 91国模大尺度私拍在线视频| 欧美中文一区二区三区| 久久青草国产手机看片福利盒子|