❶ Druid 的sql翻譯功能如何使用
Druid是阿里巴巴開源平台上的一個項目,整個項目由資料庫連接池、插件框架和SQL解析器組成。該項目主要是為了擴展JDBC的一些限制,可以讓程序員實現一些特殊的需求,比如向密鑰服務請求憑證、統計SQL信息、SQL性能收集、SQL注入檢查、SQL翻譯等,程序員可以通過定製來實現自己需要的功能。
❷ Druid的數據連接
Druid支持所有JDBC兼容的資料庫,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。
Druid針對Oracle和MySql做了特別優化,比如Oracle的PS Cache內存佔用優化,MySql的ping檢測優化。 阿里巴巴是一個重度使用關系資料庫的公司,我們在生產環境中大量的使用Druid,通過長期在極高負載的生產環境中實際使用、修改和完善,讓Druid逐步發展成最好的資料庫連接池。Druid在監控、可擴展性、穩定性和性能方面都有明顯的優勢。
首先,強大的監控特性,通過Druid提供的監控功能,可以清楚知道連接池和SQL的工作情況。
監控SQL的執行時間、ResultSet持有時間、返回行數、更新行數、錯誤次數、錯誤堆棧信息。
SQL執行的耗時區間分布。什麼是耗時區間分布呢?比如說,某個SQL執行了1000次,其中0~1毫秒區間50次,1~10毫秒800次,10~100毫秒100次,100~1000毫秒30次,1~10秒15次,10秒以上5次。通過耗時區間分布,能夠非常清楚知道SQL的執行耗時情況。
監控連接池的物理連接創建和銷毀次數、邏輯連接的申請和關閉次數、非空等待次數、PSCache命中率等。
其次,方便擴展。Druid提供了Filter-Chain模式的擴展API,可以自己編寫Filter攔截JDBC中的任何方法,可以在上面做任何事情,比如說性能監控、SQL審計、用戶名密碼加密、日誌等等。
Druid內置提供了用於監控的StatFilter、日誌輸出的Log系列Filter、防禦SQL注入攻擊的WallFilter。
阿里巴巴內部實現了用於資料庫密碼加密的CirceFilter,以及和Web、Spring關聯監控的DragoonStatFilter。
第三,Druid集合了開源和商業資料庫連接池的優秀特性,並結合阿里巴巴大規模苛刻生產環境的使用經驗進行優化。
ExceptionSorter。當一個連接產生不可恢復的異常時,例如Oracle error_code_28 session has been killed,必須立刻從連接池中逐出,否則會產生大量錯誤。只有Druid和JBoss DataSource實現了ExceptionSorter。
PSCache內存佔用優化對於支持游標的資料庫(Oracle、SQL Server、DB2等,不包括MySql),PSCache可以大幅度提升SQL執行性能。一個PreparedStatement對應伺服器一個游標,如果PreparedStatement被緩存起來重復執行,PreparedStatement沒有被關閉,伺服器端的游標就不會被關閉,性能提高非常顯著。在類似「SELECT * FROM T WHERE ID = ?」這樣的場景,性能可能是一個數量級的提升。但在Oracle JDBC Driver中,其他的資料庫連接池(DBCP、JBossDataSource)會佔用內存過多,極端情況可能大於1G。Druid調用OracleDriver提供管理PSCache內部API。
LRU是一個性能關鍵指標,特別Oracle,每個Connection對應資料庫端的一個進程,如果資料庫連接池遵從LRU,有助於資料庫伺服器優化,這是重要的指標。Druid、DBCP、Proxool、JBoss是遵守LRU的。BoneCP、C3P0則不是。BoneCP在mock環境下性能可能還好,但在真實環境中則就不好了 。 Druid提供了MySql、Oracle、Postgresql、SQL-92的SQL的完整支持,這是一個手寫的高性能SQL Parser,支持Visitor模式,使得分析SQL的抽象語法樹很方便。
簡單SQL語句用時10微秒以內,復雜SQL用時30微秒。
通過Druid提供的SQL Parser可以在JDBC層攔截SQL做相應處理,比如說分庫分表、審計等。Druid防禦SQL注入攻擊的WallFilter就是通過Druid的SQL Parser分析語義實現的。 Druid提供Filter-Chain模式的插件框架,通過編寫Filter配置到DruidDataSource中就可以攔截JDBC的各種API,從而實現擴展。Druid提供了一系列內置Filter。
❸ druid sql監控 怎麼看
首先是過濾器filter的配置,在web.xml中添加如下配置,如圖:
選項配置結束之後,就是我們監控界面的路徑配置了,配置如下圖
Druid已經配置好,接著在瀏覽器中訪問,如圖所以:
輸入訪問地址後,進入Druid監控頁面,如圖所示:
此時,在瀏覽器中輸入需要監控系統頁面網址,然後點擊上個畫面中的「SQL監控」即可,此時就可以看到每個SQL語句所用的時間,如下圖所示:
❹ druid怎麼自定義sql防火牆規則
druid是阿里巴巴開發的為監控而生的資料庫連接池,可以非常直觀的看到當前應用的數據源、sql執行情況、sql防火牆、web應用、uri監控、spring介面調用監控等。
數據源配置:
<beanid="readAccount"class="com.alibaba.druid.pool.DruidDataSource"init-method="init"destroy-method="close">
<!--數據源驅動類可不寫,Druid默認會自動根據URL識別DriverClass-->
<propertyname="driverClassName"value="${jdbc_read.driver}"/>
<!--基本屬性url、user、password-->
<propertyname="url"value="${jdbc_read.url}"/>
<propertyname="username"value="${jdbc_read.username}"/>
<propertyname="password"value="${jdbc_read.password}"/>
<!--配置初始化大小、最小、最大-->
<propertyname="initialSize"value="${jdbc.pool.minIdle}"/>
<propertyname="minIdle"value="${jdbc.pool.minIdle}"/>
<propertyname="maxActive"value="${jdbc.pool.maxActive}"/>
<!--配置獲取連接等待超時的時間-->
<propertyname="maxWait"value="30000"/>
<!--配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒-->
<propertyname="timeBetweenEvictionRunsMillis"value="30000"/>
<!--配置一個連接在池中最小生存的時間,單位是毫秒-->
<propertyname="minEvictableIdleTimeMillis"value="90000"/>
<propertyname="validationQuery"value="SELECT'x'"/>
<propertyname="testWhileIdle"value="true"/>
<propertyname="testOnBorrow"value="false"/>
<propertyname="testOnReturn"value="false"/>
</bean>
開啟web監控:
在數據源配置中,增加以下屬性
<propertyname="filters"value="stat"/>
在web.xml中增加以下配置
<filter>
<filter-name>DruidWebStatFilter</filter-name>
<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
<init-param>
<param-name>exclusions</param-name>
<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>DruidWebStatFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
開啟sql防火牆:
在數據源配置中,增加以下屬性
<propertyname="filters"value="stat,wall"/>
開啟spring方法調用監控:
在spring配置文件中增加以下配置
<beanid="druid-stat-interceptor"class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor"></bean>
<beanid="druid-stat-pointcut"class="org.springframework.aop.support.JdkRegexpMethodPointcut"scope="prototype">
<propertyname="patterns">
<list>
<value>com.xxx.*</value>
<value>com.xxx1.*</value>
</list>
</property>
</bean>
<aop:config>
<aop:advisoradvice-ref="druid-stat-interceptor"pointcut-ref="druid-stat-pointcut"/>
</aop:config>
❺ druid 和my sql 的區別
MySqlStatementParser parser = new MySqlStatementParser(sql);
SQLStatement statement = parser.parseStatement();
MySqlInsertStatement insert = (MySqlInsertStatement)statement;
然後使用解析得到的 insert ,就可以獲得原始insert語句的各個部分:
List<SQLExpr> columns = insert.getColumns(); // 獲得所有列名
insert.getQuery(); // 如果是 insert into select 語句,則可以獲取 select查詢
如果是批量插入的insert:insert into tab(id,name) values(1,'a'),(2,'b'),(3,'c');
則可以使用:
List<ValuesClause> vcl = insert.getValuesList();
獲得素有的 values 子句部分。
非批量插入,則可以使用:
List<SQLExpr> valuse = insert.getValues().getValues();
獲得 values 子句。
on plicate 部分可以使用下面的語句獲取:
List<SQLExpr> dku = insert.getDuplicateKeyUpdate();
獲得了這些,就而已重組得到原始SQL語句,並且對其進行各種改寫。
❻ druid sql語句怎麼寫
INSERT INTO TABLE_NAME VALUES (); 插入值最好一條條插入
UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值; 這是更新值