• 关于 html设置为只读 的搜索结果

问题

用户指南-读写分离-开通读写分离

李沃晟 2019-12-01 21:38:39 588 浏览量 回答数 0

问题

阿里云推出RDS只读实例 分担数据库读写压力

bendchen 2019-12-01 21:09:05 11157 浏览量 回答数 3

问题

用户指南-读写分离-读写分离简介

李沃晟 2019-12-01 21:38:38 697 浏览量 回答数 0

新用户福利专场,云服务器ECS低至102元/年

新用户专场,1核2G 102元/年起,2核4G 699.8元/年起

回答

您好,看了这个帮助说明,估计不能对数据表进行权限设置喔,仅能在RDS控制台里对账户设置为“读写”及“只读”类型喔。不提供在命令行创建数据库和账号的权限,无grant权限。请参考:《SQL Server实例的一般限制》,https://help.aliyun.com/document_detail/rds/getting-started/RDS-MSSQLManual/RDS-limitation.html

dongshan8 2019-12-02 01:32:43 0 浏览量 回答数 0

回答

  提示文件系统错误,是应为设置为自动加载文件系统,文件系统格式化了,信息对应不起来;把fstab里的自动加载去掉就行了;fstab为只读文件,修改它权限就行了(chmod),更改fstab后再把权限改回来;###### 引用来自#2楼“divl”的帖子   提示文件系统错误,是应为设置为自动加载文件系统,文件系统格式化了,信息对应不起来;把fstab里的自动加载去掉就行了;fstab为只读文件,修改它权限就行了(chmod),更改fstab后再把权限改回来; 修改时提示can't open swap file for "fstab" ,recovery  impossible  是什么问题啊###### 一个系统装两个不同的linux,建议还是用虚拟机吧,别这么折腾自己了###### 引用来自#4楼“鉴客”的帖子 一个系统装两个不同的linux,建议还是用虚拟机吧,别这么折腾自己了 红帽还不会用,正在学习,5月要考ct,所以……###### 引用来自#5楼“无创洪”的帖子 引用来自#4楼“鉴客”的帖子 一个系统装两个不同的linux,建议还是用虚拟机吧,别这么折腾自己了 红帽还不会用,正在学习,5月要考ct,所以…… 那很简单啊,直接在 ubuntu 上装一个虚拟机,例如 VirtualBox ,然后再装红帽Linux###### 红帽的考试平台是在物理机上的,有些命令虚拟机不能用######瞎说 虚拟机上装系统跟真正没任何区###### 引用来自#3楼“无创洪”的帖子 引用来自#2楼“divl”的帖子   提示文件系统错误,是应为设置为自动加载文件系统,文件系统格式化了,信息对应不起来;把fstab里的自动加载去掉就行了;fstab为只读文件,修改它权限就行了(chmod),更改fstab后再把权限改回来; 修改时提示can't open swap file for "fstab" ,recovery  impossible  是什么问题啊 把selinux关了,或者更改selinux的设置###### 引用来自#9楼“divl”的帖子 引用来自#3楼“无创洪”的帖子 引用来自#2楼“divl”的帖子   提示文件系统错误,是应为设置为自动加载文件系统,文件系统格式化了,信息对应不起来;把fstab里的自动加载去掉就行了;fstab为只读文件,修改它权限就行了(chmod),更改fstab后再把权限改回来; 修改时提示can't open swap file for "fstab" ,recovery  impossible  是什么问题啊 把selinux关了,或者更改selinux的设置 可以看看这个帖子http://bbs.chinaunix.net/thread-1919145-1-1.html###### 终于搞定了非常感谢div1 ,也感谢参加回答的各位

kun坤 2020-06-06 14:32:22 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档注意事项: 以下文件和文件夹均可直接删除,如需用到文件夹需要的功能,新建同名的目录即可。 Linux 主机上传网页文件时应注意以下几点:  请您将网页上传到 /htdocs 目录下。此目录是您网站的根目录,如果是 cgi 的网页程序,请上传到 /cgi-bin 目录下。 网站的默认首页文件名:index.htm、index.html、index.php 。一般虚拟主机开通后,/htdocs目录中存在两个首页文件,一个是系统默认的index.html,一个是您自己上传的index.htm。由于前者的优先级比后者高,因此访问时显示前者的页面。这种情况您可以登录 主机管理控制台 > 基础环境设置 > 默认首页设置,自行修改设定。 请不要随意更改主机的默认配置或删除 /htdocs、/cgi-bin 、/wwwlogs 等默认配置文件及目录,否则会直接影响您对网站的访问和管理。 由于 Linux 主机的文件名是区分大小写的,文件命名需要规范,注意大小写,建议小写,不要使用汉字,最好用字母,数字或者带下划线,请注意文件名及目录路径的书写。 如果出现文件上传了,可是文件大小为零 这种情况,说明您的空间已满,请您清理站点文件或者加购空间。  本路径下各文件夹功能和权限说明: / :   您FTP的根目录,为避免您错误删除该路径下的内容,所以禁止写入,只可读取。 htdocs/:您网站的根目录,请将您的网站(php, htm, html, css, js等)上传至此文件夹。 cgi-bin/:请将您的CGI脚本(如 perl脚本)上传至此文件夹。 myfolder/:此文件夹中的内容不会被web用户看到,您可以临时存放一些不愿公开的内容,比如站点备份、数据库备份等。 ftplogs/:您的ftp访问日志存放位置,只读。 wwwlogs/:您的www访问日志存放位置,只读。 backup/:系统自动为您生成的数据库备份的存放位置,只读。   Windows主机上传网页文件时应注意以下几点: 如果您是使用了 ACCESS 数据库,目前虚拟主机不再支持通过 OBDC 方式调用数据库,建议您通过 Access OLE DB方式调用Access数据库,直接从您本地将 Access 数据库连同其它网页文件一起上传即可。 网站的默认首页文件名:index.htm、index.html、index.asp、default.asp、default.htm、default.html。一般虚拟主机开通后,根目录中存在两个首页文件,一个是系统默认的 index.html,一个是您自己上传的 index.htm,由于前者的优先级比后者高,因此访问时显示前者的页面。这种情况您可以登录 主机管理控制台 > 基础环境设置 > 默认首页设置,自行修改设定。 建议不要使用汉字命名目录及文件。   本路径下各文件夹功能和权限说明: CGI-BIN:放置CGI程序使用,如果无CGI程序。 HttpErrors:放置404错误页面,如无自定义404页面要求。 images:万网默认首页的图片文件夹。 css:万网默认首页的样式文件夹。 zhuye.html:万网站点初始默认页面。       如果问题还未能解决,请联系售后技术支持。    

2019-12-01 23:19:20 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档注意事项: 以下文件和文件夹均可直接删除,如需用到文件夹需要的功能,新建同名的目录即可。 Linux 主机上传网页文件时应注意以下几点:  请您将网页上传到 /htdocs 目录下。此目录是您网站的根目录,如果是 cgi 的网页程序,请上传到 /cgi-bin 目录下。 网站的默认首页文件名:index.htm、index.html、index.php 。一般虚拟主机开通后,/htdocs目录中存在两个首页文件,一个是系统默认的index.html,一个是您自己上传的index.htm。由于前者的优先级比后者高,因此访问时显示前者的页面。这种情况您可以登录 主机管理控制台 > 基础环境设置 > 默认首页设置,自行修改设定。 请不要随意更改主机的默认配置或删除 /htdocs、/cgi-bin 、/wwwlogs 等默认配置文件及目录,否则会直接影响您对网站的访问和管理。 由于 Linux 主机的文件名是区分大小写的,文件命名需要规范,注意大小写,建议小写,不要使用汉字,最好用字母,数字或者带下划线,请注意文件名及目录路径的书写。 如果出现文件上传了,可是文件大小为零 这种情况,说明您的空间已满,请您清理站点文件或者加购空间。  本路径下各文件夹功能和权限说明: / :   您FTP的根目录,为避免您错误删除该路径下的内容,所以禁止写入,只可读取。 htdocs/:您网站的根目录,请将您的网站(php, htm, html, css, js等)上传至此文件夹。 cgi-bin/:请将您的CGI脚本(如 perl脚本)上传至此文件夹。 myfolder/:此文件夹中的内容不会被web用户看到,您可以临时存放一些不愿公开的内容,比如站点备份、数据库备份等。 ftplogs/:您的ftp访问日志存放位置,只读。 wwwlogs/:您的www访问日志存放位置,只读。 backup/:系统自动为您生成的数据库备份的存放位置,只读。   Windows主机上传网页文件时应注意以下几点: 如果您是使用了 ACCESS 数据库,目前虚拟主机不再支持通过 OBDC 方式调用数据库,建议您通过 Access OLE DB方式调用Access数据库,直接从您本地将 Access 数据库连同其它网页文件一起上传即可。 网站的默认首页文件名:index.htm、index.html、index.asp、default.asp、default.htm、default.html。一般虚拟主机开通后,根目录中存在两个首页文件,一个是系统默认的 index.html,一个是您自己上传的 index.htm,由于前者的优先级比后者高,因此访问时显示前者的页面。这种情况您可以登录 主机管理控制台 > 基础环境设置 > 默认首页设置,自行修改设定。 建议不要使用汉字命名目录及文件。   本路径下各文件夹功能和权限说明: CGI-BIN:放置CGI程序使用,如果无CGI程序。 HttpErrors:放置404错误页面,如无自定义404页面要求。 images:万网默认首页的图片文件夹。 css:万网默认首页的样式文件夹。 zhuye.html:万网站点初始默认页面。       如果问题还未能解决,请联系售后技术支持。    

2019-12-01 23:19:20 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档注意事项: 以下文件和文件夹均可直接删除,如需用到文件夹需要的功能,新建同名的目录即可。 Linux 主机上传网页文件时应注意以下几点:  请您将网页上传到 /htdocs 目录下。此目录是您网站的根目录,如果是 cgi 的网页程序,请上传到 /cgi-bin 目录下。 网站的默认首页文件名:index.htm、index.html、index.php 。一般虚拟主机开通后,/htdocs目录中存在两个首页文件,一个是系统默认的index.html,一个是您自己上传的index.htm。由于前者的优先级比后者高,因此访问时显示前者的页面。这种情况您可以登录 主机管理控制台 > 基础环境设置 > 默认首页设置,自行修改设定。 请不要随意更改主机的默认配置或删除 /htdocs、/cgi-bin 、/wwwlogs 等默认配置文件及目录,否则会直接影响您对网站的访问和管理。 由于 Linux 主机的文件名是区分大小写的,文件命名需要规范,注意大小写,建议小写,不要使用汉字,最好用字母,数字或者带下划线,请注意文件名及目录路径的书写。 如果出现文件上传了,可是文件大小为零 这种情况,说明您的空间已满,请您清理站点文件或者加购空间。  本路径下各文件夹功能和权限说明: / :   您FTP的根目录,为避免您错误删除该路径下的内容,所以禁止写入,只可读取。 htdocs/:您网站的根目录,请将您的网站(php, htm, html, css, js等)上传至此文件夹。 cgi-bin/:请将您的CGI脚本(如 perl脚本)上传至此文件夹。 myfolder/:此文件夹中的内容不会被web用户看到,您可以临时存放一些不愿公开的内容,比如站点备份、数据库备份等。 ftplogs/:您的ftp访问日志存放位置,只读。 wwwlogs/:您的www访问日志存放位置,只读。 backup/:系统自动为您生成的数据库备份的存放位置,只读。   Windows主机上传网页文件时应注意以下几点: 如果您是使用了 ACCESS 数据库,目前虚拟主机不再支持通过 OBDC 方式调用数据库,建议您通过 Access OLE DB方式调用Access数据库,直接从您本地将 Access 数据库连同其它网页文件一起上传即可。 网站的默认首页文件名:index.htm、index.html、index.asp、default.asp、default.htm、default.html。一般虚拟主机开通后,根目录中存在两个首页文件,一个是系统默认的 index.html,一个是您自己上传的 index.htm,由于前者的优先级比后者高,因此访问时显示前者的页面。这种情况您可以登录 主机管理控制台 > 基础环境设置 > 默认首页设置,自行修改设定。 建议不要使用汉字命名目录及文件。   本路径下各文件夹功能和权限说明: CGI-BIN:放置CGI程序使用,如果无CGI程序。 HttpErrors:放置404错误页面,如无自定义404页面要求。 images:万网默认首页的图片文件夹。 css:万网默认首页的样式文件夹。 zhuye.html:万网站点初始默认页面。       如果问题还未能解决,请联系售后技术支持。    

2019-12-01 23:19:21 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档注意事项: 以下文件和文件夹均可直接删除,如需用到文件夹需要的功能,新建同名的目录即可。 Linux 主机上传网页文件时应注意以下几点:  请您将网页上传到 /htdocs 目录下。此目录是您网站的根目录,如果是 cgi 的网页程序,请上传到 /cgi-bin 目录下。 网站的默认首页文件名:index.htm、index.html、index.php 。一般虚拟主机开通后,/htdocs目录中存在两个首页文件,一个是系统默认的index.html,一个是您自己上传的index.htm。由于前者的优先级比后者高,因此访问时显示前者的页面。这种情况您可以登录 主机管理控制台 > 基础环境设置 > 默认首页设置,自行修改设定。 请不要随意更改主机的默认配置或删除 /htdocs、/cgi-bin 、/wwwlogs 等默认配置文件及目录,否则会直接影响您对网站的访问和管理。 由于 Linux 主机的文件名是区分大小写的,文件命名需要规范,注意大小写,建议小写,不要使用汉字,最好用字母,数字或者带下划线,请注意文件名及目录路径的书写。 如果出现文件上传了,可是文件大小为零 这种情况,说明您的空间已满,请您清理站点文件或者加购空间。  本路径下各文件夹功能和权限说明: / :   您FTP的根目录,为避免您错误删除该路径下的内容,所以禁止写入,只可读取。 htdocs/:您网站的根目录,请将您的网站(php, htm, html, css, js等)上传至此文件夹。 cgi-bin/:请将您的CGI脚本(如 perl脚本)上传至此文件夹。 myfolder/:此文件夹中的内容不会被web用户看到,您可以临时存放一些不愿公开的内容,比如站点备份、数据库备份等。 ftplogs/:您的ftp访问日志存放位置,只读。 wwwlogs/:您的www访问日志存放位置,只读。 backup/:系统自动为您生成的数据库备份的存放位置,只读。   Windows主机上传网页文件时应注意以下几点: 如果您是使用了 ACCESS 数据库,目前虚拟主机不再支持通过 OBDC 方式调用数据库,建议您通过 Access OLE DB方式调用Access数据库,直接从您本地将 Access 数据库连同其它网页文件一起上传即可。 网站的默认首页文件名:index.htm、index.html、index.asp、default.asp、default.htm、default.html。一般虚拟主机开通后,根目录中存在两个首页文件,一个是系统默认的 index.html,一个是您自己上传的 index.htm,由于前者的优先级比后者高,因此访问时显示前者的页面。这种情况您可以登录 主机管理控制台 > 基础环境设置 > 默认首页设置,自行修改设定。 建议不要使用汉字命名目录及文件。   本路径下各文件夹功能和权限说明: CGI-BIN:放置CGI程序使用,如果无CGI程序。 HttpErrors:放置404错误页面,如无自定义404页面要求。 images:万网默认首页的图片文件夹。 css:万网默认首页的样式文件夹。 zhuye.html:万网站点初始默认页面。       如果问题还未能解决,请联系售后技术支持。    

