当前位置: 首页 > news >正文

做企业网站建设挣钱吗seo外链优化策略

做企业网站建设挣钱吗,seo外链优化策略,电商网站设计的流程,网页动态设计软件相信使用MySQL的同学都配置过它的JDBC驱动,多数人会直接从哪里贴一段URL过来,然后稍作修改就上去了,对应的连接池配置也是一样的,很少有人会去细想这每一个参数都是什么含义。今天我们就来聊两个比较常见的配置——是否要开启auto…

相信使用MySQL的同学都配置过它的JDBC驱动,多数人会直接从哪里贴一段URL过来,然后稍作修改就上去了,对应的连接池配置也是一样的,很少有人会去细想这每一个参数都是什么含义。今天我们就来聊两个比较常见的配置——是否要开启autoReconnect和是否缓存PreparedStatement。


一、autoReconnect=true真的好用么?
笔者看到过很多MySQL的URL里都是这样写的,复制过来改改IP、端口和库名就能用了:


jdbc:mysql://xxx.xxx.xxx.xxx:3306/xxx?autoReconnect=true&...从字面上看挺好的,在连接断开后还会自动重连,加之MySQL有8小时自动断开连接的特性,在断开后连接会重连,多好的功能呀。但是如果你去阅读一下MySQL Connect/J开发手册的相关章节,就会看到官方是这么说明的:


The use of this feature is not recommended, because it has side effects related to session state and data consistency when applications don't handle SQLExceptions properly, and is only designed to be used when you are unable to configure your application to handle SQLExceptions resulting from dead and stale connections properly. 


简单来说,不推荐开启这个特性,因为有副作用,在没有正确处理SQLException时容易造成会话状态和数据一致性的问题。


一般的应用都会使用数据库连接池,那我们的连接池是否正确地处理了抛出的SQLException呢?抱着这个疑问,我们来看看阿里的Druid连接池是怎么处理的。


首先,通过设置合理的健康检查及连接存活时间能解决大部分问题;其次,它有针对特定异常的处理逻辑,在MySqlExceptionSorter中会对特定返回码、异常类(比如com.mysql.jdbc.CommunicationsException和com.mysql.jdbc.exceptions.jdbc4.CommunicationsException)以及错误消息进行处理,如果是致命错误就把连接抛弃。也就是说,如果用了Druid,不管是否设置了autoReconnect,都能保证后续请求的正确处理。JBoss的连接池实现也有类似的特性。


二、MySQL是否真的不用打开PSCache?
一般在设置连接池时,都会有类似下面的设置:

<property name="poolPreparedStatements" value="true" />
<property name="maxPoolPreparedStatementPerConnectionSize" value="20" />

很多文章上都说PSCache对使用游标的数据库有巨大的性能提升,但MySQL不建议开启,因为它不支持游标。所以很多人在用MySQL时,都会将poolPreparedStatements设置为false,就连Druid的文档上也是这么写的。


但事实真的是这样么,MySQL使用PSCache真的对性能没有提升么?


先来看看关于游标的问题,其实大部分文章的表述不太准确,现在的MySQL在存储过程里是支持游标的,但其他地方的确不支持,具体详见官方手册(MySQL supports cursors inside stored programs.)。但这并不是我们要讨论的关键。


3.1.0版本后的JDBC驱动里有一个参数是useServerPrepStmts,如果服务器支持的话,会开启服务端PreparedStatement,默认是false。官方手册中有如下说明:


Server-side Prepared Statements - Connector/J 3.1 will automatically detect and use server-side prepared statements when they are available (MySQL server version 4.1.0 and newer).


也就是说在MySQL 4.1.0版本后,3.1.0以上的驱动会检测到支持服务端PreparedStatement,并且启用该特性。根据MySQLTUTORIAL上的说明,整个过程分为PREPARE、EXECUTE和DEALLOCATE PREPARE三步。MySQL JDBC驱动的Contributor Jess Balint在StackOverflow上做了一个详细的说明,《High-Performance Java Persistence》的作者也专门撰写文章分析了两者的区别。

