❶ 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 列名称 = 某值; 这是更新值