2019-12-01 23:19:21 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档注意事项: 以下文件和文件夹均可直接删除,如需用到文件夹需要的功能,新建同名的目录即可。 Linux 主机上传网页文件时应注意以下几点:  请您将网页上传到 /htdocs 目录下。此目录是您网站的根目录,如果是 cgi 的网页程序,请上传到 /cgi-bin 目录下。 网站的默认首页文件名:index.htm、index.html、index.php 。一般虚拟主机开通后,/htdocs目录中存在两个首页文件,一个是系统默认的index.html,一个是您自己上传的index.htm。由于前者的优先级比后者高,因此访问时显示前者的页面。这种情况您可以登录 主机管理控制台 > 基础环境设置 > 默认首页设置,自行修改设定。 请不要随意更改主机的默认配置或删除 /htdocs、/cgi-bin 、/wwwlogs 等默认配置文件及目录,否则会直接影响您对网站的访问和管理。 由于 Linux 主机的文件名是区分大小写的,文件命名需要规范,注意大小写,建议小写,不要使用汉字,最好用字母,数字或者带下划线,请注意文件名及目录路径的书写。 如果出现文件上传了,可是文件大小为零 这种情况,说明您的空间已满,请您清理站点文件或者加购空间。  本路径下各文件夹功能和权限说明: / :   您FTP的根目录,为避免您错误删除该路径下的内容,所以禁止写入,只可读取。 htdocs/:您网站的根目录,请将您的网站(php, htm, html, css, js等)上传至此文件夹。 cgi-bin/:请将您的CGI脚本(如 perl脚本)上传至此文件夹。 myfolder/:此文件夹中的内容不会被web用户看到,您可以临时存放一些不愿公开的内容,比如站点备份、数据库备份等。 ftplogs/:您的ftp访问日志存放位置,只读。 wwwlogs/:您的www访问日志存放位置,只读。 backup/:系统自动为您生成的数据库备份的存放位置,只读。   Windows主机上传网页文件时应注意以下几点: 如果您是使用了 ACCESS 数据库,目前虚拟主机不再支持通过 OBDC 方式调用数据库,建议您通过 Access OLE DB方式调用Access数据库,直接从您本地将 Access 数据库连同其它网页文件一起上传即可。 网站的默认首页文件名:index.htm、index.html、index.asp、default.asp、default.htm、default.html。一般虚拟主机开通后,根目录中存在两个首页文件,一个是系统默认的 index.html,一个是您自己上传的 index.htm,由于前者的优先级比后者高,因此访问时显示前者的页面。这种情况您可以登录 主机管理控制台 > 基础环境设置 > 默认首页设置,自行修改设定。 建议不要使用汉字命名目录及文件。   本路径下各文件夹功能和权限说明: CGI-BIN:放置CGI程序使用,如果无CGI程序。 HttpErrors:放置404错误页面,如无自定义404页面要求。 images:万网默认首页的图片文件夹。 css:万网默认首页的样式文件夹。 zhuye.html:万网站点初始默认页面。       如果问题还未能解决,请联系售后技术支持。    

2019-12-01 23:19:20 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档注意事项: 以下文件和文件夹均可直接删除,如需用到文件夹需要的功能,新建同名的目录即可。 Linux 主机上传网页文件时应注意以下几点:  请您将网页上传到 /htdocs 目录下。此目录是您网站的根目录,如果是 cgi 的网页程序,请上传到 /cgi-bin 目录下。 网站的默认首页文件名:index.htm、index.html、index.php 。一般虚拟主机开通后,/htdocs目录中存在两个首页文件,一个是系统默认的index.html,一个是您自己上传的index.htm。由于前者的优先级比后者高,因此访问时显示前者的页面。这种情况您可以登录 主机管理控制台 > 基础环境设置 > 默认首页设置,自行修改设定。 请不要随意更改主机的默认配置或删除 /htdocs、/cgi-bin 、/wwwlogs 等默认配置文件及目录,否则会直接影响您对网站的访问和管理。 由于 Linux 主机的文件名是区分大小写的,文件命名需要规范,注意大小写,建议小写,不要使用汉字,最好用字母,数字或者带下划线,请注意文件名及目录路径的书写。 如果出现文件上传了,可是文件大小为零 这种情况,说明您的空间已满,请您清理站点文件或者加购空间。  本路径下各文件夹功能和权限说明: / :   您FTP的根目录,为避免您错误删除该路径下的内容,所以禁止写入,只可读取。 htdocs/:您网站的根目录,请将您的网站(php, htm, html, css, js等)上传至此文件夹。 cgi-bin/:请将您的CGI脚本(如 perl脚本)上传至此文件夹。 myfolder/:此文件夹中的内容不会被web用户看到,您可以临时存放一些不愿公开的内容,比如站点备份、数据库备份等。 ftplogs/:您的ftp访问日志存放位置,只读。 wwwlogs/:您的www访问日志存放位置,只读。 backup/:系统自动为您生成的数据库备份的存放位置,只读。   Windows主机上传网页文件时应注意以下几点: 如果您是使用了 ACCESS 数据库,目前虚拟主机不再支持通过 OBDC 方式调用数据库,建议您通过 Access OLE DB方式调用Access数据库,直接从您本地将 Access 数据库连同其它网页文件一起上传即可。 网站的默认首页文件名:index.htm、index.html、index.asp、default.asp、default.htm、default.html。一般虚拟主机开通后,根目录中存在两个首页文件,一个是系统默认的 index.html,一个是您自己上传的 index.htm,由于前者的优先级比后者高,因此访问时显示前者的页面。这种情况您可以登录 主机管理控制台 > 基础环境设置 > 默认首页设置,自行修改设定。 建议不要使用汉字命名目录及文件。   本路径下各文件夹功能和权限说明: CGI-BIN:放置CGI程序使用,如果无CGI程序。 HttpErrors:放置404错误页面,如无自定义404页面要求。 images:万网默认首页的图片文件夹。 css:万网默认首页的样式文件夹。 zhuye.html:万网站点初始默认页面。       如果问题还未能解决,请联系售后技术支持。    

2019-12-01 23:19:21 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档注意事项: 以下文件和文件夹均可直接删除,如需用到文件夹需要的功能,新建同名的目录即可。 Linux 主机上传网页文件时应注意以下几点:  请您将网页上传到 /htdocs 目录下。此目录是您网站的根目录,如果是 cgi 的网页程序,请上传到 /cgi-bin 目录下。 网站的默认首页文件名:index.htm、index.html、index.php 。一般虚拟主机开通后,/htdocs目录中存在两个首页文件,一个是系统默认的index.html,一个是您自己上传的index.htm。由于前者的优先级比后者高,因此访问时显示前者的页面。这种情况您可以登录 主机管理控制台 > 基础环境设置 > 默认首页设置,自行修改设定。 请不要随意更改主机的默认配置或删除 /htdocs、/cgi-bin 、/wwwlogs 等默认配置文件及目录,否则会直接影响您对网站的访问和管理。 由于 Linux 主机的文件名是区分大小写的,文件命名需要规范,注意大小写,建议小写,不要使用汉字,最好用字母,数字或者带下划线,请注意文件名及目录路径的书写。 如果出现文件上传了,可是文件大小为零 这种情况,说明您的空间已满,请您清理站点文件或者加购空间。  本路径下各文件夹功能和权限说明: / :   您FTP的根目录,为避免您错误删除该路径下的内容,所以禁止写入,只可读取。 htdocs/:您网站的根目录,请将您的网站(php, htm, html, css, js等)上传至此文件夹。 cgi-bin/:请将您的CGI脚本(如 perl脚本)上传至此文件夹。 myfolder/:此文件夹中的内容不会被web用户看到,您可以临时存放一些不愿公开的内容,比如站点备份、数据库备份等。 ftplogs/:您的ftp访问日志存放位置,只读。 wwwlogs/:您的www访问日志存放位置,只读。 backup/:系统自动为您生成的数据库备份的存放位置,只读。   Windows主机上传网页文件时应注意以下几点: 如果您是使用了 ACCESS 数据库,目前虚拟主机不再支持通过 OBDC 方式调用数据库,建议您通过 Access OLE DB方式调用Access数据库,直接从您本地将 Access 数据库连同其它网页文件一起上传即可。 网站的默认首页文件名:index.htm、index.html、index.asp、default.asp、default.htm、default.html。一般虚拟主机开通后,根目录中存在两个首页文件,一个是系统默认的 index.html,一个是您自己上传的 index.htm,由于前者的优先级比后者高,因此访问时显示前者的页面。这种情况您可以登录 主机管理控制台 > 基础环境设置 > 默认首页设置,自行修改设定。 建议不要使用汉字命名目录及文件。   本路径下各文件夹功能和权限说明: CGI-BIN:放置CGI程序使用,如果无CGI程序。 HttpErrors:放置404错误页面,如无自定义404页面要求。 images:万网默认首页的图片文件夹。 css:万网默认首页的样式文件夹。 zhuye.html:万网站点初始默认页面。       如果问题还未能解决,请联系售后技术支持。    

2019-12-01 23:19:21 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档注意事项: 以下文件和文件夹均可直接删除,如需用到文件夹需要的功能,新建同名的目录即可。 Linux 主机上传网页文件时应注意以下几点:  请您将网页上传到 /htdocs 目录下。此目录是您网站的根目录,如果是 cgi 的网页程序,请上传到 /cgi-bin 目录下。 网站的默认首页文件名:index.htm、index.html、index.php 。一般虚拟主机开通后,/htdocs目录中存在两个首页文件,一个是系统默认的index.html,一个是您自己上传的index.htm。由于前者的优先级比后者高,因此访问时显示前者的页面。这种情况您可以登录 主机管理控制台 > 基础环境设置 > 默认首页设置,自行修改设定。 请不要随意更改主机的默认配置或删除 /htdocs、/cgi-bin 、/wwwlogs 等默认配置文件及目录,否则会直接影响您对网站的访问和管理。 由于 Linux 主机的文件名是区分大小写的,文件命名需要规范,注意大小写,建议小写,不要使用汉字,最好用字母,数字或者带下划线,请注意文件名及目录路径的书写。 如果出现文件上传了,可是文件大小为零 这种情况,说明您的空间已满,请您清理站点文件或者加购空间。  本路径下各文件夹功能和权限说明: / :   您FTP的根目录,为避免您错误删除该路径下的内容,所以禁止写入,只可读取。 htdocs/:您网站的根目录,请将您的网站(php, htm, html, css, js等)上传至此文件夹。 cgi-bin/:请将您的CGI脚本(如 perl脚本)上传至此文件夹。 myfolder/:此文件夹中的内容不会被web用户看到,您可以临时存放一些不愿公开的内容,比如站点备份、数据库备份等。 ftplogs/:您的ftp访问日志存放位置,只读。 wwwlogs/:您的www访问日志存放位置,只读。 backup/:系统自动为您生成的数据库备份的存放位置,只读。   Windows主机上传网页文件时应注意以下几点: 如果您是使用了 ACCESS 数据库,目前虚拟主机不再支持通过 OBDC 方式调用数据库,建议您通过 Access OLE DB方式调用Access数据库,直接从您本地将 Access 数据库连同其它网页文件一起上传即可。 网站的默认首页文件名:index.htm、index.html、index.asp、default.asp、default.htm、default.html。一般虚拟主机开通后,根目录中存在两个首页文件,一个是系统默认的 index.html,一个是您自己上传的 index.htm,由于前者的优先级比后者高,因此访问时显示前者的页面。这种情况您可以登录 主机管理控制台 > 基础环境设置 > 默认首页设置,自行修改设定。 建议不要使用汉字命名目录及文件。   本路径下各文件夹功能和权限说明: CGI-BIN:放置CGI程序使用,如果无CGI程序。 HttpErrors:放置404错误页面,如无自定义404页面要求。 images:万网默认首页的图片文件夹。 css:万网默认首页的样式文件夹。 zhuye.html:万网站点初始默认页面。       如果问题还未能解决,请联系售后技术支持。    

