mysql-connector-java驅動升級到8.0後數據庫保存時間出現時差

1.問題:在一個新項目中用到了新版的mysql jdbc 驅動後,發現保存到數據庫的時間出現了時差

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.18</version>
</dependency>

結果發現保存到服務器的時間出現了問題.html

2.解決方案:

1.修改數據庫時區: (不推薦)java

#查看當前時區
show variables like "%time_zone%";
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | CST    |
| time_zone        | SYSTEM |
+------------------+--------+

1.1修改my.cnf文件 添加mysql

default-time_zone = '+8:00

1.2命令方式sql

#修改mysql全局時區爲北京時間,即咱們所在的東8區
set global time_zone = '+8:00';  
#修改當前會話時區
set time_zone = '+8:00'; 
flush privileges;

修改完畢後數據庫

+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | CST    |
| time_zone        | +08:00 |
+------------------+--------+

2.在jdbc 的url中添加時區信息(推薦) > >jdbc:mysql://xxx.xxx.xxx.xxx/foo_db?autoReconnect=true&autoCommit=false&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8 >api

咱們是北京時區也就是東八區安全

//北京時間東八區
serverTimezone=GMT%2B8 
//或者使用上海時間
serverTimezone=Asia/Shanghai

3.常見jdbc的url中的參數設置

mysql 官方文檔: https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-configuration-properties.htmlbash

