本文目錄一覽:
- 1、程序員需要用到netty嗎
- 2、通過代理在java連接mysql問題,怎麼解決
- 3、java1.8使用mybaitis連接mysql遞歸查詢所有父節點用到:和@報錯Cause: java.util.NoSuchElementException
- 4、java 運行時異常,求大神指教,急!謝謝
- 5、MySQL的sharding的程序是不是要自己開發的
- 6、如何用java 5分鐘實現一個最簡單的mysql代理服務器
程序員需要用到netty嗎
作為一個學Java的,如果沒有研究過Netty,那麼你對Java語言的使用和理解僅僅停留在表面水平,會點SSH,寫幾個MVC,訪問數據庫和緩存,這些只是初等Java程序員乾的事。如果你要進階,想了解Java服務器的深層高階知識,Netty絕對是一個必須要過的門檻。
有了Netty,你可以實現自己的HTTP服務器,FTP服務器,UDP服務器,RPC服務器,WebSocket服務器,Redis的Proxy服務器,MySQL的Proxy服務器等等。
通過代理在java連接mysql問題,怎麼解決
首先,準備開發工具套件,我們並不會引入過多工具包,僅僅需要: Java8 Vert.x 3 如果你是用Maven做為項目管理工具,請將Vert.x 3引入: io.vertx vertx-core3.3.2 代碼實現: package com.maxleap.mysqlproxy; import io.vertx.core.AbstractVe…
java1.8使用mybaitis連接mysql遞歸查詢所有父節點用到:和@報錯Cause: java.util.NoSuchElementException
Java mysql mybatis批量更新數據庫,採用以下寫法即可執行,但是數據庫連接必須配置:allowMultiQueries=true
例如:jdbc:mysql://192.168.1.236:3306/test?useUnicode=trueamp;characterEncoding=UTF-8allowMultiQueries=true
update id=”batchUpdate” parameterType=”java.util.List”
foreach collection=”list” item=”item” index=”index” open=”” close=”” separator=”;”
update test
set
test=${item.test}+1
/set
where id = ${item.id}
/foreach
/update
MyBatis是支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis使用簡單的XML或註解用於配置和原始映射,將接口和Java的POJOs(Plan Old Java Objects,普通的Java對象)映射成數據庫中的記錄.
java 運行時異常,求大神指教,急!謝謝
sql語句錯了吧。看圈出來的地方,有個clause的數據庫字段名報了找不到。找到對應的sql語句在數據庫管理工具里調一下吧。
MySQL的sharding的程序是不是要自己開發的
不一定需要自己開發。Shard層可以位於:
1、DAO層:一般需要自行開發,可以靈活定製
2、ORM層:比如guzz、Hibernate Shard
3、JDBC API層:比較難,有一個商業產品dbShards
4、應用服務器與數據庫之間通過代理實現:MySQL Proxy、amoeba…..
一 背景
當數據庫中的數據量越來越大時,不論是讀還是寫,壓力都會變得越來越大。採用MySQL
Replication多master多slave方案,在上層做負載均衡,雖然能夠一定程度上緩解壓力。但是當一張表中的數據變得非常龐大時,壓力還是
非常大的。試想,如果一張表中的數據量達到了千萬甚至上億級別的時候,不管是建索引,優化緩存等,都會面臨巨大的性能壓力。
二 定義
數據sharding,也稱作數據切分,或分區。是指通過某種條件,把同一個數據庫中的數據分散到多個數據庫或多台機器上,以減小單台機器壓力。
三 分類
數據分區根據切分規則,可以分為兩類:
1、垂直切分
數據的垂直切分,也可以稱之為縱向切分。將數據庫想象成為由很多個一大塊一大塊的“數據塊”(表)組成,我們垂直的將這些“數據塊”切開,然後將他們分散
到多台數據庫主機上面。這樣的切分方法就是一個垂直(縱向)的數據切分。以表為單位,把不同的表分散到不同的數據庫或主機上。規則簡單,實施方便,適合業
務之間耦合度低的系統。
Sharding詳解” title=”MySQL Sharding詳解” height=”373″ width=”553″
垂直切分的優點
(1)數據庫的拆分簡單明了,拆分規則明確;
(2)應用程序模塊清晰明確,整合容易;
(3)數據維護方便易行,容易定位;
垂直切分的缺點
(1)部分表關聯無法在數據庫級別完成,需要在程序中完成;
(2)對於訪問極其頻繁且數據量超大的表仍然存在性能平靜,不一定能滿足要求;
(3)事務處理相對更為複雜;
(4) 切分達到一定程度之後,擴展性會遇到限制;
(5)過讀切分可能會帶來系統過渡複雜而難以維護。
2、水平切分
一般來說,簡單的水平切分主要是將某個訪問極其平凡的表再按照某個字段的某種規則來分散到多個表之中,每個表中包含一部分數據。以行為單位,將同一個表中的數據按照某種條件拆分到不同的數據庫或主機上。相對複雜,適合單表巨大的系統。
Sharding詳解” title=”MySQL Sharding詳解” height=”372″ width=”553″
水平切分的優點
(1)表關聯基本能夠在數據庫端全部完成;
(2)不會存在某些超大型數據量和高負載的表遇到瓶頸的問題;
(3)應用程序端整體架構改動相對較少;
(4)事務處理相對簡單;
(5)只要切分規則能夠定義好,基本上較難遇到擴展性限制;
水平切分的缺點
(1)切分規則相對更為複雜,很難抽象出一個能夠滿足整個數據庫的切分規則;
(2)後期數據的維護難度有所增加,人為手工定位數據更困難;
(3)應用系統各模塊耦合度較高,可能會對後面數據的遷移拆分造成一定的困難。
3、聯合切分
實際的應用場景中,除了那些負載並不是太大,業務邏輯也相對較簡單的系統可以通過上面兩種切分方法之一來解決擴展性問題之外,恐怕其他大部分業務邏輯稍微
複雜一點,系統負載大一些的系統,都無法通過上面任何一種數據的切分方法來實現較好的擴展性,而需要將上述兩種切分方法結合使用,不同的場景使用不同的切
分方法。
Sharding詳解” title=”MySQL Sharding詳解” height=”480″ width=”342″
聯合切分的優點
(1)可以充分利用垂直切分和水平切分各自的優勢而避免各自的缺陷;
(2)讓系統擴展性得到最大化提升;
聯合切分的缺點
(1)數據庫系統架構比較複雜,維護難度更大;
(2)應用程序架構也相對更複雜;
四 實現方案
現在 Sharding 相關的軟件實現其實不少,基於數據庫層、DAO 層、不同語言下也都不乏案例。限於篇幅,此處只作一下簡要的介紹。
1、 Mysql Proxy + HASCALE
一套比較有潛力的方案。其中MySQL Proxy 是用 Lua 腳本實現的,介於客戶端與服務器端之間,扮演 Proxy
的角色,提供查詢分析、失敗接管、查詢過濾、調整等功能。目前的 0.6 版本還做不到讀、寫分離。HSCALE 則是針對 MySQL Proxy 插件,也是用
Lua 實現的,對 Sharding 過程簡化了許多。需要指出的是,MySQL Proxy 與 HSCALE
各自會帶來一定的開銷,但這個開銷與集中式數據處理方式單條查詢的開銷還是要小的。
MySQLProxy是MySQL官方提供的一個數據庫代理層產品,和MySQLServer一樣,同樣是一個基於GPL開源協議的開源產品。可用來監視、分析或者傳輸他們之間的通訊信息。他的靈活性允許你最大限度的使用它,目前具備的功能主要有連接路由,Query分析,Query過濾和修改,負載均衡,以及基本的HA機制等。
實際上,MySQLProxy本身並不具有上述所有的這些功能,而是提供了實現上述功能的基礎。要實現這些功能,還需要通過我們自行編寫LUA腳本來實現。
MySQLProxy實際上是在客戶端請求與MySQLServer之間建立了一個連接池。所有客戶端請求都是發向MySQLProxy,然後經由MySQLProxy進行相應的分析,判斷出是讀操作還是寫操作,分發至對應的MySQLServer上。對於多節點Slave集群,也可以起做到負載均衡的效果。以下是MySQLProxy的基本架構圖:
Sharding詳解” title=”MySQL Sharding詳解” height=”480″ width=”420″
通過上面的架構簡圖,我們可以很清晰的看出MySQLProxy在實際應用中所處的位置,以及能做的基本事情。關於MySQLProxy更為詳細的實施細則在MySQL官方文檔中有非常詳細的介紹和示例,感興趣的讀者朋友可以直接從MySQL官方網站免費下載或者在線閱讀,我這裡就不累述浪費紙張了。
2、 Hibernate Shards
這是 Google 技術團隊貢獻的項目(),該項目是在對Google 財務系統數據
Sharding 過程中誕生的。因為是在框架層實現的,所以有其獨特的特性:標準的 Hibernate 編程模型,會用 Hibernate
就能搞定,技術成本較低;相對彈性的 Sharding 策略以及支持虛擬 Shard 等。
3、 Spock Proxy
這也是在實際需求中產生的一個開源項目,基於Mysql Proxy擴展。Spock()是一個人員查找的 Web
2.0 網站。通過對自己的單一 DB 進行有效 Sharding化 而產生了Spock
Proxy( ) 項目,Spock Proxy 算得上 MySQL Proxy
的一個分支,提供基於範圍的 Sharding 機制。Spock 是基於 Rails 的,所以Spock Proxy 也是基於 Rails 構建,關注 ROR
的朋友不應錯過這個項目。
4、 Amoeba for MySQL
Amoeba是一個基於Java開發的,專註於解決分布式數據庫數據源整合Proxy程序的開源框架,基於GPL3開源協議。目前,Amoeba已經具有Query路由,Query過濾,讀寫分離,負載均衡以及HA機制等相關內容。
Amoeba 主要解決的以下幾個問題:
(1)數據切分後複雜數據源整合;
(2)提供數據切分規則並降低數據切分規則給數據庫帶來的影響;
(3)降低數據庫與客戶端的連接數;
(4)讀寫分離路由。
我們可以看出,Amoeba所做的事情,正好就是我們通過數據切分來提升數據庫的擴展性所需要的。
Amoeba並不是一個代理層的Proxy程序,而是一個開發數據庫代理層Proxy程序的開發框架,目前基於Amoeba所開發的Proxy程序有AmoebaForMySQL和AmoebaForAladin兩個。
AmoebaForMySQL主要是專門針對MySQL數據庫的解決方案,前端應用程序請求的協議以及後端連接的數據源數據庫都必須是MySQL。對於客戶端的任何應用程序來說,AmoebaForMySQL和一個MySQL數據庫沒有什麼區別,任何使用MySQL協議的客戶端請求,都可以被AmoebaForMySQL解析並進行相應的處理。下如可以告訴我們AmoebaForMySQL的架構信息(出自Amoeba開發者博客):
Sharding詳解” title=”MySQL Sharding詳解” height=”480″ width=”384″
AmoebaForAladin則是一個適用更為廣泛,功能更為強大的Proxy程序。他可以同時連接不同數據庫的數據源為前端應用程序提供服務,但是僅僅接受符合MySQL協議的客戶端應用程序請求。也就是說,只要前端應用程序通過MySQL協議連接上來之後,AmoebaForAladin會自動分析Query語句,根據Query語句中所請求的數據來自動識別出該所Query的數據源是在什麼類型數據庫的哪一個物理主機上面。下圖展示了AmoebaForAladin的架構細節(出自Amoeba開發者博客):
Sharding詳解” title=”MySQL Sharding詳解” height=”480″ width=”384″
咋一看,兩者好像完全一樣嘛。細看之後,才會發現兩者主要的區別僅在於通過MySQLProtocalAdapter處理之後,根據分析結果判斷出數據源數據庫,然後選擇特定的JDBC驅動和相應協議連接後端數據庫。
其實通過上面兩個架構圖大家可能也已經發現了Amoeba的特點了,他僅僅只是一個開發框架,我們除了選擇他已經提供的ForMySQL和ForAladin這兩款產品之外,還可以基於自身的需求進行相應的二次開發,得到更適應我們自己應用特點的Proxy程序。
當對於使用MySQL數據庫來說,不論是AmoebaForMySQL還是AmoebaForAladin都可以很好的使用。當然,考慮到任何一個系統越是複雜,其性能肯定就會有一定的損失,維護成本自然也會相對更高一些。所以,對於僅僅需要使用MySQL數據庫的時候,我還是建議使用AmoebaForMySQL。
AmoebaForMySQL的使用非常簡單,所有的配置文件都是標準的XML文件,總共有四個配置文件。分別為:
(1)amoeba.xml:主配置文件,配置所有數據源以及Amoeba自身的參數設置;
(2)rule.xml:配置所有Query路由規則的信息;
(3)functionMap.xml:配置用於解析Query中的函數所對應的Java實現類;
(4)rullFunctionMap.xml:配置路由規則中需要使用到的特定函數的實現類;
如果您的規則不是太複雜,基本上僅需要使用到上面四個配置文件中的前面兩個就可完成所有工作。Proxy程序常用的功能如讀寫分離,負載均衡等配置都在amoeba.xml中進行。此外,Amoeba已經支持了實現數據的垂直切分和水平切分的自動路由,路由規則可以在rule.xml進行設置。
目前Amoeba少有欠缺的主要就是其在線管理功能以及對事務的支持了,曾經在與相關開發者的溝通過程中提出過相關的建議,希望能夠提供一個可以進行在線維護管理的命令行管理工具,方便在線維護使用,得到的反饋是管理專門的管理模塊已經納入開發日程了。另外在事務支持方面暫時還是Amoeba無法做到的,即使客戶端應用在提交給Amoeba的請求是包含事務信息的,Amoeba也會忽略事務相關信息。當然,在經過不斷完善之後,我相信事務支持肯定是Amoeba重點考慮增加的feature。
關於Amoeba更為詳細的使用方法讀者朋友可以通過Amoeba開發者博客()上面提供的使用手冊獲取,這裡就不再細述了。
案例()
操作文檔()
5、 HiveDB
和前面的MySQLProxy以及Amoeba一樣,HiveDB同樣是一個基於Java針對MySQL數據庫的提供數據切分及整合的開源框架,只是目前的HiveDB僅僅支持數據的水平切分。主要解決大數據量下數據庫的擴展性及數據的高性能訪問問題,同時支持數據的冗餘及基本的HA機制。
HiveDB的實現機制與MySQLProxy和Amoeba有一定的差異,他並不是藉助MySQL的Replication功能來實現數據的冗餘,而是自行實現了數據冗餘機制,而其底層主要是基於HibernateShards來實現的數據切分工作。
在HiveDB中,通過用戶自定義的各種Partitionkeys(其實就是制定數據切分規則),將數據分散到多個MySQLServer中。在訪問的時候,在運行Query請求的時候,會自動分析過濾條件,並行從多個MySQLServer中讀取數據,併合並結果集返回給客戶端應用程序。
單純從功能方面來講,HiveDB可能並不如MySQLProxy和Amoeba那樣強大,但是其數據切分的思路與前面二者並無本質差異。此外,HiveDB並不僅僅只是一個開源愛好者所共享的內容,而是存在商業公司支持的開源項目。
下面是HiveDB官方網站上面一章圖片,描述了HiveDB如何來組織數據的基本信息,雖然不能詳細的表現出太多架構方面的信息,但是也基本可以展示出其在數據切分方面獨特的一面了。
Sharding詳解” title=”MySQL Sharding詳解” height=”471″ width=”553″
6、 DataFabric
application-level sharding
master/slave replication
7、PL/Proxy
前面幾個都是針對MySQL 的 Sharding 方案,PL/Proxy 則是針對 PostgreSQL 的,設計思想類似 Teradata 的
Hash 機制,數據存儲對客戶端是透明的,客戶請求發送到 PL/Proxy 後,由這裡分布式存儲過程調用,統一分發。 PL/Proxy
的設計初衷就是在這一層充當”數據總線”的職責,所以,當數據吞吐量支撐不住的時候,只需要增加更多的 PL/Proxy 服務器即可。大名鼎鼎的 Skype 用的就是
PL/Proxy 的解決方案。
8、Pyshards
這是個基於Python的解決方案。該工具的設計目標還有個 Re-balancing 在裡面,這倒是個比較激進的想法。目前只支持 MySQL
數據庫。
9、其他實現數據切分及整合的解決方案
除了上面介紹的幾個數據切分及整合的整體解決方案之外,還存在很多其他同樣提供了數據切分與整合的解決方案。如基於MySQLProxy的基礎上做了進一步擴展的HSCALE,通過Rails構建的SpockProxy,以及基於Pathon的Pyshards等等。
不管大家選擇使用哪一種解決方案,總體設計思路基本上都不應該會有任何變化,那就是通過數據的垂直和水平切分,增強數據庫的整體服務能力,讓應用系統的整體擴展能力儘可能的提升,擴展方式儘可能的便捷。
只要我們通過中間層Proxy應用程序較好的解決了數據切分和數據源整合問題,那麼數據庫的線性擴展能力將很容易做到像我們的應用程序一樣方便,只需要通過添加廉價的PCServer服務器,即可線性增加數據庫集群的整體服務能力,讓數據庫不再輕易成為應用系統的性能瓶頸。
五 注意事項
下面我們所說的分區,主要是指水平分區。
1、在實施分區前,我們可以查看所安裝版本的mysql是否支持分區:
mysql show variables like “%partition%”;
如果支持則會顯示:
+——————-+——-+
| Variable_name | Value |
+——————-+——-+
| have_partitioning | YES |
+——————-+——-+
2、分區適用於一個表的所有數據和索引,不能只對數據分區而不對索引分區,反之亦然,同時也不能只對錶的一部分進行分區。
3、分區類型
(1)RANGE 分區:基於屬於一個給定連續區間的列值,把多行分配給分區。
(2)LIST 分區:類似於按RANGE分區,區別在於LIST分區是基於列值匹配一個離散值集合中的某個值來進行選擇。
(3)HASH分區:基於用戶定義的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的這些行的列值進行計算(新浪微博採用的方案)。
(4)KEY 分區:類似於按HASH分區,區別在於KEY分區只支持計算一列或多列,且MySQL
服務器提供其自身的哈希函數。必須有一列或多列包含整數值。
無論使用何種類型的分區,分區總是在創建時就自動的順序編號,且從0開始記錄。當有一新行插入到一個分區表中時,就是使用這些分區編號來識別正確的分區。
4、MySQL提供了許多修改分區表的方式。添加、刪除、重新定義、合併或拆分已經存在的分區是可能的。所有這些操作都可以通過使用ALTER TABLE
命令的分區擴展來實現。
5、可以對已經存在的表進行分區,直接使用alter table命令即可。
如何用java 5分鐘實現一個最簡單的mysql代理服務器
如何用java 5分鐘實現一個最簡單的mysql代理服務器
首先,準備開發工具套件,我們並不會引入過多工具包,僅僅需要:
java8
vert.x 3
如果你是用maven做為項目管理工具,請將vert.x 3引入:
1
2
3
4
5
dependency
groupIdio.vertx/groupId
artifactIdvertx-core/artifactId
version3.3.2/version
/dependency
代碼實現:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package
com.maxleap.mysqlproxy;
import
io.vertx.core.AbstractVerticle;
import
io.vertx.core.Vertx;
import
io.vertx.core.logging.Logger;
import
io.vertx.core.logging.LoggerFactory;
import
io.vertx.core.net.NetClient;
import
io.vertx.core.net.NetServer;
import
io.vertx.core.net.NetSocket;
/**
*
@author sneaky
*
@since 1.0.0
*/
public
class
MysqlProxyServer
{
private
static
final
Logger
logger
=
LoggerFactory.getLogger(MysqlProxyServer.class);
public
static
void
main(String[]
args)
{
Vertx.vertx().deployVerticle(new
MysqlProxyServerVerticle());
}
public
static
class
MysqlProxyServerVerticle
extends
AbstractVerticle
{
private
final
int
port
=
3306;
private
final
String
mysqlHost
=
“10.10.0.6”;
@Override
public
void
start()
throws
Exception
{
NetServer
netServer
=
vertx.createNetServer();//創建代理服務器
NetClient
netClient
=
vertx.createNetClient();//創建連接mysql客戶端
netServer.connectHandler(socket
–
netClient.connect(port,
mysqlHost,
result
–
{
//響應來自客戶端的連接請求,成功之後,在建立一個與目標mysql服務器的連接
if
(result.succeeded())
{
//與目標mysql服務器成功連接連接之後,創造一個MysqlProxyConnection對象,並執行代理方法
new
MysqlProxyConnection(socket,
result.result()).proxy();
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/183590.html