ps=conn.prepareStatement("select ?")
ps.setInt(1, 42)
ps.executeQuery()
ps.setInt(1, 43)
ps.executeQuery()


上述代码在使用客户端PreparedStatement时,MySQL日志里看到的是:

255 Query  select 42
255 Query  select 43 


如果用的是服务端PreparedStatement,看到的则是(实际每次执行只会传占位符的值,语句是不传的):

254 Prepare    select ?
254 Execute    select 42
254 Execute    select 43


在整个使用过程中,Prepare只会做一次,在这时服务端会对语句进行解析,后续收到具体值时会优化执行计划。如果同一条语句每次都新建PreparedStatement,那么每次都会多一回网络交互和语句解析,这显然是可以优化的。


综上所述,现在在使用MySQL时(如果版本比较新的话),出于性能考虑,应该在数据库连接池上开启针对PreparedStatement的缓存。如果没有使用连接池,或者所用的连接池不支持PSCache,也可以在JDBC连接上设置cachePrepStmts=true。


事实上,MySQL的JDBC驱动还有不少针对性能的优化,比如设置useConfigs=maxPerformance(请酌情使用),相当于同时做了如下设置:

cachePrepStmts=true
cacheCallableStmts=true
cacheServerConfiguration=true
useLocalSessionState=true
elideSetAutoCommits=true
alwaysSendSetIsolation=false
enableQueryTimeouts=false

各位同学,是时候检视一下自己的系统是如何连接MySQL的了,时代在发展,有些以前适用的配置也许就不再合适了。
http://www.lbrq.cn/news/2476045.html

相关文章:

  • 网站开发高级工程师专业网络推广是什么意思
  • 焦作网站建设哪家正规本地建站软件有哪些
  • 度娘网站灯笼要咋做呢百度网络科技有限公司
  • 做盗版电影网站犯法不如何实施网站推广
  • 菠菜网站如何做推广百度指数三个功能模块
  • 欧美网站建设风格特点查域名注册详细信息查询
  • 3g网站制作优化seo系统
  • 连云港建设部网站深圳企业网站制作公司
  • 网站开发分包seo的搜索排名影响因素有哪些
  • 推荐一个做照片书的网站搜索引擎营销的英文缩写
  • 个人网站可以做论坛么拉新推广平台有哪些
  • frontpage新建网站百度图片搜索引擎入口
  • 企业网站申请流程域名注册后如何建网站
  • 租个网站服务器多少钱西安seo按天收费
  • 做双语网站用什么cms系统好东莞网站seo推广
  • 专门做澳大利亚项目的网站搜客
  • 唐山网站设计如何优化百度seo排名
  • 推荐网站建设话术微信seo什么意思
  • 飞飞cms悠悠电影网站网站seo外链建设
  • 怎么做服务网站可以搜任何网站的浏览器
  • 大网站怎样选域名自动外链
  • 网上客服河南网站优化公司
  • 网站悬浮窗代码江苏网页定制
  • 贸易公司做网站有用吗软件开发
  • 网站服务器ipv6九幺seo优化神器
  • 渭南网站制作网站建设网络营销
  • led外贸网站建设seo搜索引擎优化课程
  • 公司网站建设费维护费会计分录谷歌seo关键词优化
  • 重庆未来科技网站建设网站推广应该坚持什么策略
  • 免费企业营销网站制作百度搜索引擎营销
  • 根本是什么
  • 智慧水库管理平台数据清洗实施方案
  • # JsSIP 从入门到实战:构建你的第一个 Web 电话
  • 推荐系统(第三课第二周)
  • Android Studio 提示信息 ‘equals(““)‘ can be replaced with ‘isEmpty()‘
  • Go语言unsafe包深度解析