2019-12-01 23:19:20 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档注意事项: 以下文件和文件夹均可直接删除,如需用到文件夹需要的功能,新建同名的目录即可。 Linux 主机上传网页文件时应注意以下几点:  请您将网页上传到 /htdocs 目录下。此目录是您网站的根目录,如果是 cgi 的网页程序,请上传到 /cgi-bin 目录下。 网站的默认首页文件名:index.htm、index.html、index.php 。一般虚拟主机开通后,/htdocs目录中存在两个首页文件,一个是系统默认的index.html,一个是您自己上传的index.htm。由于前者的优先级比后者高,因此访问时显示前者的页面。这种情况您可以登录 主机管理控制台 > 基础环境设置 > 默认首页设置,自行修改设定。 请不要随意更改主机的默认配置或删除 /htdocs、/cgi-bin 、/wwwlogs 等默认配置文件及目录,否则会直接影响您对网站的访问和管理。 由于 Linux 主机的文件名是区分大小写的,文件命名需要规范,注意大小写,建议小写,不要使用汉字,最好用字母,数字或者带下划线,请注意文件名及目录路径的书写。 如果出现文件上传了,可是文件大小为零 这种情况,说明您的空间已满,请您清理站点文件或者加购空间。  本路径下各文件夹功能和权限说明: / :   您FTP的根目录,为避免您错误删除该路径下的内容,所以禁止写入,只可读取。 htdocs/:您网站的根目录,请将您的网站(php, htm, html, css, js等)上传至此文件夹。 cgi-bin/:请将您的CGI脚本(如 perl脚本)上传至此文件夹。 myfolder/:此文件夹中的内容不会被web用户看到,您可以临时存放一些不愿公开的内容,比如站点备份、数据库备份等。 ftplogs/:您的ftp访问日志存放位置,只读。 wwwlogs/:您的www访问日志存放位置,只读。 backup/:系统自动为您生成的数据库备份的存放位置,只读。   Windows主机上传网页文件时应注意以下几点: 如果您是使用了 ACCESS 数据库,目前虚拟主机不再支持通过 OBDC 方式调用数据库,建议您通过 Access OLE DB方式调用Access数据库,直接从您本地将 Access 数据库连同其它网页文件一起上传即可。 网站的默认首页文件名:index.htm、index.html、index.asp、default.asp、default.htm、default.html。一般虚拟主机开通后,根目录中存在两个首页文件,一个是系统默认的 index.html,一个是您自己上传的 index.htm,由于前者的优先级比后者高,因此访问时显示前者的页面。这种情况您可以登录 主机管理控制台 > 基础环境设置 > 默认首页设置,自行修改设定。 建议不要使用汉字命名目录及文件。   本路径下各文件夹功能和权限说明: CGI-BIN:放置CGI程序使用,如果无CGI程序。 HttpErrors:放置404错误页面,如无自定义404页面要求。 images:万网默认首页的图片文件夹。 css:万网默认首页的样式文件夹。 zhuye.html:万网站点初始默认页面。       如果问题还未能解决,请联系售后技术支持。    

2019-12-01 23:19:21 0 浏览量 回答数 0

回答

Re新手求助 注意事项: 以下文件和文件夹均可直接删除,如需用到文件夹需要的功能,新建同名的目录即可。 Linux 主机上传网页文件时应注意以下几点: 请您将网页上传到 /htdocs 目录下。此目录是您网站的根目录,如果是 cgi 的网页程序,请上传到 /cgi-bin 目录下。 网站的默认首页文件名:index.htm、index.html、index.php 。一般虚拟主机开通后,/htdocs目录中存在两个首页文件,一个是系统默认的index.html,一个是您自己上传的index.htm。由于前者的优先级比后者高,因此访问时显示前者的页面。这种情况您可以登录 主机管理控制台 > 基础环境设置 > 默认首页设置,自行修改设定。 请不要随意更改主机的默认配置或删除 /htdocs、/cgi-bin 、/wwwlogs 等默认配置文件及目录,否则会直接影响您对网站的访问和管理。 由于 Linux 主机的文件名是区分大小写的,文件命名需要规范,注意大小写,建议小写,不要使用汉字,最好用字母,数字或者带下划线,请注意文件名及目录路径的书写。 如果出现文件上传了,可是文件大小为零 这种情况,说明您的空间已满,请您清理站点文件或者加购空间。 本路径下各文件夹功能和权限说明: / :   您FTP的根目录,为避免您错误删除该路径下的内容,所以禁止写入,只可读取。 htdocs/:您网站的根目录,请将您的网站(php, htm, html, css, js等)上传至此文件夹。 cgi-bin/:请将您的CGI脚本(如 perl脚本)上传至此文件夹。 myfolder/:此文件夹中的内容不会被web用户看到,您可以临时存放一些不愿公开的内容,比如站点备份、数据库备份等。 ftplogs/:您的ftp访问日志存放位置,只读。 wwwlogs/:您的www访问日志存放位置,只读。 backup/:系统自动为您生成的数据库备份的存放位置,只读。 Windows主机上传网页文件时应注意以下几点: 如果您是使用了 ACCESS 数据库,目前虚拟主机不再支持通过 OBDC 方式调用数据库,建议您通过 Access OLE DB方式调用Access数据库,直接从您本地将 Access 数据库连同其它网页文件一起上传即可。 网站的默认首页文件名:index.htm、index.html、index.asp、default.asp、default.htm、default.html。一般虚拟主机开通后,根目录中存在两个首页文件,一个是系统默认的 index.html,一个是您自己上传的 index.htm,由于前者的优先级比后者高,因此访问时显示前者的页面。这种情况您可以登录 主机管理控制台 > 基础环境设置 > 默认首页设置,自行修改设定。 建议不要使用汉字命名目录及文件。 本路径下各文件夹功能和权限说明: CGI-BIN:放置CGI程序使用,如果无CGI程序。 HttpErrors:放置404错误页面,如无自定义404页面要求。 images:万网默认首页的图片文件夹。 css:万网默认首页的样式文件夹。 zhuye.html:万网站点初始默认页面。

鱼生烟 2019-12-02 02:45:31 0 浏览量 回答数 0

问题

在Windows 2008系统设置自定义内容的404错误页

dongshan8 2019-12-01 21:31:42 4672 浏览量 回答数 2

回答

Excel通过VBA调用CDO发邮件 前期我写了很多关于用VBA调用Jmail群发邮件的工具,其实不仅仅Jmail可以做到,其实Windows自带的cdosys.dll就可以直接调用发邮件。两者相比而言,Jmail相对比较好控制,但是需要安装Jmail.dll,CDO是系统自带的,可以直接调用。因而我自己也做了一个用CDO发邮件的东东。代码如下: [code=vb] '代码由轩辕轼轲编写,如对Excel发邮件这个偏门主题感兴趣,可加入QQ群141616426,入群请输入验证代码:Excel发邮件 Sub CDOSENDEMAIL() Dim CDOMail As Variant On Error Resume Next '出错后继续执行 Application.DisplayAlerts = False '禁用系统提示 ThisWorkbook.ChangeFileAccess Mode:=xlReadOnly '将工作簿设置为只读模式 Set CDOMail = CreateObject("CDO.Message") '创建对象 CDOMail.From = "10000@qq.com" '设置发信人的邮箱 CDOMail.To = "10000@qq.com" '设置收信人的邮箱 CDOMail.Subject = "主题:用CDO发送邮件试验" '设定邮件的主题 'CDOMail.TextBody = "文本内容" '使用文本格式发送邮件 CDOMail.HtmlBody = "当您看到此封邮件,表明CDO设置正确" '使用Html格式发送邮件 CDOMail.AddAttachment ThisWorkbook.FullName '发送本工作簿为附件 STUl = "http://schemas.microsoft.com/cdo/configuration/" '微软服务器网址 With CDOMail.Configuration.Fields .Item(STUl & "smtpserver") = "smtp.qq.com" 'SMTP服务器地址 .Item(STUl & "smtpserverport") = 25 'SMTP服务器端口 .Item(STUl & "sendusing") = 2 '发送端口 .Item(STUl & "smtpauthenticate") = 1 '远程服务器需要验证 .Item(STUl & "sendusername") = "10000" '发送方邮箱名称 .Item(STUl & "sendpassword") = "password" '发送方邮箱密码 .Item(STUl & "smtpconnectiontimeout") = 60 '连接超时(秒) .Update End With CDOMail.Send '执行发送 Set CDOMail = Nothing '发送成功后即时释放对象 If Err.Number = 0 Then MsgBox "成功发送邮件", , "温馨提示" '如果没有出错,则提示发送成功 Else MsgBox Err.Description, vbInformation, "邮件发送失败" '如果出错,则提示错误类型和错误代码 End If ThisWorkbook.ChangeFileAccess Mode:=xlReadWrite '将工作簿设置为读写模式 Application.DisplayAlerts = True '恢复系统提示 End Sub[/code]\ 这段代码的作用就是将当前工作簿发往指定的信箱,这个在我们做Excel调查问卷的时候很有用处,可以将工程里面封装上这么一段代码,问卷做完之后,点击一个提交按钮直接发送到指定的信箱即可。如对Excel发邮件这个偏门主题感兴趣,可加入QQ群141616426,入群请输入验证代码:Excel发邮件

小旋风柴进 2019-12-02 02:06:47 0 浏览量 回答数 0

问题

快速入门PPAS版-创建数据库和账号

李沃晟 2019-12-01 21:38:13 752 浏览量 回答数 0

问题

API参考 - API参考 -   账号管理 -GrantAccountPrivilege

李沃晟 2019-12-01 21:40:50 695 浏览量 回答数 0

问题

用户指南-账号管理-创建账号

李沃晟 2019-12-01 21:38:45 851 浏览量 回答数 0

回答

这ibdata1并没有减少,这是MySQL的一个特别令人讨厌的功能。该ibdata1文件实际上不能缩小,除非你删除所有数据库,删除文件并重新加载转储。 但是您可以配置MySQL,以便将每个表(包括其索引)存储为单独的文件。这样ibdata1就不会增长那么大。根据Bill Karwin的评论,默认情况下从MySQL 5.6.6版本开始启用此功能。 不久前我做了这个。但是,要将服务器设置为对每个表使用单独的文件,您需要进行更改my.cnf才能启用此功能: [mysqld] innodb_file_per_table=1 http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html 当您要回收空间时,ibdata1实际上必须删除文件: 对和数据库以外的mysqldump所有数据库,过程,触发器等执行amysqlperformance_schema 删除除上述2个数据库以外的所有数据库 停止mysql 删除ibdata1和ib_log文件 启动mysql 从转储还原 当您在步骤5中启动MySQL时,ibdata1和ib_log文件将被重新创建。 现在您可以出发了。创建新数据库进行分析时,这些表将位于单独的ibd文件中,而不是中ibdata1。由于通常在不久之后ibd删除数据库,因此文件将被删除。 http://dev.mysql.com/doc/refman/5.1/zh-CN/drop-database.html 您可能已经看到了:http : //bugs.mysql.com/bug.php?id=1341 通过使用该命令ALTER TABLE ENGINE=innodb或OPTIMIZE TABLE 一个命令,可以将数据和索引页面从ibdata1提取到单独的文件。但是,除非执行上述步骤,否则ibdata1将不会收缩。 关于information_schema,这是不必要的,也没有可能删除。实际上,它只是一堆只读视图,而不是表。而且没有与之关联的文件,甚至没有数据库目录。在informations_schema使用内存数据库引擎和被丢弃,一旦停止再生/重启mysqld的。参见https://dev.mysql.com/doc/refman/5.7/en/information-schema.html。来源:stack overflow

保持可爱mmm 2020-05-11 10:34:47 0 浏览量 回答数 0

问题

常见问题 - 购买 - MySQL CPU 使用率高的原因和解决方法

李沃晟 2019-12-01 21:41:36 607 浏览量 回答数 0

问题

访问控制常见问题负载均衡 SLB 授权

反向一觉 2019-12-01 21:27:18 1980 浏览量 回答数 0

回答