參數名稱 參數說明 缺省值 最低版本要求
useUnicode 是否使用Unicode字符集,若是參數characterEncoding設置爲gb2312或gbk,本參數值必須設置爲true false 1.1g
characterEncoding 當useUnicode設置爲true時,指定字符編碼。好比可設置爲gb2312或gbk,utf8 false 1.1g
autoReconnect 當數據庫鏈接異常中斷時,是否自動從新鏈接? false 1.1
autoReconnectForPools 是否使用針對數據庫鏈接池的重連策略 false 3.1.3
failOverReadOnly 自動重連成功後,鏈接是否設置爲只讀? TRUE 3.0.12
maxReconnects autoReconnect設置爲true時,重試鏈接的次數 3 1.1
initialTimeout autoReconnect設置爲true時,兩次重連之間的時間間隔,單位:秒 2 1.1
connectTimeout 和數據庫服務器創建socket鏈接時的超時,單位:毫秒。 0表示永不超時,適用於JDK 1.4及更高版本 0 3.0.1
socketTimeoutsocket 操做(讀寫)超時,單位:毫秒。 0表示永不超時 0 3.0.1
socketFactory 驅動程序用於建立與服務器套接字鏈接的類的名稱。該類必須實現了接口「com.mysql.jdbc.SocketFactory」,並有公共無參量構造函數。 com.mysql.jdbc.StandardSocketFactory 3.0.3
connectTimeout 套接字鏈接的超時(單位爲毫秒),0表示無超時。僅對JDK-1.4或更新版本有效。默認值爲「0」。 0 3.0.1
socketTimeout 網絡套接字鏈接的超時(默認值0表示無超時)。 0 3.0.1
useConfigs 在解析URL屬性或應用用戶指定的屬性以前,加載由逗號「,」分隔的配置屬性列表。在文檔的「配置」部分中解釋了這些配置。 3.1.5
interactiveClient 設置CLIENT_INTERACTIVE標誌,根據INTERACTIVE_TIMEOUT而不是WAIT_TIMEOUT向MySQL通報超時鏈接。 false 3.1.0
propertiesTransform com.mysql.jdbc.ConnectionPropertiesTransform的1個實施實例,在嘗試鏈接以前,驅動程序將使用它來更改傳遞給驅動的URL屬性。 3.1.4
useCompression 與服務器進行通訊時採用zlib壓縮(真/假)? 默認值爲「假」。 false 3.0.17
High Availability and Clustering (高可用性和簇集)
autoReconnect 驅動程序是否應嘗試再次創建失效的和/或死鏈接? 若是容許,對於在失效或死鏈接上發出的查詢(屬於當前事務),驅動程序將拋出異常,但在新事務的鏈接上發出下一個查詢時,將嘗試再鏈接。不推薦使用該特 性,這是由於,當應用程序不能恰當處理SQLExceptions時,它會形成與會話狀態和數據一致性有關的反作用,設計它的目的僅用於下述狀況,即,當 你沒法配置應用程序來恰當處理因死鏈接和/或無效鏈接致使的SQLExceptions時。做爲可選方式,可將MySQL服務器變量「wait_timeout」設置爲較高的值,而不是默認的8小時。 false 1.1
autoReconnectForPools 使用適合於鏈接池的再鏈接策略(默認值爲「假」)。 false 3.1.3
failOverReadOnly 在autoReconnect模式下出現故障切換時,是否應將鏈接設置爲「只讀」? true 3.0.12
reconnectAtTxEnd 若是將autoReconnect設置爲「真」,在每次事務結束後驅動程序是否應嘗試再鏈接? false 3.0.10
roundRobinLoadBalance 啓用了autoReconnect並且failoverReadonly爲「假」時,是否應按照循環方式挑選要鏈接的主機? false 3.1.2
queriesBeforeRetryMaster 出現故障切換(使用多主機故障切換)並返回主機以前發出的查詢數。不管首先知足了哪一個條件,「queriesBeforeRetryMaster」或「secondsBeforeRetryMaster」,均會再次與主機進行鏈接。默認值爲「50」。 50 3.0.2
secondsBeforeRetryMaster 出現故障切換後,在嘗試再次鏈接到主服務器以前,驅動程序應等待的時間? 不管首先知足了哪一個條件,「queriesBeforeRetryMaster」或「secondsBeforeRetryMaster」,均會再次與主 機進行鏈接。單位爲秒,默認值爲30。 30 3.0.2
enableDeprecatedAutoreconnect 自3.2版開始,自動再鏈接功能受到冷落,在3.3版中將刪除該功能。將該屬性設置爲「真」可禁止檢查配置的特性。 false 3.2.1
Security (安全)
allowMultiQueries 在一條語句中,容許使用「;」來分隔多條查詢(真/假,默認值爲「假」)。 false 3.1.1
useSSL 與服務器進行通訊時使用SSL(真/假),默認值爲「假」。 false 3.0.2
requireSSL 要求SSL鏈接,useSSL=true? 默認值爲「假」。 false 3.1.0
allowUrlInLocalInfile 驅動程序在是「LOAD DATA LOCAL INFILE」語句中否容許URL? false 3.1.4
paranoid 採起措施,防止在錯誤信息中泄漏敏感信息,並可可能時清除保存敏感數據的數據結構? 默認值爲「假」。 false 3.0.1
Performance Extensions (性能擴展)
metadataCacheSize 若是將cacheResultSetMetaData設置爲「真」,對cacheResultSetMetadata的查詢次數(默認值爲50)。 50 3.1.1
prepStmtCacheSize 若是容許預處理語句緩衝功能,應緩衝處理多少條預處理語句? 25 3.0.10
prepStmtCacheSqlLimit 若是容許預處理語句緩衝功能,驅動程序將執行解析緩衝處理的最大SQL是什麼? 256 3.0.10
maintainTimeStats 驅動程序是否應維持各類內部定時器,以容許空閒時間計算,以及與服務器的鏈接失敗時容許提供更詳細的錯誤消息? 將該屬性設置爲「假」,對於每次查詢,至少能減小兩次對System.getCurrentTimeMillis()的調用。 true 3.1.9
blobSendChunkSize 組塊,當經過ServerPreparedStatements發送BLOB/CLOB時使用。 1048576 3.1.9
cacheCallableStmts 驅動程序是否應對CallableStatements的解析過程執行緩衝處理。 false 3.1.2
cachePrepStmts 驅動程序是否應對客戶端預處理語句的PreparedStatements的解析過程執行緩衝處理,是否應檢查服務器端預處理語句的適用性以及服務器端預處理語句自己? false 3.0.10
cacheResultSetMetadata 驅動程序是否應對用於Statements和PreparedStatements的ResultSetMetaData執行緩衝處理? 要求 JDK-1.4+,真/假,默認爲「假」。 false 3.1.1
cacheServerConfiguration 驅動程序是否應根據每條URL對「HOW VARIABLES」和「SHOW COLLATION」的結果執行緩衝處理? false 3.1.5
dontTrackOpenResources JDBC規範要求驅動程序自動跟蹤和關閉資源,可是,若是你的應用程序不能明確調用做用在語句或結果集上的close(),可能會致使內存泄漏。將該屬性設置爲「真」,可放寬該限制,對於某些應用程序,會提供更高的內存效率。 false 3.1.7
dynamicCalendars 須要時,驅動程序是否應檢索默認日曆,或根據鏈接/會話對其進行緩衝處理? false 3.1.5
elideSetAutoCommits 若是使用MySQL-4.1或更高版本,當服務器的狀態與Connection.setAutoCommit(boolean)請求的狀態不匹配時,驅動程序是否僅應發出「set autocommit=n」查詢? false 3.1.3
holdResultsOpenOverStatementClose 驅動程序是否應按照JDBC規範的要求關閉Statement.close()上的結果集? false 3.1.7
locatorFetchBufferSize 若是將「emulateLocators」配置爲「真」,當獲取關於getBinaryInputStream的BLOB數據時,緩衝區的大小應是多少? 1048576 3.2.1
useFastIntParsing 是否使用內部「String->Integer」轉換子程序來避免建立過多對象? true 3.1.4
useLocalSessionState 驅動程序是否應引用autocommit的內部值,以及由Connection.setAutoCommit()和Connection.setTransactionIsolation()設置的事務隔離,而不是查詢數據庫? false 3.1.7
useNewIO 驅動程序是否應將java.nio.* interfaces用於網絡通訊(真/假),默認爲「假」。 false 3.1.0
useReadAheadInput 從服務器讀取數據時,是否使用較新的、優化的非成組緩衝輸入流? true 3.1.5
Debuging/Profiling (調試/ 仿形)
logger 實現了com.mysql.jdbc.log.Log的類的名稱,com.mysql.jdbc.log.Log用於記錄消息(默認爲「com.mysql.jdbc.log.StandardLogger」,它會將日誌記錄到STDERR)。 com.mysql.jdbc.log.StandardLogger 3.1.1
profileSQL 跟蹤查詢以及它們對已配製記錄器的執行/獲取次數(真/假),默認爲「假」。 false 3.1.0
reportMetricsIntervalMillis 若是容許「gatherPerfMetrics」,記錄它們的頻率是多少(單位毫秒)? 30000 3.1.2
maxQuerySizeToLog 調試或仿形時,控制將記錄的查詢的最大長度/大小。 2048 3.1.3
packetDebugBufferSize 當「enablePacketDebug」爲「真」時,須要保留的最大信息包數目。 20 3.1.3
slowQueryThresholdMillis 若是容許「logSlowQueries」,在將查詢記錄爲「慢」以前的查詢時間是多少(毫秒)? 2000 3.1.2
useUsageAdvisor 驅動程序是否應發出「使用狀況」警告,就DBC和MySQL Connector/J的恰當和高效使用給出建議(真/假,默認爲「假」)? false 3.1.1
autoGenerateTestcaseScript 驅動程序是否應將正在執行的SQL(包括服務器端預處理語句)轉儲到STDERR? false 3.1.9
dumpQueriesOnException 驅動程序是否應將發送至服務器的查詢內容轉儲到SQLExceptions中? false 3.1.3
enablePacketDebug 容許時,將保留「packetDebugBufferSize」信息包的環形緩衝區,並當在驅動程序代碼的關鍵區域拋出異常時進行轉儲。 false 3.1.3
explainSlowQueries 若是容許了「logSlowQueries」,驅動程序是否應在服務器上自動發出「EXPLAIN」,並以WARN級別將結果發送給配置好的日誌? false 3.1.2
logSlowQueries 是否要記錄時間長於「slowQueryThresholdMillis」的查詢? false 3.1.2
traceProtocol 是否應記錄跟蹤級網絡協議? false 3.1.2
Miscellaneous (其餘)
useUnicode 處理字符串時,驅動程序是否應使用Unicode字符編碼? 僅應在驅動程序沒法肯定字符集映射,或你正在強制驅動程序使用MySQL不是固有支持的字符集時(如UTF-8)才應使用。真/假,默認爲「真」。 false 1.1g
characterEncoding 若是「useUnicode」被設置爲「真」,處理字符串時,驅動程序應使用什麼字符編碼? 默認爲「autodetect」。 1.1g
characterSetResults 字符集,用於通知服務器以何種字符集返回結果。 3.0.13
connectionCollation 若是設置了它,將通知服務器經過「set collation_connection」使用該校對。 3.0.13
sessionVariables 以逗號隔開的「名稱/值」對列表,當驅動程序創建了鏈接後,以「SET SESSION …」的方式將其發送給服務器。 3.1.8
allowNanAndInf 驅動程序是否應在PreparedStatement.setDouble()中容許NaN或+/- INF值? false 3.1.5
autoDeserialize 驅動程序是否應自動檢測並串並轉換保存在BLOB字段中的對象? false 3.1.5
capitalizeTypeNames 是否將DatabaseMetaData中的類型名轉換爲大寫? 一般僅在使用WebObjects時有用,真/假。默認爲「假」。 false 2.0.7
clobberStreamingResults 這會使「流式」結果集被自動關閉,若是在全部數據還沒有從服務器中讀取完以前,執行了另外一查詢,正在從服務器流出的任何未完成數據均將丟失。 false 3.0.9
continueBatchOnError 若是一條語句失敗,驅動程序是否應繼續處理批命令? JDBC規範容許任何一種方式(默認爲「真」)。 true 3.0.3
createDatabaseIfNotExist 若是不存在,建立URL中給定的數據庫。假定用戶具備建立數據庫的權限。 false 3.1.9
emptyStringsConvertToZero 驅動程序是否應容許從空字符串字段到數值「0」的轉換? true 3.1.8
emulateLocators N/A false 3.1.0
emulateUnsupportedPstmts 驅動程序是否應檢測不被服務器支持的預處理語句,並用客戶端模擬版替換它們? true 3.1.7
ignoreNonTxTables 是否忽略關於回退的非事務表? 默認值爲「假」。 false 3.0.9
jdbcCompliantTruncation 鏈接到支持告警的服務器時(MySQL 4.1.0和更高版本),當按照JDBC的要求截短數據時,驅動程序是否應拋出java.sql.DataTruncation異常? true 3.1.2
maxRows 返回的最大行數(0,默認值表示返回全部行)。 -1 all versions
noDatetimeStringSync 不保證ResultSet.getDatetimeType().toString().equals(ResultSet.getString()。 false 3.1.7
nullCatalogMeansCurrent 當DatabaseMetadataMethods請求「目錄」參數時,值「Null」是否意味着使用當前目錄? 它不兼容JDBC,但符合驅動程序早期版本的傳統行爲。 true 3.1.8
nullNamePatternMatchesAll 接受*pattern參數的DatabaseMetaData方法是否應將null按對待「%」的相同方式處理(不兼容JDBC,但驅動程序的早期版本能接受與規範的這類偏離)。 true 3.1.8
pedantic 嚴格遵照JDBC規範。 false 3.0.0
relaxAutoCommit 若是驅動程序所鏈接的MySQL服務器的版本不支持事務,仍容許調用commit()、rollback()和setAutoCommit()?真/假,默認爲「假」。 false 2.0.13
retainStatementAfterResultSetClose 調用ResultSet.close()後,驅動程序是否應將語句引用保存在結果集中? 在JDBC-4.0後,與JDBC不兼容。 false 3.1.11
rollbackOnPooledClose 當鏈接池中的邏輯鏈接關閉時,驅動程序是否應發出rollback()? true 3.0.15
runningCTS13 容許在Sun與JDBC兼容的testsuite 1.3版中處理缺陷。 false 3.1.7
serverTimezone 覆蓋時區的檢測/映射。當服務器的時區爲映射到Java時區時使用。 3.0.2
strictFloatingPoint 僅在兼容性測試的早期版本中使用。 false 3.0.0
strictUpdates 驅動程序是否應對可更新結果集進行嚴格檢查(選擇全部的主鍵)?真/假,默認爲「真」。 true 3.0.4
tinyInt1isBit 驅動程序是否應將數據類型TINYINT(1)看成BIT類型對待?建立表時,服務器會執行BIT -> TINYINT(1)操做。 true 3.0.16
transformedBitIsBoolean 若是驅動程序將TINYINT(1)轉換爲不一樣的類型,爲了與MySQL-5.0兼容,驅動程序是否應使用BOOLEAN取代BIT?這是由於MySQL-5.0具備BIT類型。 false 3.1.9
ultraDevHack 因爲UltraDev已損壞,併爲全部語句發出了prepareCall(),須要時,是否要爲prepareCall()建立PreparedStatements? false 2.0.3
useHostsInPrivileges 在DatabaseMetaData.getColumn/TablePrivileges()中爲用戶添加「@hostname」。真/假,默認爲「真」。 true 3.0.2
useOldUTF8Behavior 與4.0和更早版本的服務器進行通訊時,使用UTF-8。 false 3.1.6
useOnlyServerErrorMessages 對服務器返回的錯誤消息,不事先設定「標準的」SQLState錯誤消息。 true 3.0.15
useServerPrepStmts 若是服務器支持,是否使用服務器端預處理語句? 默認值爲「真」。 true 3.1.0
useSqlStateCodes 使用SQL標準狀態碼取代「傳統的」X/Open/SQL狀態碼,真/假,默認爲「真」。 true 3.1.3
useStreamLengthsInPrepStmts 是否採用PreparedStatement/ResultSet.setXXXStream()方法調用中的流長度參數?真/假,默認爲「真」。 true 3.0.2
useTimezone 是否在客戶端和服務器時區間轉換時間/日期類型(真/假,默認爲「假」)? false 3.0.2
useUnbufferedInput 不使用BufferedInputStream來從服務器讀取數據。 true 3.0.11
yearIsDateType JDBC驅動程序是否應將MySQL類型「YEAR」看成java.sql.Date或SHORT對待? true 3.1.9
zeroDateTimeBehavior 當驅動程序遇到全由0組成的DATETIME值時,應出現什麼?MySQL使用它來表示無效日期。有效值是「exception」、「round」和「convertToNull」。 exception
相關文章
相關標籤/搜索