Android平台进行数据存储的五大方式,分别如下: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 4 使用ContentProvider存储数据 5 网络存储数据 下面详细讲解这五种方式的特点 第一种: 使用SharedPreferences存储数据 适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型、基本类型的值。比如应用程序的各种配置信息(如是否打开音效、是否使用震动效果、小游戏的玩家积分等),解锁口 令密码等 核心原理:保存基于XML文件存储的key-value键值对数据,通常用来存储一些简单的配置信息。通过DDMS的File Explorer面板,展开文件浏览树,很明显SharedPreferences数据总是存储在/data/data/<package name>/shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过SharedPreferences.edit()获取的内部接口Editor对象实现。 SharedPreferences本身是一 个接口,程序无法直接创建SharedPreferences实例,只能通过Context提供的getSharedPreferences(String name, int mode)方法来获取SharedPreferences实例,该方法中name表示要操作的xml文件名,第二个参数具体如下: Context.MODE_PRIVATE: 指定该SharedPreferences数据只能被本应用程序读、写。 Context.MODE_WORLD_READABLE: 指定该SharedPreferences数据能被其他应用程序读,但不能写。 Context.MODE_WORLD_WRITEABLE: 指定该SharedPreferences数据能被其他应用程序读,写 Editor有如下主要重要方法: SharedPreferences.Editor clear():清空SharedPreferences里所有数据 SharedPreferences.Editor putXxx(String key , xxx value): 向SharedPreferences存入指定key对应的数据,其中xxx 可以是boolean,float,int等各种基本类型据 SharedPreferences.Editor remove(): 删除SharedPreferences中指定key对应的数据项 boolean commit(): 当Editor编辑完成后,使用该方法提交修改 实际案例:运行界面如下 这里只提供了两个按钮和一个输入文本框,布局简单,故在此不给出界面布局文件了,程序核心代码如下: 、class ViewOcl implements View.OnClickListener{ @Override public void onClick(View v) { switch(v.getId()){ case R.id.btnSet: //步骤1:获取输入值 String code = txtCode.getText().toString().trim(); //步骤2-1:创建一个SharedPreferences.Editor接口对象,lock表示要写入的XML文件名,MODE_WORLD_WRITEABLE写操作 SharedPreferences.Editor editor = getSharedPreferences("lock", MODE_WORLD_WRITEABLE).edit(); //步骤2-2:将获取过来的值放入文件 editor.putString("code", code); //步骤3:提交 editor.commit(); Toast.makeText(getApplicationContext(), "口令设置成功", Toast.LENGTH_LONG).show(); break; case R.id.btnGet: //步骤1:创建一个SharedPreferences接口对象 SharedPreferences read = getSharedPreferences("lock", MODE_WORLD_READABLE); //步骤2:获取文件中的值 String value = read.getString("code", ""); Toast.makeText(getApplicationContext(), "口令为:"+value, Toast.LENGTH_LONG).show(); break; } } } 、读写其他应用的SharedPreferences: 步骤如下 1、在创建SharedPreferences时,指定MODE_WORLD_READABLE模式,表明该SharedPreferences数据可以被其他程序读取 2、创建其他应用程序对应的Context: Context pvCount = createPackageContext("com.tony.app", Context.CONTEXT_IGNORE_SECURITY);这里的com.tony.app就是其他程序的包名 3、使用其他程序的Context获取对应的SharedPreferences SharedPreferences read = pvCount.getSharedPreferences("lock", Context.MODE_WORLD_READABLE); 4、如果是写入数据,使用Editor接口即可,所有其他操作均和前面一致。 SharedPreferences对象与SQLite数据库相比,免去了创建数据库,创建表,写SQL语句等诸多操作,相对而言更加方便,简洁。但是SharedPreferences也有其自身缺陷,比如其职能存储boolean,int,float,long和String五种简单的数据类型,比如其无法进行条件查询等。所以不论SharedPreferences的数据存储操作是如何简单,它也只能是存储方式的一种补充,而无法完全替代如SQLite数据库这样的其他数据存储方式。 第二种: 文件存储数据 核心原理: Context提供了两个方法来打开数据文件里的文件IO流 FileInputStream openFileInput(String name); FileOutputStream(String name , int mode),这两个方法第一个参数 用于指定文件名,第二个参数指定打开文件的模式。具体有以下值可选: MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可 以使用Context.MODE_APPEND MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。 MODE_WORLD_READABLE:表示当前文件可以被其他应用读取; MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。 除此之外,Context还提供了如下几个重要的方法: getDir(String name , int mode):在应用程序的数据文件夹下获取或者创建name对应的子目录 File getFilesDir():获取该应用程序的数据文件夹得绝对路径 String[] fileList():返回该应用数据文件夹的全部文件 public String read() { try { FileInputStream inStream = this.openFileInput("message.txt"); byte[] buffer = new byte[1024]; int hasRead = 0; StringBuilder sb = new StringBuilder(); while ((hasRead = inStream.read(buffer)) != -1) { sb.append(new String(buffer, 0, hasRead)); } inStream.close(); return sb.toString(); } catch (Exception e) { e.printStackTrace(); } return null; } public void write(String msg){ // 步骤1:获取输入值 if(msg == null) return; try { // 步骤2:创建一个FileOutputStream对象,MODE_APPEND追加模式 FileOutputStream fos = openFileOutput("message.txt", MODE_APPEND); // 步骤3:将获取过来的值放入文件 fos.write(msg.getBytes()); // 步骤4:关闭数据流 fos.close(); } catch (Exception e) { e.printStackTrace(); } } openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android 会自动创建它。创建的文件保存在/data/data//files目录,如: /data/data/cn.tony.app/files/message.txt, 下面讲解某些特殊文件读写需要注意的地方: 读写sdcard上的文件 其中读写步骤按如下进行: 1、调用Environment的getExternalStorageState()方法判断手机上是否插了sd卡,且应用程序具有读写SD卡的权限,如下代码将返回true Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) 2、调用Environment.getExternalStorageDirectory()方法来获取外部存储器,也就是SD卡的目录,或者使用"/mnt/sdcard/"目录 3、使用IO流操作SD卡上的文件 注意点:手机应该已插入SD卡,对于模拟器而言,可通过mksdcard命令来创建虚拟存储卡 必须在AndroidManifest.xml上配置读写SD卡的权限 // 文件写操作函数 private void write(String content) { if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { // 如果sdcard存在 File file = new File(Environment.getExternalStorageDirectory() .toString() + File.separator + DIR + File.separator + FILENAME); // 定义File类对象 if (!file.getParentFile().exists()) { // 父文件夹不存在 file.getParentFile().mkdirs(); // 创建文件夹 } PrintStream out = null; // 打印流对象用于输出 try { out = new PrintStream(new FileOutputStream(file, true)); // 追加文件 out.println(content); } catch (Exception e) { e.printStackTrace(); } finally { if (out != null) { out.close(); // 关闭打印流 } } } else { // SDCard不存在,使用Toast提示用户 Toast.makeText(this, "保存失败,SD卡不存在!", Toast.LENGTH_LONG).show(); } } // 文件读操作函数 private String read() { if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { // 如果sdcard存在 File file = new File(Environment.getExternalStorageDirectory() .toString() + File.separator + DIR + File.separator + FILENAME); // 定义File类对象 if (!file.getParentFile().exists()) { // 父文件夹不存在 file.getParentFile().mkdirs(); // 创建文件夹 } Scanner scan = null; // 扫描输入 StringBuilder sb = new StringBuilder(); try { scan = new Scanner(new FileInputStream(file)); // 实例化Scanner while (scan.hasNext()) { // 循环读取 sb.append(scan.next() + "\n"); // 设置文本 } return sb.toString(); } catch (Exception e) { e.printStackTrace(); } finally { if (scan != null) { scan.close(); // 关闭打印流 } } } else { // SDCard不存在,使用Toast提示用户 Toast.makeText(this, "读取失败,SD卡不存在!", Toast.LENGTH_LONG).show(); } return null; } 复制代码 第三种:SQLite存储数据 SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。现在的主流移动设备像Android、iPhone等都使用SQLite作为复杂数据的存储引擎,在我们为移动设备开发应用程序时,也许就要使用到SQLite来存储我们大量的数据,所以我们就需要掌握移动设备上的SQLite开发技巧 SQLiteDatabase类为我们提供了很多种方法,上面的代码中基本上囊括了大部分的数据库操作;对于添加、更新和删除来说,我们都可以使用 1 db.executeSQL(String sql); 2 db.executeSQL(String sql, Object[] bindArgs);//sql语句中使用占位符,然后第二个参数是实际的参数集 除了统一的形式之外,他们还有各自的操作方法: 1 db.insert(String table, String nullColumnHack, ContentValues values); 2 db.update(String table, Contentvalues values, String whereClause, String whereArgs); 3 db.delete(String table, String whereClause, String whereArgs);以上三个方法的第一个参数都是表示要操作的表名;insert中的第二个参数表示如果插入的数据每一列都为空的话,需要指定此行中某一列的名称,系统将此列设置为NULL,不至于出现错误;insert中的第三个参数是ContentValues类型的变量,是键值对组成的Map,key代表列名,value代表该列要插入的值;update的第二个参数也很类似,只不过它是更新该字段key为最新的value值,第三个参数whereClause表示WHERE表达式,比如“age > ? and age < ?”等,最后的whereArgs参数是占位符的实际参数值;delete方法的参数也是一样 下面给出demo 数据的添加 1.使用insert方法 复制代码1 ContentValues cv = new ContentValues();//实例化一个ContentValues用来装载待插入的数据2 cv.put("title","you are beautiful");//添加title3 cv.put("weather","sun"); //添加weather4 cv.put("context","xxxx"); //添加context5 String publish = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")6 .format(new Date());7 cv.put("publish ",publish); //添加publish8 db.insert("diary",null,cv);//执行插入操作复制代码2.使用execSQL方式来实现 String sql = "insert into user(username,password) values ('Jack Johnson','iLovePopMuisc');//插入操作的SQL语句db.execSQL(sql);//执行SQL语句数据的删除 同样有2种方式可以实现 String whereClause = "username=?";//删除的条件String[] whereArgs = {"Jack Johnson"};//删除的条件参数db.delete("user",whereClause,whereArgs);//执行删除使用execSQL方式的实现 String sql = "delete from user where username='Jack Johnson'";//删除操作的SQL语句db.execSQL(sql);//执行删除操作数据修改 同上,仍是2种方式 ContentValues cv = new ContentValues();//实例化ContentValuescv.put("password","iHatePopMusic");//添加要更改的字段及内容String whereClause = "username=?";//修改条件String[] whereArgs = {"Jack Johnson"};//修改条件的参数db.update("user",cv,whereClause,whereArgs);//执行修改使用execSQL方式的实现 String sql = "update user set password = 'iHatePopMusic' where username='Jack Johnson'";//修改的SQL语句db.execSQL(sql);//执行修改数据查询 下面来说说查询操作。查询操作相对于上面的几种操作要复杂些,因为我们经常要面对着各种各样的查询条件,所以系统也考虑到这种复杂性,为我们提供了较为丰富的查询形式: 1 db.rawQuery(String sql, String[] selectionArgs); 2 db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy); 3 db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit); 4 db.query(String distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit); 上面几种都是常用的查询方法,第一种最为简单,将所有的SQL语句都组织到一个字符串中,使用占位符代替实际参数,selectionArgs就是占位符实际参数集; 各参数说明: table:表名称colums:表示要查询的列所有名称集selection:表示WHERE之后的条件语句,可以使用占位符selectionArgs:条件语句的参数数组groupBy:指定分组的列名having:指定分组条件,配合groupBy使用orderBy:y指定排序的列名limit:指定分页参数distinct:指定“true”或“false”表示要不要过滤重复值Cursor:返回值,相当于结果集ResultSet最后,他们同时返回一个Cursor对象,代表数据集的游标,有点类似于JavaSE中的ResultSet。下面是Cursor对象的常用方法: 复制代码 1 c.move(int offset); //以当前位置为参考,移动到指定行 2 c.moveToFirst(); //移动到第一行 3 c.moveToLast(); //移动到最后一行 4 c.moveToPosition(int position); //移动到指定行 5 c.moveToPrevious(); //移动到前一行 6 c.moveToNext(); //移动到下一行 7 c.isFirst(); //是否指向第一条 8 c.isLast(); //是否指向最后一条 9 c.isBeforeFirst(); //是否指向第一条之前 10 c.isAfterLast(); //是否指向最后一条之后 11 c.isNull(int columnIndex); //指定列是否为空(列基数为0) 12 c.isClosed(); //游标是否已关闭 13 c.getCount(); //总数据项数 14 c.getPosition(); //返回当前游标所指向的行数 15 c.getColumnIndex(String columnName);//返回某列名对应的列索引值 16 c.getString(int columnIndex); //返回当前行指定列的值 复制代码实现代码 复制代码String[] params = {12345,123456};Cursor cursor = db.query("user",columns,"ID=?",params,null,null,null);//查询并获得游标if(cursor.moveToFirst()){//判断游标是否为空 for(int i=0;i<cursor.getCount();i++){ cursor.move(i);//移动到指定记录 String username = cursor.getString(cursor.getColumnIndex("username"); String password = cursor.getString(cursor.getColumnIndex("password")); } }复制代码通过rawQuery实现的带参数查询 复制代码Cursor result=db.rawQuery("SELECT ID, name, inventory FROM mytable");//Cursor c = db.rawQuery("s name, inventory FROM mytable where ID=?",new Stirng[]{"123456"}); result.moveToFirst(); while (!result.isAfterLast()) { int id=result.getInt(0); String name=result.getString(1); int inventory=result.getInt(2); // do something useful with these result.moveToNext(); } result.close();复制代码 在上面的代码示例中,已经用到了这几个常用方法中的一些,关于更多的信息,大家可以参考官方文档中的说明。 最后当我们完成了对数据库的操作后,记得调用SQLiteDatabase的close()方法释放数据库连接,否则容易出现SQLiteException。 上面就是SQLite的基本应用,但在实际开发中,为了能够更好的管理和维护数据库,我们会封装一个继承自SQLiteOpenHelper类的数据库操作类,然后以这个类为基础,再封装我们的业务逻辑方法。 这里直接使用案例讲解:下面是案例demo的界面 SQLiteOpenHelper类介绍 SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据库的创建和版本的更新。一般是建立一个类继承它,并实现它的onCreate和onUpgrade方法。 方法名 方法描述SQLiteOpenHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version) 构造方法,其中 context 程序上下文环境 即:XXXActivity.this; name :数据库名字; factory:游标工厂,默认为null,即为使用默认工厂; version 数据库版本号 onCreate(SQLiteDatabase db) 创建数据库时调用onUpgrade(SQLiteDatabase db,int oldVersion , int newVersion) 版本更新时调用getReadableDatabase() 创建或打开一个只读数据库getWritableDatabase() 创建或打开一个读写数据库首先创建数据库类 复制代码 1 import android.content.Context; 2 import android.database.sqlite.SQLiteDatabase; 3 import android.database.sqlite.SQLiteDatabase.CursorFactory; 4 import android.database.sqlite.SQLiteOpenHelper; 5 6 public class SqliteDBHelper extends SQLiteOpenHelper { 7 8 // 步骤1:设置常数参量 9 private static final String DATABASE_NAME = "diary_db";10 private static final int VERSION = 1;11 private static final String TABLE_NAME = "diary";12 13 // 步骤2:重载构造方法14 public SqliteDBHelper(Context context) {15 super(context, DATABASE_NAME, null, VERSION);16 }17 18 /*19 * 参数介绍:context 程序上下文环境 即:XXXActivity.this 20 * name 数据库名字 21 * factory 接收数据,一般情况为null22 * version 数据库版本号23 */24 public SqliteDBHelper(Context context, String name, CursorFactory factory,25 int version) {26 super(context, name, factory, version);27 }28 //数据库第一次被创建时,onCreate()会被调用29 @Override30 public void onCreate(SQLiteDatabase db) {31 // 步骤3:数据库表的创建32 String strSQL = "create table "33 + TABLE_NAME34 + "(tid integer primary key autoincrement,title varchar(20),weather varchar(10),context text,publish date)";35 //步骤4:使用参数db,创建对象36 db.execSQL(strSQL);37 }38 //数据库版本变化时,会调用onUpgrade()39 @Override40 public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {41 42 }43 }复制代码正如上面所述,数据库第一次创建时onCreate方法会被调用,我们可以执行创建表的语句,当系统发现版本变化之后,会调用onUpgrade方法,我们可以执行修改表结构等语句。 我们需要一个Dao,来封装我们所有的业务方法,代码如下: 复制代码 1 import android.content.Context; 2 import android.database.Cursor; 3 import android.database.sqlite.SQLiteDatabase; 4 5 import com.chinasoft.dbhelper.SqliteDBHelper; 6 7 public class DiaryDao { 8 9 private SqliteDBHelper sqliteDBHelper;10 private SQLiteDatabase db;11 12 // 重写构造方法13 public DiaryDao(Context context) {14 this.sqliteDBHelper = new SqliteDBHelper(context);15 db = sqliteDBHelper.getWritableDatabase();16 }17 18 // 读操作19 public String execQuery(final String strSQL) {20 try {21 System.out.println("strSQL>" + strSQL);22 // Cursor相当于JDBC中的ResultSet23 Cursor cursor = db.rawQuery(strSQL, null);24 // 始终让cursor指向数据库表的第1行记录25 cursor.moveToFirst();26 // 定义一个StringBuffer的对象,用于动态拼接字符串27 StringBuffer sb = new StringBuffer();28 // 循环游标,如果不是最后一项记录29 while (!cursor.isAfterLast()) {30 sb.append(cursor.getInt(0) + "/" + cursor.getString(1) + "/"31 + cursor.getString(2) + "/" + cursor.getString(3) + "/"32 + cursor.getString(4)+"#");33 //cursor游标移动34 cursor.moveToNext();35 }36 db.close();37 return sb.deleteCharAt(sb.length()-1).toString();38 } catch (RuntimeException e) {39 e.printStackTrace();40 return null;41 }42 43 }44 45 // 写操作46 public boolean execOther(final String strSQL) {47 db.beginTransaction(); //开始事务48 try {49 System.out.println("strSQL" + strSQL);50 db.execSQL(strSQL);51 db.setTransactionSuccessful(); //设置事务成功完成 52 db.close();53 return true;54 } catch (RuntimeException e) {55 e.printStackTrace();56 return false;57 }finally { 58 db.endTransaction(); //结束事务 59 } 60 61 }62 }复制代码我们在Dao构造方法中实例化sqliteDBHelper并获取一个SQLiteDatabase对象,作为整个应用的数据库实例;在增删改信息时,我们采用了事务处理,确保数据完整性;最后要注意释放数据库资源db.close(),这一个步骤在我们整个应用关闭时执行,这个环节容易被忘记,所以朋友们要注意。 我们获取数据库实例时使用了getWritableDatabase()方法,也许朋友们会有疑问,在getWritableDatabase()和getReadableDatabase()中,你为什么选择前者作为整个应用的数据库实例呢?在这里我想和大家着重分析一下这一点。 我们来看一下SQLiteOpenHelper中的getReadableDatabase()方法: 复制代码 1 public synchronized SQLiteDatabase getReadableDatabase() { 2 if (mDatabase != null && mDatabase.isOpen()) { 3 // 如果发现mDatabase不为空并且已经打开则直接返回 4 return mDatabase; 5 } 6 7 if (mIsInitializing) { 8 // 如果正在初始化则抛出异常 9 throw new IllegalStateException("getReadableDatabase called recursively"); 10 } 11 12 // 开始实例化数据库mDatabase 13 14 try { 15 // 注意这里是调用了getWritableDatabase()方法 16 return getWritableDatabase(); 17 } catch (SQLiteException e) { 18 if (mName == null) 19 throw e; // Can't open a temp database read-only! 20 Log.e(TAG, "Couldn't open " + mName + " for writing (will try read-only):", e); 21 } 22 23 // 如果无法以可读写模式打开数据库 则以只读方式打开 24 25 SQLiteDatabase db = null; 26 try { 27 mIsInitializing = true; 28 String path = mContext.getDatabasePath(mName).getPath();// 获取数据库路径 29 // 以只读方式打开数据库 30 db = SQLiteDatabase.openDatabase(path, mFactory, SQLiteDatabase.OPEN_READONLY); 31 if (db.getVersion() != mNewVersion) { 32 throw new SQLiteException("Can't upgrade read-only database from version " + db.getVersion() + " to " 33 + mNewVersion + ": " + path); 34 } 35 36 onOpen(db); 37 Log.w(TAG, "Opened " + mName + " in read-only mode"); 38 mDatabase = db;// 为mDatabase指定新打开的数据库 39 return mDatabase;// 返回打开的数据库 40 } finally { 41 mIsInitializing = false; 42 if (db != null && db != mDatabase) 43 db.close(); 44 } 45 }复制代码在getReadableDatabase()方法中,首先判断是否已存在数据库实例并且是打开状态,如果是,则直接返回该实例,否则试图获取一个可读写模式的数据库实例,如果遇到磁盘空间已满等情况获取失败的话,再以只读模式打开数据库,获取数据库实例并返回,然后为mDatabase赋值为最新打开的数据库实例。既然有可能调用到getWritableDatabase()方法,我们就要看一下了: 复制代码public synchronized SQLiteDatabase getWritableDatabase() { if (mDatabase != null && mDatabase.isOpen() && !mDatabase.isReadOnly()) { // 如果mDatabase不为空已打开并且不是只读模式 则返回该实例 return mDatabase; } if (mIsInitializing) { throw new IllegalStateException("getWritableDatabase called recursively"); } // If we have a read-only database open, someone could be using it // (though they shouldn't), which would cause a lock to be held on // the file, and our attempts to open the database read-write would // fail waiting for the file lock. To prevent that, we acquire the // lock on the read-only database, which shuts out other users. boolean success = false; SQLiteDatabase db = null; // 如果mDatabase不为空则加锁 阻止其他的操作 if (mDatabase != null) mDatabase.lock(); try { mIsInitializing = true; if (mName == null) { db = SQLiteDatabase.create(null); } else { // 打开或创建数据库 db = mContext.openOrCreateDatabase(mName, 0, mFactory); } // 获取数据库版本(如果刚创建的数据库,版本为0) int version = db.getVersion(); // 比较版本(我们代码中的版本mNewVersion为1) if (version != mNewVersion) { db.beginTransaction();// 开始事务 try { if (version == 0) { // 执行我们的onCreate方法 onCreate(db); } else { // 如果我们应用升级了mNewVersion为2,而原版本为1则执行onUpgrade方法 onUpgrade(db, version, mNewVersion); } db.setVersion(mNewVersion);// 设置最新版本 db.setTransactionSuccessful();// 设置事务成功 } finally { db.endTransaction();// 结束事务 } } onOpen(db); success = true; return db;// 返回可读写模式的数据库实例 } finally { mIsInitializing = false; if (success) { // 打开成功 if (mDatabase != null) { // 如果mDatabase有值则先关闭 try { mDatabase.close(); } catch (Exception e) { } mDatabase.unlock();// 解锁 } mDatabase = db;// 赋值给mDatabase } else { // 打开失败的情况:解锁、关闭 if (mDatabase != null) mDatabase.unlock(); if (db != null) db.close(); } } }复制代码大家可以看到,几个关键步骤是,首先判断mDatabase如果不为空已打开并不是只读模式则直接返回,否则如果mDatabase不为空则加锁,然后开始打开或创建数据库,比较版本,根据版本号来调用相应的方法,为数据库设置新版本号,最后释放旧的不为空的mDatabase并解锁,把新打开的数据库实例赋予mDatabase,并返回最新实例。 看完上面的过程之后,大家或许就清楚了许多,如果不是在遇到磁盘空间已满等情况,getReadableDatabase()一般都会返回和getWritableDatabase()一样的数据库实例,所以我们在DBManager构造方法中使用getWritableDatabase()获取整个应用所使用的数据库实例是可行的。当然如果你真的担心这种情况会发生,那么你可以先用getWritableDatabase()获取数据实例,如果遇到异常,再试图用getReadableDatabase()获取实例,当然这个时候你获取的实例只能读不能写了 最后,让我们看一下如何使用这些数据操作方法来显示数据,界面核心逻辑代码: 复制代码public class SQLiteActivity extends Activity { public DiaryDao diaryDao; //因为getWritableDatabase内部调用了mContext.openOrCreateDatabase(mName, 0, mFactory); //所以要确保context已初始化,我们可以把实例化Dao的步骤放在Activity的onCreate里 @Override protected void onCreate(Bundle savedInstanceState) { diaryDao = new DiaryDao(SQLiteActivity.this); initDatabase(); } class ViewOcl implements View.OnClickListener { @Override public void onClick(View v) { String strSQL; boolean flag; String message; switch (v.getId()) { case R.id.btnAdd: String title = txtTitle.getText().toString().trim(); String weather = txtWeather.getText().toString().trim();; String context = txtContext.getText().toString().trim();; String publish = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") .format(new Date()); // 动态组件SQL语句 strSQL = "insert into diary values(null,'" + title + "','" + weather + "','" + context + "','" + publish + "')"; flag = diaryDao.execOther(strSQL); //返回信息 message = flag?"添加成功":"添加失败"; Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show(); break; case R.id.btnDelete: strSQL = "delete from diary where tid = 1"; flag = diaryDao.execOther(strSQL); //返回信息 message = flag?"删除成功":"删除失败"; Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show(); break; case R.id.btnQuery: strSQL = "select * from diary order by publish desc"; String data = diaryDao.execQuery(strSQL); Toast.makeText(getApplicationContext(), data, Toast.LENGTH_LONG).show(); break; case R.id.btnUpdate: strSQL = "update diary set title = '测试标题1-1' where tid = 1"; flag = diaryDao.execOther(strSQL); //返回信息 message = flag?"更新成功":"更新失败"; Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show(); break; } } } private void initDatabase() { // 创建数据库对象 SqliteDBHelper sqliteDBHelper = new SqliteDBHelper(SQLiteActivity.this); sqliteDBHelper.getWritableDatabase(); System.out.println("数据库创建成功"); } }复制代码 Android sqlite3数据库管理工具 Android SDK的tools目录下提供了一个sqlite3.exe工具,这是一个简单的sqlite数据库管理工具。开发者可以方便的使用其对sqlite数据库进行命令行的操作。 程序运行生成的.db文件一般位于"/data/data/项目名(包括所处包名)/databases/.db",因此要对数据库文件进行操作需要先找到数据库文件: 1、进入shell 命令 adb shell2、找到数据库文件 cd data/data ls --列出所有项目 cd project_name --进入所需项目名 cd databases ls --列出现寸的数据库文件 3、进入数据库 sqlite3 test_db --进入所需数据库 会出现类似如下字样: SQLite version 3.6.22Enter ".help" for instructionsEnter SQL statements terminated with a ";"sqlite>至此,可对数据库进行sql操作。 4、sqlite常用命令 .databases --产看当前数据库.tables --查看当前数据库中的表.help --sqlite3帮助.schema --各个表的生成语句 原文地址https://www.cnblogs.com/ITtangtang/p/3920916.html

auto_answer 2019-12-02 01:50:21 0 浏览量 回答数 0

回答

标题应该改一下呢?加上PostgreSQL吧。 有几篇更详细的讲PostgreSQL性能优化的http://yq.aliyun.com/articles/214http://yq.aliyun.com/articles/215还有专门讲参数优化的视频 PostgreSQL 性能优化视频(18集全) : 18. 性能优化培训 - 综合优化案例 http://www.tudou.com/programs/view/UeXudDhDaHU/ 17. 性能优化培训 - 性能分析工具3, pg_statsinfo的使用(与DBA培训同集) http://www.tudou.com/programs/view/5SUCgb7_hsY/ 16. 性能优化培训 - 性能分析工具2, pg_stat_statements http://www.tudou.com/listplay/JW66CCxpr-s/xkOD3u8kQkE.html (注意,里面有一些描述有问题。pg_stat_statements是在数据库启动时加载。 运行过程有write操作(和PG版本有个,以前的版本可以不持久化,没有write操作,现在的版本都有write操作),数据库关闭时fsync。) (在run到hook处时加载。) 15. 性能优化培训 - 性能分析工具1, sar http://www.tudou.com/listplay/JW66CCxpr-s/qX8HOgBZu2M.html 14. 性能优化培训 - PostgreSQL压力测试工具pgbench讲解 http://www.tudou.com/listplay/JW66CCxpr-s/OUl0DLhiJwg.html 13. 性能优化培训 - 如何让数据库输出好的执行计划, 访问开关, 指定表关联顺序, 遗传算法 http://www.tudou.com/listplay/JW66CCxpr-s/dS2x85nosBw.html 12. 性能优化培训 - PostgreSQL锁的详解 http://www.tudou.com/listplay/JW66CCxpr-s/OsRGPcGEL9M.html 11. 性能优化培训 - PostgreSQL事务隔离级别讲解 http://www.tudou.com/listplay/JW66CCxpr-s/2sqzjiuqKFY.html 10. 性能优化培训 - 函数的三种稳定性状态对优化器的影响分解讲解 http://www.tudou.com/programs/view/p6E3oQEsZv0/ 9. 性能优化培训 - PostgreSQL trace & debug (跟踪和调试) http://www.tudou.com/programs/view/SbglCp2T3t4/ 8. 性能优化培训 - 执行计划缓存管理, 绑定变量接口 http://www.tudou.com/programs/view/kwmilXD7JEw/ 7. 性能优化培训 - auto_explain插件, 索引扫描引发的heap page scan被放大的实例讲解 http://www.tudou.com/programs/view/LwMWC4ZpOhU/ 6. PostgreSQL 性能优化培训 - 执行计划成本因子(page scan cost, cpu cost)的校准方法实例讲解 http://www.tudou.com/programs/view/yQ0SzBqx_4w/ 5. PostgreSQL 性能优化培训 - 行评估算法讲解, 成本计算实例讲解 http://www.tudou.com/programs/view/3zgOuh7kbfs/ 4. PostgreSQL 性能优化培训 - explain 实例讲解 http://www.tudou.com/programs/view/QztOh_hCFKw 3. PostgreSQL 性能优化培训 - explain输出结构信息详解 http://www.tudou.com/programs/view/OZSUbOFZ0U4 2. PostgreSQL 性能优化培训 - 统计信息详解, 成本因子介绍 http://www.tudou.com/programs/view/oA1v5sDFq3Q/ 1. PostgreSQL 性能优化培训 - 授课环境搭建讲解 http://www.tudou.com/programs/view/AVCbdfl9rH8/ 建议的参数项 echo "----->>>---->>> 获取postgresql.conf配置: " grep '^\ *[a-z]' $PGDATA/postgresql.conf|awk -F "#" '{print $1}' echo "建议: " echo " 主备配置尽量保持一致, 配置合理的参数值." echo -e " 建议修改的参数列表如下 ( 假设操作系统内存为128GB, 数据库独占操作系统, 数据库版本9.4.x ) : echo "" listen_addresses = '0.0.0.0' # 监听所有IPV4地址 port = 1921 # 监听非默认端口 max_connections = 4000 # 最大允许连接数 superuser_reserved_connections = 20 # 为超级用户保留的连接 unix_socket_directories = '.' # unix socket文件目录最好放在$PGDATA中, 确保安全 unix_socket_permissions = 0700 # 确保权限安全 tcp_keepalives_idle = 30 # 间歇性发送TCP心跳包, 防止连接被网络设备中断. tcp_keepalives_interval = 10 tcp_keepalives_count = 10 shared_buffers = 16GB # 数据库自己管理的共享内存大小 huge_pages = try # 尽量使用大页, 需要操作系统支持, 配置vm.nr_hugepages*2MB大于shared_buffers. maintenance_work_mem = 512MB # 可以加速创建索引, 回收垃圾(假设没有设置autovacuum_work_mem) autovacuum_work_mem = 512MB # 可以加速回收垃圾 shared_preload_libraries = 'auth_delay,passwordcheck,pg_stat_statements,auto_explain' # 建议防止暴力破解, 密码复杂度检测, 开启pg_stat_statements, 开启auto_explain, 参考 http://blog.163.com/digoal@126/blog/static/16387704020149852941586 bgwriter_delay = 10ms # bgwriter process间隔多久调用write接口(注意不是fsync)将shared buffer中的dirty page写到文件系统. bgwriter_lru_maxpages = 1000 # 一个周期最多写多少脏页 max_worker_processes = 20 # 如果要使用worker process, 最多可以允许fork 多少个worker进程. wal_level = logical # 如果将来打算使用logical复制, 最后先配置好, 不需要停机再改. synchronous_commit = off # 如果磁盘的IOPS能力一般, 建议使用异步提交来提高性能, 但是数据库crash或操作系统crash时, 最多可能丢失2*wal_writer_delay时间段产生的事务日志(在wal buffer中). wal_sync_method = open_datasync # 使用pg_test_fsync测试wal所在磁盘的fsync接口, 使用性能好的. wal_buffers = 16MB wal_writer_delay = 10ms checkpoint_segments = 1024 # 等于shared_buffers除以单个wal segment的大小. checkpoint_timeout = 30min checkpoint_completion_target = 0.2 archive_mode = on # 最好先开启, 否则需要重启数据库来修改 archive_command = '/bin/date' # 最好先开启, 否则需要重启数据库来修改, 将来修改为正确的命令例如, test ! -f /home/postgres/archivedir/pg_root/%f && cp %p /home/postgres/archivedir/pg_root/%f max_wal_senders = 32 # 最多允许多少个wal sender进程. wal_keep_segments = 2048 # 在pg_xlog目录中保留的WAL文件数, 根据流复制业务的延迟情况和pg_xlog目录大小来预估. max_replication_slots = 32 # 最多允许多少个复制插槽 hot_standby = on max_standby_archive_delay = 300s # 如果备库要被用于只读, 有大的查询的情况下, 如果遇到conflicts, 可以考虑调整这个值来避免conflict造成cancel query. max_standby_streaming_delay = 300s # 如果备库要被用于只读, 有大的查询的情况下, 如果遇到conflicts, 可以考虑调整这个值来避免conflict造成cancel query. wal_receiver_status_interval = 1s hot_standby_feedback = on random_page_cost = 2 # 根据IO能力调整 effective_cache_size = 100GB # 调整为与内存一样大, 或者略小(减去shared_buffer). 用来评估OS PAGE CACHE可以用到的内存大小. log_destination = 'csvlog' logging_collector = on log_truncate_on_rotation = on log_rotation_size = 10MB log_min_duration_statement = 1s log_checkpoints = on log_connections = on log_disconnections = on log_error_verbosity = verbose # 在日志中输出代码位置 log_lock_waits = on log_statement = 'ddl' autovacuum = on log_autovacuum_min_duration = 0 autovacuum_max_workers = 10 autovacuum_naptime = 30s # 快速唤醒, 防止膨胀 autovacuum_vacuum_scale_factor = 0.02 # 当垃圾超过比例时, 启动垃圾回收工作进程 autovacuum_analyze_scale_factor = 0.1 auth_delay.milliseconds = 5000 # 认证失败, 延迟多少毫秒反馈 auto_explain.log_min_duration = 5000 # 记录超过多少毫秒的SQL当时的执行计划 auto_explain.log_analyze = true auto_explain.log_verbose = true auto_explain.log_buffers = true auto_explain.log_nested_statements = true pg_stat_statements.track_utility=off

德哥 2019-12-02 01:29:26 0 浏览量 回答数 0

问题

MySQL CPU 使用率高的原因和解决方法

云栖大讲堂 2019-12-01 21:32:14 1590 浏览量 回答数 0

回答

回3楼dns2008的帖子 你说的这个东西不太适用 ------------------------- 回6楼ap2836i0b的帖子 文中所说的: 在IIS Manager中,找到Features Views->Management Area,双击"Feature Delegation"。选择Error Pages并单击Read Only,如下图。 Features Views->Management Area中文意思是什么呀?我怎么没有找到对应的项呢? ------------------------- 回8楼ap2836i0b的帖子 在IIS管理主页中的“功能委派”里,我将“错误页”在右侧将其设置为“只读”,但是到了第二步,我的web.config文件与MSDN博客上的不一样,我继续将httpErrors段删除,然后重启IIS后,请求不存在时,出现的是IIS默认的404页面,状态是404,但是这样的话就等于我没有自定义404页面了,求解? 我的web.config <?xml version="1.0" encoding="UTF-8"?><configuration>    <system.webServer>        <defaultDocument>            <files>                <clear />                <add value="index.html" />                <add value="index.php" />                <add value="Default.htm" />                <add value="Default.asp" />                <add value="index.htm" />                <add value="iisstart.htm" />                <add value="default.aspx" />            </files>        </defaultDocument>        <httpErrors errorMode="DetailedLocalOnly">            <remove statusCode="404" subStatusCode="-1" />            <error statusCode="404" prefixLanguageFilePath="" path="/404.htm" responseMode="ExecuteURL" />        </httpErrors>        <staticContent>            <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" />        </staticContent>    </system.webServer></configuration>MSDN上说明需要删除的web.config段 <handlers accessPolicy="Read, Script" />        <httpErrors>            <remove statusCode="404" subStatusCode="-1" />            <error statusCode="404" prefixLanguageFilePath="" path=" E:\Temp\error404.html " responseMode="File" /></httpErrors> ------------------------- 回10楼ap2836i0b的帖子 但是默认的404页面是对于IIS上所有网站而言的,服务器上有多个网站,如果不能自定义网站的404页面,上面提到的所有操作都是白做的 ------------------------- Re404页面的HTTP状态是200,求助解决办法 我发现阿里云官方网站及论坛的404页面(www.aliyun.com/notfound/ )的http状态码也是200!!!难道这是win2008r2上iis7.5的BUG吗? ------------------------- 回12楼xfzx.org的帖子 确实是用web.config解决,不过我不明白为什么自动生成的web.config不能返回404状态,最后解决办法bbs.aliyun.com/read.php?tid=132726

alphafeed 2019-12-02 00:35:29 0 浏览量 回答数 0

问题

API常见错误码表上线-就帮你到这里了

仙游 2019-12-01 21:00:08 5576 浏览量 回答数 1

回答

重试作用: 对于重试是有场景限制的,不是什么场景都适合重试,比如参数校验不合法、写操作等(要考虑写是否幂等)都不适合重试。 远程调用超时、网络突然中断可以重试。在微服务治理框架中,通常都有自己的重试与超时配置,比如dubbo可以设置retries=1,timeout=500调用失败只重试1次,超过500ms调用仍未返回则调用失败。 比如外部 RPC 调用,或者数据入库等操作,如果一次操作失败,可以进行多次重试,提高调用成功的可能性。 优雅的重试机制要具备几点: 无侵入:这个好理解,不改动当前的业务逻辑,对于需要重试的地方,可以很简单的实现 可配置:包括重试次数,重试的间隔时间,是否使用异步方式等 通用性:最好是无改动(或者很小改动)的支持绝大部分的场景,拿过来直接可用 优雅重试共性和原理: 正常和重试优雅解耦,重试断言条件实例或逻辑异常实例是两者沟通的媒介。 约定重试间隔,差异性重试策略,设置重试超时时间,进一步保证重试有效性以及重试流程稳定性。 都使用了命令设计模式,通过委托重试对象完成相应的逻辑操作,同时内部封装实现重试逻辑。 Spring-tryer和guava-tryer工具都是线程安全的重试,能够支持并发业务场景的重试逻辑正确性。 优雅重试适用场景: 功能逻辑中存在不稳定依赖场景,需要使用重试获取预期结果或者尝试重新执行逻辑不立即结束。比如远程接口访问,数据加载访问,数据上传校验等等。 对于异常场景存在需要重试场景,同时希望把正常逻辑和重试逻辑解耦。 对于需要基于数据媒介交互,希望通过重试轮询检测执行逻辑场景也可以考虑重试方案。 优雅重试解决思路: 切面方式 这个思路比较清晰,在需要添加重试的方法上添加一个用于重试的自定义注解,然后在切面中实现重试的逻辑,主要的配置参数则根据注解中的选项来初始化 优点: 真正的无侵入 缺点: 某些方法无法被切面拦截的场景无法覆盖(如spring-aop无法切私有方法,final方法) 直接使用aspecj则有些小复杂;如果用spring-aop,则只能切被spring容器管理的bean 消息总线方式 这个也比较容易理解,在需要重试的方法中,发送一个消息,并将业务逻辑作为回调方法传入;由一个订阅了重试消息的consumer来执行重试的业务逻辑 优点: 重试机制不受任何限制,即在任何地方你都可以使用 利用EventBus框架,可以非常容易把框架搭起来 缺点: 业务侵入,需要在重试的业务处,主动发起一条重试消息 调试理解复杂(消息总线方式的最大优点和缺点,就是过于灵活了,你可能都不知道什么地方处理这个消息,特别是新的童鞋来维护这段代码时) 如果要获取返回结果,不太好处理, 上下文参数不好处理 模板方式 优点: 简单(依赖简单:引入一个类就可以了; 使用简单:实现抽象类,讲业务逻辑填充即可;) 灵活(这个是真正的灵活了,你想怎么干都可以,完全由你控制) 缺点: 强侵入 代码臃肿 把这个单独捞出来,主要是某些时候我就一两个地方要用到重试,简单的实现下就好了,也没有必用用到上面这么重的方式;而且我希望可以针对代码快进行重试 这个的设计还是非常简单的,基本上代码都可以直接贴出来,一目了然: 复制代码 public abstract class RetryTemplate { private static final int DEFAULT_RETRY_TIME = 1; private int retryTime = DEFAULT_RETRY_TIME; private int sleepTime = 0;// 重试的睡眠时间 public int getSleepTime() { return sleepTime; } public RetryTemplate setSleepTime(int sleepTime) { if(sleepTime < 0) { throw new IllegalArgumentException("sleepTime should equal or bigger than 0"); } this.sleepTime = sleepTime; return this; } public int getRetryTime() { return retryTime; } public RetryTemplate setRetryTime(int retryTime) { if (retryTime <= 0) { throw new IllegalArgumentException("retryTime should bigger than 0"); } this.retryTime = retryTime; return this; } /** * 重试的业务执行代码 * 失败时请抛出一个异常 * * todo 确定返回的封装类,根据返回结果的状态来判定是否需要重试 * * @return */ protected abstract Object doBiz() throws Exception; //预留一个doBiz方法由业务方来实现,在其中书写需要重试的业务代码,然后执行即可 public Object execute() throws InterruptedException { for (int i = 0; i < retryTime; i++) { try { return doBiz(); } catch (Exception e) { log.error("业务执行出现异常,e: {}", e); Thread.sleep(sleepTime); } } return null; } public Object submit(ExecutorService executorService) { if (executorService == null) { throw new IllegalArgumentException("please choose executorService!"); } return executorService.submit((Callable) () -> execute()); } } 复制代码 使用示例: 复制代码 public void retryDemo() throws InterruptedException { Object ans = new RetryTemplate() { @Override protected Object doBiz() throws Exception { int temp = (int) (Math.random() * 10); System.out.println(temp); if (temp > 3) { throw new Exception("generate value bigger then 3! need retry"); } return temp; } }.setRetryTime(10).setSleepTime(10).execute(); System.out.println(ans); } 复制代码 spring-retry Spring Retry 为 Spring 应用程序提供了声明性重试支持。 它用于Spring批处理、Spring集成、Apache Hadoop(等等)的Spring。 在分布式系统中,为了保证数据分布式事务的强一致性,在调用RPC接口或者发送MQ时,针对可能会出现网络抖动请求超时情况采取一下重试操作。 用的最多的重试方式就是MQ了,但是如果你的项目中没有引入MQ,就不方便了。 还有一种方式,是开发者自己编写重试机制,但是大多不够优雅。 缺陷 spring-retry 工具虽能优雅实现重试,但是存在两个不友好设计: 一个是重试实体限定为 Throwable 子类,说明重试针对的是可捕捉的功能异常为设计前提的,但是我们希望依赖某个数据对象实体作为重试实体, 但 sping-retry框架必须强制转换为Throwable子类。 另一个是重试根源的断言对象使用的是 doWithRetry 的 Exception 异常实例,不符合正常内部断言的返回设计。 Spring Retry 提倡以注解的方式对方法进行重试,重试逻辑是同步执行的,当抛出相关异常后执行重试, 如果你要以返回值的某个状态来判定是否需要重试,可能只能通过自己判断返回值然后显式抛出异常了。只读操作可以重试,幂等写操作可以重试,但是非幂等写操作不能重试,重试可能导致脏写,或产生重复数据。 @Recover 注解在使用时无法指定方法,如果一个类中多个重试方法,就会很麻烦。 spring-retry 结构 BackOff:补偿值,一般指失败后多久进行重试的延迟值。 Sleeper:暂停应用的工具,通常用来应用补偿值。 RetryState:重试状态,通常包含一个重试的键值。 RetryCallback:封装你需要重试的业务逻辑(上文中的doSth) RecoverCallback:封装了多次重试都失败后你需要执行的业务逻辑(上文中的doSthWhenStillFail) RetryContext:重试语境下的上下文,代表了能被重试动作使用的资源。可用于在多次Retry或者Retry 和Recover之间传递参数或状态(在多次doSth或者doSth与doSthWhenStillFail之间传递参数) RetryOperations: 定义了“重试”的模板(重试的API),要求传入RetryCallback,可选传入RecoveryCallback; RetryTemplate :RetryOperations的具体实现,组合了RetryListener[],BackOffPolicy,RetryPolicy。 RetryListener:用来监控Retry的执行情况,并生成统计信息。 RetryPolicy:重试的策略或条件,可以简单的进行多次重试,可以是指定超时时间进行重试(上文中的someCondition),决定失败能否重试。 BackOffPolicy: 重试的回退策略,在业务逻辑执行发生异常时。如果需要重试,我们可能需要等一段时间(可能服务器过于繁忙,如果一直不间隔重试可能拖垮服务器),当然这段时间可以是0,也可以是固定的,可以是随机的(参见tcp的拥塞控制算法中的回退策略)。回退策略在上文中体现为wait(); RetryPolicy提供了如下策略实现: NeverRetryPolicy:只允许调用RetryCallback一次,不允许重试; AlwaysRetryPolicy:允许无限重试,直到成功,此方式逻辑不当会导致死循环; SimpleRetryPolicy:固定次数重试策略,默认重试最大次数为3次,RetryTemplate默认使用的策略; TimeoutRetryPolicy:超时时间重试策略,默认超时时间为1秒,在指定的超时时间内允许重试; CircuitBreakerRetryPolicy:有熔断功能的重试策略,需设置3个参数openTimeout、resetTimeout和delegate delegate:是真正判断是否重试的策略,当重试失败时,则执行熔断策略;应该配置基于次数的SimpleRetryPolicy或者基于超时的TimeoutRetryPolicy策略,且策略都是全局模式,而非局部模式,所以要注意次数或超时的配置合理性。 openTimeout:openWindow,配置熔断器电路打开的超时时间,当超过openTimeout之后熔断器电路变成半打开状态(主要有一次重试成功,则闭合电路); resetTimeout:timeout,配置重置熔断器重新闭合的超时时间 CompositeRetryPolicy:组合重试策略,有两种组合方式,乐观组合重试策略是指只要有一个策略允许重试即可以,悲观组合重试策略是指只要有一个策略不允许重试即可以,但不管哪种组合方式,组合中的每一个策略都会执行。 BackOffPolicy 提供了如下策略实现: NoBackOffPolicy:无退避算法策略,即当重试时是立即重试; FixedBackOffPolicy:固定时间的退避策略,需设置参数sleeper(指定等待策略,默认是Thread.sleep,即线程休眠)、backOffPeriod(休眠时间,默认1秒); UniformRandomBackOffPolicy:随机时间退避策略,需设置sleeper、minBackOffPeriod、maxBackOffPeriod,该策略在[minBackOffPeriod,maxBackOffPeriod之间取一个随机休眠时间,minBackOffPeriod默认500毫秒,maxBackOffPeriod默认1500毫秒; ExponentialBackOffPolicy:指数退避策略,需设置参数sleeper、initialInterval、maxInterval和multiplier。initialInterval指定初始休眠时间,默认100毫秒,maxInterval指定最大休眠时间,默认30秒,multiplier指定乘数,即下一次休眠时间为当前休眠时间*multiplier; ExponentialRandomBackOffPolicy:随机指数退避策略,引入随机乘数,固定乘数可能会引起很多服务同时重试导致DDos,使用随机休眠时间来避免这种情况。 RetryTemplate主要流程实现: 复制代码 //示例一 public void upload(final Map<String, Object> map) throws Exception { // 构建重试模板实例 RetryTemplate retryTemplate = new RetryTemplate(); // 设置重试策略,主要设置重试次数 SimpleRetryPolicy policy =         new SimpleRetryPolicy(3, Collections.<Class<? extends Throwable>, Boolean> singletonMap(Exception.class, true)); // 设置重试回退操作策略,主要设置重试间隔时间 FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy(); fixedBackOffPolicy.setBackOffPeriod(100); retryTemplate.setRetryPolicy(policy); retryTemplate.setBackOffPolicy(fixedBackOffPolicy); // 通过RetryCallback 重试回调实例包装正常逻辑逻辑,第一次执行和重试执行执行的都是这段逻辑 final RetryCallback<Object, Exception> retryCallback = new RetryCallback<Object, Exception>() { //RetryContext 重试操作上下文约定,统一spring-try包装 public Object doWithRetry(RetryContext context) throws Exception { System.out.println("do some thing"); Exception e = uploadToOdps(map); System.out.println(context.getRetryCount()); throw e;//这个点特别注意,重试的根源通过Exception返回 } }; // 通过RecoveryCallback 重试流程正常结束或者达到重试上限后的退出恢复操作实例 final RecoveryCallback recoveryCallback = new RecoveryCallback() { public Object recover(RetryContext context) throws Exception { System.out.println("do recory operation"); return null; } }; try { // 由retryTemplate 执行execute方法开始逻辑执行 retryTemplate.execute(retryCallback, recoveryCallback); } catch (Exception e) { e.printStackTrace(); } } //示例二 protected <T, E extends Throwable> T doExecute(RetryCallback<T, E> retryCallback,RecoveryCallback recoveryCallback,   RetryState state) throws E, ExhaustedRetryException { //重试策略 RetryPolicy retryPolicy = this.retryPolicy; //退避策略 BackOffPolicy backOffPolicy = this.backOffPolicy; //重试上下文,当前重试次数等都记录在上下文中 RetryContext context = open(retryPolicy, state); try { //拦截器模式,执行RetryListener#open boolean running = doOpenInterceptors(retryCallback, context); //判断是否可以重试执行 while (canRetry(retryPolicy, context) && !context.isExhaustedOnly()) { try {//执行RetryCallback回调 return retryCallback.doWithRetry(context); } catch (Throwable e) {//异常时,要进行下一次重试准备 //遇到异常后,注册该异常的失败次数 registerThrowable(retryPolicy, state, context, e); //执行RetryListener#onError doOnErrorInterceptors(retryCallback, context, e); //如果可以重试,执行退避算法,比如休眠一小段时间后再重试 if (canRetry(retryPolicy, context) && !context.isExhaustedOnly()) { backOffPolicy.backOff(backOffContext); } //state != null && state.rollbackFor(context.getLastThrowable()) //在有状态重试时,如果是需要执行回滚操作的异常,则立即抛出异常 if (shouldRethrow(retryPolicy, context, state)) { throw RetryTemplate. wrapIfNecessary(e); } } //如果是有状态重试,且有GLOBAL_STATE属性,则立即跳出重试终止;       //当抛出的异常是非需要执行回滚操作的异常时,才会执行到此处,CircuitBreakerRetryPolicy会在此跳出循环; if (state != null && context.hasAttribute(GLOBAL_STATE)) { break; } } //重试失败后,如果有RecoveryCallback,则执行此回调,否则抛出异常 return handleRetryExhausted(recoveryCallback, context, state); } catch (Throwable e) { throw RetryTemplate. wrapIfNecessary(e); } finally { //清理环境 close(retryPolicy, context, state, lastException == null || exhausted); //执行RetryListener#close,比如统计重试信息 doCloseInterceptors(retryCallback, context, lastException); } } 复制代码 有状态or无状态 无状态重试,是在一个循环中执行完重试策略,即重试上下文保持在一个线程上下文中,在一次调用中进行完整的重试策略判断。如远程调用某个查询方法时是最常见的无状态重试: 复制代码 RetryTemplate template = new RetryTemplate(); //重试策略:次数重试策略 RetryPolicy retryPolicy = new SimpleRetryPolicy(3); template.setRetryPolicy(retryPolicy); //退避策略:指数退避策略 ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy(); backOffPolicy.setInitialInterval(100); backOffPolicy.setMaxInterval(3000); backOffPolicy.setMultiplier(2); backOffPolicy.setSleeper(new ThreadWaitSleeper()); template.setBackOffPolicy(backOffPolicy); //当重试失败后,抛出异常 String result = template.execute(new RetryCallback<String, RuntimeException>() { @Override public String doWithRetry(RetryContext context) throws RuntimeException { throw new RuntimeException("timeout"); } }); //当重试失败后,执行RecoveryCallback String result = template.execute(new RetryCallback<String, RuntimeException>() { @Override public String doWithRetry(RetryContext context) throws RuntimeException { System.out.println("retry count:" + context.getRetryCount()); throw new RuntimeException("timeout"); } }, new RecoveryCallback () { @Override public String recover(RetryContext context) throws Exception { return "default"; } }); 复制代码 有状态重试,有两种情况需要使用有状态重试,事务操作需要回滚、熔断器模式。 事务操作需要回滚场景时,当整个操作中抛出的是数据库异常DataAccessException,则不能进行重试需要回滚,而抛出其他异常则可以进行重试,可以通过RetryState实现: 复制代码 //当前状态的名称,当把状态放入缓存时,通过该key查询获取 Object key = "mykey"; //是否每次都重新生成上下文还是从缓存中查询,即全局模式(如熔断器策略时从缓存中查询) boolean isForceRefresh = true; //对DataAccessException进行回滚 BinaryExceptionClassifier rollbackClassifier = new BinaryExceptionClassifier(Collections.<Class<? extends Throwable>>singleton(DataAccessException.class)); RetryState state = new DefaultRetryState(key, isForceRefresh, rollbackClassifier); String result = template.execute(new RetryCallback<String, RuntimeException>() { @Override public String doWithRetry(RetryContext context) throws RuntimeException { System.out.println("retry count:" + context.getRetryCount()); throw new TypeMismatchDataAccessException(""); } }, new RecoveryCallback () { @Override public String recover(RetryContext context) throws Exception { return "default"; } }, state); 复制代码 RetryTemplate中在有状态重试时,回滚场景时直接抛出异常处理代码: //state != null && state.rollbackFor(context.getLastThrowable()) //在有状态重试时,如果是需要执行回滚操作的异常,则立即抛出异常 if (shouldRethrow(retryPolicy,context, state)) { throw RetryTemplate. wrapIfNecessary(e); } 熔断器场景。在有状态重试时,且是全局模式,不在当前循环中处理重试,而是全局重试模式(不是线程上下文),如熔断器策略时测试代码如下所示。 复制代码 RetryTemplate template = new RetryTemplate(); CircuitBreakerRetryPolicy retryPolicy = new CircuitBreakerRetryPolicy(new SimpleRetryPolicy(3)); retryPolicy.setOpenTimeout(5000); retryPolicy.setResetTimeout(20000); template.setRetryPolicy(retryPolicy); for (int i = 0; i < 10; i++) { try { Object key = "circuit"; boolean isForceRefresh = false; RetryState state = new DefaultRetryState(key, isForceRefresh); String result = template.execute(new RetryCallback<String, RuntimeException>() { @Override public String doWithRetry(RetryContext context) throws RuntimeException { System.out.println("retry count:" + context.getRetryCount()); throw new RuntimeException("timeout"); } }, new RecoveryCallback () { @Override public String recover(RetryContext context) throws Exception { return "default"; } }, state); System.out.println(result); } catch (Exception e) { System.out.println(e); } } 复制代码 为什么说是全局模式呢?我们配置了isForceRefresh为false,则在获取上下文时是根据key “circuit”从缓存中获取,从而拿到同一个上下文。 Object key = "circuit"; boolean isForceRefresh = false; RetryState state = new DefaultRetryState(key,isForceRefresh); 如下RetryTemplate代码说明在有状态模式下,不会在循环中进行重试。 if (state != null && context.hasAttribute(GLOBAL_STATE)) { break; } 判断熔断器电路是否打开的代码: 复制代码 public boolean isOpen() { long time = System.currentTimeMillis() - this.start; boolean retryable = this.policy.canRetry(this.context); if (!retryable) {//重试失败 //在重置熔断器超时后,熔断器器电路闭合,重置上下文 if (time > this.timeout) { this.context = createDelegateContext(policy, getParent()); this.start = System.currentTimeMillis(); retryable = this.policy.canRetry(this.context); } else if (time < this.openWindow) { //当在熔断器打开状态时,熔断器电路打开,立即熔断 if ((Boolean) getAttribute(CIRCUIT_OPEN) == false) { setAttribute(CIRCUIT_OPEN, true); } this.start = System.currentTimeMillis(); return true; } } else {//重试成功 //在熔断器电路半打开状态时,断路器电路闭合,重置上下文 if (time > this.openWindow) { this.start = System.currentTimeMillis(); this.context = createDelegateContext(policy, getParent()); } } setAttribute(CIRCUIT_OPEN, !retryable); return !retryable; } 复制代码 从如上代码可看出spring-retry的熔断策略相对简单: 当重试失败,且在熔断器打开时间窗口[0,openWindow) 内,立即熔断; 当重试失败,且在指定超时时间后(>timeout),熔断器电路重新闭合; 在熔断器半打开状态[openWindow, timeout] 时,只要重试成功则重置上下文,断路器闭合。 注解介绍 @EnableRetry 表示是否开始重试。 序号 属性 类型 默认值 说明 1 proxyTargetClass boolean false 指示是否要创建基于子类的(CGLIB)代理,而不是创建标准的基于Java接口的代理。当proxyTargetClass属性为true时,使用CGLIB代理。默认使用标准JAVA注解 @Retryable 标注此注解的方法在发生异常时会进行重试 序号 属性 类型 默认值 说明 1 interceptor String ”” 将 interceptor 的 bean 名称应用到 retryable() 2 value class[] {} 可重试的异常类型 3 include class[] {} 和value一样,默认空,当exclude也为空时,所有异常都重试 4 exclude class[] {} 指定异常不重试,默认空,当include也为空时,所有异常都重试 5 label String ”” 统计报告的唯一标签。如果没有提供,调用者可以选择忽略它,或者提供默认值。 6 maxAttempts int 3 尝试的最大次数(包括第一次失败),默认为3次。 7 backoff @Backoff @Backoff() 重试补偿机制,指定用于重试此操作的backoff属性。默认为空 @Backoff 不设置参数时,默认使用FixedBackOffPolicy(指定等待时间),重试等待1000ms 序号 属性 类型 默认值 说明 1 delay long 0 指定延迟后重试 ,如果不设置则默认使用 1000 milliseconds 2 maxDelay long 0 最大重试等待时间 3 multiplier long 0 指定延迟的倍数,比如delay=5000l,multiplier=2时,第一次重试为5秒后,第二次为10秒,第三次为20秒(大于0生效) 4 random boolean false 随机重试等待时间 @Recover 用于恢复处理程序的方法调用的注释。返回类型必须与@retryable方法匹配。 可抛出的第一个参数是可选的(但是没有它的方法只会被调用)。 从失败方法的参数列表按顺序填充后续的参数。 用于@Retryable重试失败后处理方法,此注解注释的方法参数一定要是@Retryable抛出的异常,否则无法识别,可以在该方法中进行日志处理。 说明: 使用了@Retryable的方法不能在本类被调用,不然重试机制不会生效。也就是要标记为@Service,然后在其它类使用@Autowired注入或者@Bean去实例才能生效。 要触发@Recover方法,那么在@Retryable方法上不能有返回值,只能是void才能生效。 使用了@Retryable的方法里面不能使用try...catch包裹,要在发放上抛出异常,不然不会触发。 在重试期间这个方法是同步的,如果使用类似Spring Cloud这种框架的熔断机制时,可以结合重试机制来重试后返回结果。 Spring Retry不只能注入方式去实现,还可以通过API的方式实现,类似熔断处理的机制就基于API方式实现会比较宽松。 转载于:https://www.cnblogs.com/whatarewords/p/10656514.html

养狐狸的猫 2019-12-02 02:11:54 0 浏览量 回答数 0

回答

转自:思否 本文作者:Michael van der Gulik 原文链接:《Why WebAssembly is a big deal》 译者:敖小剑 WebAssembly 是每个程序员都应该关注的技术。WebAssembly 会变得更流行。 WebAssembly 将取代 JavaScript。WebAssembly 将取代 HTML 和 CSS。 WebAssembly 将取代手机应用。WebAssembly 将取代桌面应用。在 10 年内,我保证每个程序员至少需要知道如何使用工具来操作 WebAssembly 并理解它是如何工作的。 你可能会说,“太离谱了!” 好吧,请继续阅读。 什么是 WebAssembly 当前形式的 WebAssembly 是 Web 浏览器的新扩展,可以运行预编译代码…快速地。在 C ++ 中编写了一些小代码,然后使用 Emscripten 编译器将该代码编译为 WebAssembly。通过一些 Javascript 粘合,就可以在 Web 浏览器中调用这一小段代码,例如,运行粒子模拟。 WebAssembly 文件,扩展名为.wasm,本身是包含可执行指令的二进制格式。要使用该文件,必须编写一个运行某些 Javascript 的 HTML 文件来获取、编译和执行 WebAssembly 文件。WebAssembly 文件在基于堆栈的虚拟机上执行,并使用共享内存与其 JavaScript 包装器进行通信。 到目前为止,这似乎并不有趣。它看起来只不过是 JavaScript 的加速器。但是,聪明的读者会对 WebAssembly 可能成为什么有所了解。 WebAssembly 将成为什么? 第一个重要发现是 WebAssembly 是一个安全的沙盒虚拟机。可以从 Internet 运行喜欢的 WebAssembly 代码,而确保它不会接管 PC 或服务器。四个主流 Web 浏览器对它的安全性非常有信心,它已经默认实现并启用了。它的真正安全性还有待观察,但安全性是 WebAssembly 的核心设计目标。 第二个重要发现是 WebAssembly 是一个通用的编译目标。它的原始编译器是一个 C 编译器,这个编译器很好地指示了 WebAssembly 虚拟机的低级和可重定向性。许多编程语言都使用 C 语言编写虚拟机,其他一些语言甚至使用 C 本身作为编译目标。 此时,有人整理了一个可以编译为 WebAssembly 的编程语言列表。这份名单将在未来很多年中继续增长。 WebAssembly 允许使用任何编程语言编写代码,然后让其他人在任何平台上安全地运行该代码,无需安装任何内容。朋友们,这是美好梦想的开始。 部署问题 我们来谈谈如何将软件提供给用户。 为新项目选择编程语言的一个重要因素是如何将项目部署到客户。您的程序员喜欢用 Haskell,Python,Visual Basic 或其他语言编写应用程序,具体取决于他们的喜好。要使用喜欢的语言,他们需要编译应用,制作一些可安装的软件包,并以某种方式将其安装在客户端的计算机上。有许多方法可以提供软件 - 包管理器,可执行安装程序或安装服务,如 Steam,Apple App Store,Google Play 或 Microsoft store。 每一个安装机制都意味着痛苦,从应用商店安装时的轻微疼痛,到管理员要求在他的 PC 上运行一些旧的 COBOL 代码时的集群头痛。 部署是一个问题。对于开发人员和系统管理员来说,部署一直是一个痛点。我们使用的编程语言与我们所针对的平台密切相关。如果大量用户在 PC 或移动设备上,我们使用 HTML 和 Javascript。如果用户是 Apple 移动设备用户,我们使用……呃…… Swift?(我实际上不知道)。如果用户在 Android 设备上,我们使用 Java 或 Kotlin。如果用户在真实计算机上并且愿意处理掉他们的部署问题,那么我们开发人员才能在我们使用的编程语言中有更多选择。 WebAssembly 有可能解决部署问题。 有了 WebAssembly,您可以使用任何编程语言编写应用,只要这些编程语言可以支持 WebAssembly,而应用可以在任何设备和任何具有现代 Web 浏览器的操作系统上运行。 硬件垄断 想购买台式机或笔记本电脑。有什么选择?好吧,有英特尔,有 AMD。多年来一直是双寡头垄断。保持这种双寡头垄断的一个原因是 x86 架构只在这两家公司之间交叉许可,而且通常预编译的代码需要 x86 或 x86-64(也就是 AMD-64)架构。还有其他因素,例如设计世界上最快的 CPU 是一件很艰难但也很昂贵的事情。 WebAssembly 是一种可让您在任何平台上运行代码的技术(之一)。如果它成为下一个风口,硬件市场将变得商品化。应用编译为 WebAssembly,就可以在任何东西上运行 - x86,ARM,RISC-V,SPARC。即便是操作系统市场也会商品化;您所需要的只是一个支持 WebAssembly 的浏览器,以便在硬件可以运行时运行最苛刻的应用程序。 编者注:Second State 研发的专为服务端优化的 WebAssembly 引擎 SSVM 已经可以运行在高通骁龙芯片上。Github 链接:https://github.com/second-sta... 云计算 但等等,还有更多。云计算成为IT经理办公室的流行词已有一段时间,WebAssembly 可以直接迎合它。 WebAssembly 在安全沙箱中执行。可以制作一个容器,它可以在服务器上接受和执行 WebAssembly 模块,而资源开销很小。对于提供的每个服务,无需在虚拟机上运行完整的操作系统。托管提供商只提供对可以上传代码的WebAssembly 容器的访问权限。它可以是一个原始容器,接收 socket 并解析自己的 HTTP 连接,也可以是一个完整的 Web 服务容器,其中 WebAssembly 模块只需要处理预解析的HTTP请求。 这还不存在。如果有人想变得富有,那么可以考虑这个想法。 编者注:目前已经有人正在实现这个想法,Byte Alliance 计划将WebAssembly 带到浏览器之外,Second State 已经发布了为服务端设计的WebAssembly 引擎开发者预览版。 不是云计算 WebAssembly 足以取代 PC 上本地安装的大多数应用程序。我们已经使用 WebGL(又名OpenGL ES 2.0)移植了游戏。我预测不久之后,受益于WebAssembly,像 LibreOffice 这样的大型应用可以直接从网站上获得,而无需安装。 在这种情况下,在本地安装应用没什么意义。本地安装的应用和 WebAssembly 应用之间几乎没有区别。WebAssembly 应用已经可以使用屏幕,键盘和鼠标进行交互。它可以在 2D 或 OpenGL 中进行图形处理,并使用硬件对视频流进行解码。可以播放和录制声音。可以访问网络摄像头。可以使用 WebSockets。可以使用 IndexedDB 存储大量数据在本地磁盘上。这些已经是 Web 浏览器中的标准功能,并且都可以使用 JavaScript 向 WebAssembly 暴露。 目前唯一困难的地方是 WebAssembly 无法访问本地文件系统。好吧,可以通过 HTML 使用文件上传对话,但这不算。最终,总会有人为此创建 API,并可能称之为 “WASI”。 “从互联网上运行应用程序!?胡说八道!“,你说。好吧,这是使用 Qt 和 WebAssembly 实现的文本编辑器 (以及更多)。 这是一个简单的例子。复杂的例子是在 WebBrowser 中运行的 Adobe Premier Pro 或 Blender。或者考虑像 Steam 游戏一样可以直接从网络上运行。这听起来像小说,但从技术上说这并非不能发生。 它会来的。 让我们裸奔! 目前,WebAssembly 在包含 HTML 和 Javascript 包装器的环境中执行。为什么不脱掉这些?有了 WebAssembly,为什么还要在浏览器中包含 HTML 渲染器和 JavaScript 引擎? 通过为所有服务提供标准化 API,这些服务通常是 Web 浏览器提供的,可以创建裸 WebAssembly。就是没有 HTML和 Javascript 包装来管理的 WebAssembly。访问的网页是 .wasm 文件,浏览器会抓取并运行该文件。浏览器为WebAssembly 模块提供画布,事件处理程序以及对浏览器提供的所有服务的访问。 这目前还不存在。如果现在使用 Web 浏览器直接访问 .wasm 文件,它会询问是否要下载它。我假设将设计所需的 API 并使其工作。 结果是 Web 可以发展。网站不再局限于 HTML,CSS 和 Javascript。可以创建全新的文档描述语言。可以发明全新的布局引擎。而且,对于像我这样的 polyglots 最相关,我们可以选择任何编程语言来实现在线服务。 可访问性 但我听到了强烈抗议!可访问性怎么样??搜索引擎怎么办? 好吧,我还没有一个好的答案。但我可以想象几种技术解决方案。 一个解决方案是我们保留内容和表现的分离。内容以标准化格式编写,例如 HTML。演示文稿由 WebAssembly 应用管理,该应用可以获取并显示内容。这允许网页设计师使用想要的任何技术进行任意演示 - 不需要 CSS,而搜索引擎和需要不同类型的可访问性的用户仍然可以访问内容。 请记住,许多 WebAssembly 应用并不是可以通过文本访问的,例如游戏和许多应用。盲人不会从图像编辑器中获得太多好处。 另一个解决方案是发明一个 API,它可以作为 WebAssembly 模块,来提供想在屏幕上呈现的 DOM,供屏幕阅读器或搜索引擎使用。基本上会有两种表示形式:一种是在图形画布上,另一种是产生结构化文本输出。 第三种解决方案是使用屏幕阅读器或搜索引擎可以使用的元数据来增强画布。执行 WebAssembly 并在画布上呈现内容,其中包含描述渲染内容的额外元数据。例如,该元数据将包括屏幕上的区域是否是菜单以及存在哪些选项,或者区域是否想要文本输入,以及屏幕上的区域的自然排序(也称为标签顺序)是什么。基本上,曾经在 HTML 中描述的内容现在被描述为具有元数据的画布区域。同样,这只是一个想法,它可能在实践中很糟糕。 可能是什么 1995年,Sun Microsystems 发布了 Java,带有 Java applets 和大量的宣传。有史以来第一次,网页可以做一些比 和 GIF 动画更有趣的事情。开发人员可以使应用完全在用户的 Web 浏览器中运行。它们没有集成到浏览器中,而是实现为繁重的插件,需要安装整个 JVM。1995年,这不是一个小的安装。applets 也需要一段时间来加载并使用大量内存。我们现在凭借大量内存,这不再是一个问题,但在 Java 生命的第一个十年里,它让体验变得令人厌烦。 applets 也不可靠。无法保证它们会运行,尤其是在用户使用 Microsoft 的实现时。他们也不安全,这是棺材里的最后一颗钉子。 以 JVM 为荣,其他语言最终演变为在 JVM 上运行。但现在,那艘船航行了。 FutureSplash / Macromedia / Adobe Flash 也是一个竞争者,但是是专有的,具有专有工具集和专有语言的专有格式。我读到他们确实在2009年开启了文件格式。最终从浏览器中删除了支持,因为它存在安全风险。 这里的结论是,如果希望您的技术存在于每个人的机器上,那么安全性就需要正视。我真诚地希望 WebAssembly 作为标准对安全问题做出很好的反应。 需要什么? WebAssembly 仍处于初期阶段。它目前能很好的运行代码,而规范版本是 1.0,二进制格式定型。目前正在开展SIMD 指令支持。通过 Web Workers 进行多线程处理也正在进行中。 工具可用,并将在未来几年不断改进。浏览器已经让你窥视 WebAssembly 文件。至少 Firefox 允许查看WebAssembly 字节码,设置断点并查看调用堆栈。我听说浏览器也有 profiling 支持。 语言支持包括一套不错的语言集合–C,C++和Rust是一流的公民。C#,Go和Lua显然有稳定的支持。Python,Scala,Ruby,Java和Typescript都有实验性支持。这可能是一个傲慢的陈述,但我真的相信任何想要在21世纪存在的语言都需要能够在 WebAssembly 上编译或运行。 在访问外部设备的 API 支持方面,我所知道的唯一可用于裸 WebAssembly 的 API 是 WASI,它允许文件和流访问等核心功能,允许 WebAssembly 在浏览器外运行。否则,任何访问外部世界的 API 都需要在浏览器中的 Javascript 中实现。除了本地机器上的文件访问,打印机访问和其他新颖的硬件访问(例如非标准蓝牙或USB设备)之外,应用所需的一切几乎都可以满足。“裸WebAssembly”并不是它成功的必要条件; 它只是一个小的优化,不需要浏览器包含对 HTML,CSS 或 Javascript 的支持。 我不确定在桌面环境中让 WebAssembly 成为一等公民需要什么。需要良好的复制和粘贴支持,拖放支持,本地化和国际化,窗口管理事件以及创建通知的功能。也许这些已经可以从网络浏览器中获得; 我经常惊讶与已经可能的事情。 引发爆炸的火花是创建允许现有应用移植的环境。如果创造了“用于 WebAssembly 的 Linux 子系统”,那么可以将大量现有的开源软件移植到 WebAssembly 上。它需要模拟一个文件系统 - 可以通过将文件系统的所有只读部分都缓存为 HTTP 请求来完成,并且所有可写部分都可以在内存中,远程存储或使用浏览器可以提供的任何文件访问。图形支持可以通过移植 X11 或 Wayland 的实现来使用 WebGL(我理解已经作为 AIGLX 存在?)。 一些 SDL 游戏已经被移植到 WebAssembly - 最着名的是官方演示。 一旦 JVM 在 WebAssembly 中运行,就可以在浏览器中运行大量的 Java 软件。同样适用于其他虚拟机和使用它们的语言。 与 Windows 软件的巨大世界一样,我没有答案。WINE 和 ReactOS 都需要底层的 x86 或 x86-64 机器,所以唯一的选择是获取源代码并移植它,或者使用 x86 模拟器。 尾声 WebAssembly 即将到来。 它来得很慢,但现在所有的部分都可以在你正在使用的浏览器上使用。现在我们等待构建用于从各种编程语言中定位 WebAssembly 的基础设施。一旦构建完成,我们将摆脱 HTML,CSS 和 Javascript 的束缚。 加入阿里云钉钉群享福利:每周技术直播,定期群内有奖活动、大咖问答 阿里云开发者社区

茶什i 2020-01-07 10:32:35 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 SQL审核 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 人工智能 阿里云云栖号 云栖号案例 云栖号直播