首页 文章 精选 留言 我的

精选列表

搜索[工作],共10007篇文章
优秀的个人博客,低调大师

Java注解@Cacheable的工作原理

In order to avoid unnecessary query on database it is a common pattern to define a cache in application layer to cache the query result from database. See one example below. Here the application cache is maintained in a custom class CacheContext. public class AccountService1 { private final Logger logger = LoggerFactory.getLogger(AccountService1.class); private CacheContext<Account> accountCacheContext; public Account getAccountByName(String accountName) { Account result = accountCacheContext.get(accountName); if (result != null) { logger.info("get from cache... {}", accountName); return result; } Optional<Account> accountOptional = getFromDB(accountName); if (!accountOptional.isPresent()) { throw new IllegalStateException(String.format("can not find account by account name : [%s]", accountName)); } Account account = accountOptional.get(); accountCacheContext.addOrUpdateCache(accountName, account); return account; } In Spring there is an annotation @Cacheable which can make the cache managed by Spring instead of application developer. See improved version: public class AccountService2 { private final Logger logger = LoggerFactory.getLogger(AccountService2.class); @Cacheable(value="accountCache") public Account getAccountByName(String accountName) { logger.info("in method getAccountByName, querying account... {}", accountName); Optional<Account> accountOptional = getFromDB(accountName); if (!accountOptional.isPresent()) { throw new IllegalStateException(String.format("can not find account by account name : [%s]", accountName)); } return accountOptional.get(); } In this example, there is no more cache evaluation and cache fill logic. All such stuff are taken over by Spring under the hood and completely transparent to application developer, with the help of following bean configuration in xml: <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager"> <property name="caches"> <set> <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"> <property name="name" value="default" /> </bean> <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"> <property name="name" value="accountCache" /> </bean> </set> </property> </bean> And how to research what magic has been done by Spring to achieve this behavior?We use the following code to research. It is expected that the request sent by line 31 will directly reach database, while the second request in line 34 will be handled by Spring cache handler. Here in line 31, in debugger we can find that accountService2 is not an instance of application class com.sap.AccountService2, but a dynamic proxy class generated by Spring. As a result after pressing F5, the intercept method of this dynamic proxy class is called: In this method, the execution will be delegated to Spring cache handler class: In example 1, the logic of cache evaluation and fill is done by application, and now it is done in method execute below. First internal cache managed by Spring is checked in line 336 via method findCachedItem. Due to expected cache miss, our application method will be called as usual via reflection, as demonstrated below: After application method to retrieve account from database is done, the result, Account instance with id 2495 is filled to Spring cache, the variable contexts below. Below is the screenshot for Spring internal cache to store application data, which is based on ConcurrentHashMap. Our cached Account instance with id 2495 could be found there. For the second query request issued by application, the cached result will be returned by Spring handler: The last question is, how and when the dynamic proxy is generated?Again let’s go to the entry point of Beans initialization: Here the dynamic proxy is created based on configuration defined in xml with the help of CGlibAopProxy. For more detail about CGlibAopProxy, please refer to Spring official document. 本文来自云栖社区合作伙伴“汪子熙”,了解相关信息可以关注微信公众号"汪子熙"。

优秀的个人博客,低调大师

接口开发前准备工作

调用集成接口前,请检查是否已经实现以下步骤,入驻平台等步骤已实现可忽略。 注:如果还没有签约或者在签约审核过程中可以使用沙箱环境测试接口。 一、平台入驻 1、使用支付宝账号入驻开放平台。 注册支付宝账号并完成实名认证,如已有支付宝账号请选择下一步入驻流程。 如何注册认证支付宝:[url]https://render.alipay.com/p/f/fd-izs2wfru/index.html[/url] 现在去注册:[url]https://memberprod.alipay.com/account/reg/index.htm[/url] 2、支付宝账号登录开放平台,完善开发者信息,在线签署协议,即可完成入驻。 现在去入驻:[url]https://open.alipay.com/platform/setting.htm[/url] 入驻平台时需选

优秀的个人博客,低调大师

日常开发工作快照(三)

IntelliJ IDEA是java语言的开发集成环境,在业界被公认为最好的java开发工具,没有之一,MyEclipse在它面前绝对是弱爆了,谁用谁知道,唯一的缺点是太占资源,8G内存是标配。衡量一个java工程师的技术水平只要问问他用什么开发工具就知道了,反正哥自己用的是MyEclipse 2015。 1、跳过测试编译:在窗体右侧Maven Projects窗口中点击Execute Maver Goal对话框中输入install或install -DskipTests忽略测试。 2、发布包并上传仓库:在pom.xml文件中修改工程版本号,执行deploy命令参数同上将发布的jar包自动上传至仓库。 3、位scala工程打包:点击菜单file选择Project Structure在选择Artifacts点击“+”符号进行增加操作,在输出方式中选择JAR -> From modules with dependencies ...方式,在Main Class中选择主类,点击OK确定,在菜单中Build中点击Build Artifacts在Action中选择具体的操作行为。 4、设置界面背景色:在setting中选择Appearance&Behavior中的Appearance,在Theme下拉列表中选择背景色。 5、设置快捷键风格:在setting中选择keymap,并在下拉列表中选择习惯的快捷键如MyEclipse风格的快捷键。 6、设置字体及字号:在setting中选择Editor,在Colors&Fonts中的Font右侧修改字体和字号。 7、显示代码行号:在setting中Editor中选择General,在下面Appearance右栏中找到Show line numbers,选中点击OK。 8、安装第三方插件:在setting中选择plugins,在右栏中查找需要安装的插件名称,执行安装操作。 9、kafka生产者写入数据提示:Failed to send messages after 3,打开server.properties配置文件,找到host.name配置,将localhost修改为本机IP地址,重启kafka服务。 10、Redis存储key为utf8时启动命令为:./redis-cli --raw 11、mongo数据库导入导出./mongodump -h 127.0.0.1:27017 -d 库名称 -o输出路径;./mongorestore -h 127.0.0.1:27017 备份路径 12、JAVA操作mysql中文乱码问题 a、/etc/my.conf文件[mysql]块中添加default-character-set=utf8保存后重启服务; b、通过jdbc方式连接库时加参数?useUnicode=true&characterEncoding=utf8; c、建库建表设置字符集为utf8,Coltation选择utf8_unicode_ci; 13、mysql远程登录本地命令行中文乱码问题,a、show variables like 'character_set_%'来查看当前字符集;b、set character_set_results='utf8'来设置字符集; 14、SSH隧道加代理访问问题 a、在xshell中SSH中Tunneling对话框中Type选择Dynamic的Sock4/5方式,默认端口及加入备注信息; b、在浏览器设置代理,选择“连接”标签,点击“局域网设置”,在代理服务器中点高级,在套接字中输入localhost端口1080后保存;

优秀的个人博客,低调大师

日常开发工作快照(二)

1、C++调用kafka的C语言动态库报错undefined reference:extern "C" {#include <rdkafka.h>}方式进行声明。 2、javac编译报错类can not be resolved to a type:在/etc/environment文件中添加CLASSPATH=.表示在当前目录下查找类文件。 3、javah生成jni头文件:javah 类名(不加class)声明头文件结果例如JNIEXPORT jint JNICALL Java_com_xxx_data_GtTool_JniGtFunction(int, jstring); 4、postgres数据库远程pgAdmin配置: a、编辑/var/lib/pgsql/data/pg_hda.conf文件在IPV4下添加host all all 0.0.0.0 0.0.0.0 md5 b、编辑同路径下postgresql.conf文件将tcpip_socket=off改为on c、创建用户su postgre后createuser -P用户名,设置密码后重启服务 5、磁盘阵列卸载与挂载: a、df -lh查看当前挂载信息 b、使用umount挂载路径指令完成卸载操作,如果提示忙致卸载失败,lsof挂载路径查看当前进程占用信息杀进程或fuser -k 挂载路径结束占用 c、使用service nfs restart重启服务 d、使用mount磁盘 挂载目录完成挂载操作 6、avro序列化C动态库安装: a、进入安装目录mkdir build创建目录后进入 b、cmake ..默认以上级路径进行编译操作 c、make执行编译,make test对测试用例进行编译 d、make install将结果安装到默认路径下 7、librdkafka动态C库安装: a、编辑Makefile文件删除16行-Werror参数 b、删除子目录examples的Makefile文件第四行-Werror参数 c、make;make install执行编译操作并将结果复制到默认路径下 8、libkafka动态C++库安装: a、执行./configurea--disable-gtest命令 b、打开./lib/src/Packet.cc文件275行第四个参数添加强制类型装换(size_t*) c、make;make install执行编译并将结果复制到默认路径下 9、vim编辑器增加插件: a、下载omnicppcomplete并在用户家路径下创建.vim隐藏目录并解压缩 b、在用户家路径下创建.ctags隐藏文件并输入配置信息 --c++-kinds=+p --fields=+iaS --extra=+q c、通过ctags -R 路径生成tags文件 d、在/etc/vimrc文件中增加相关配置 set nocp "omnicppcomplete filetype plugin on "omnicppcomplete set tags+=路径 "文件名 e、set completeopt=menuone,menu,longest用于控制是否在当前窗口上面显示相关信息 f、au CurSorMovedI,InsertLeave * if pumvisible()==o|silent! pclose|endif用于控制在输入完毕以后是否自动关闭窗口上方显示的相关信息 10、golang实现protobuf编译:protoc --go_out=. 文件名.proto,生成文件名.pb.go目标文件 11、mongodb数据库C语言开发包安装: a、执行./autogen.sh --with-libbson=bundled生成configure文件进行编译 b、报错m4_esyscmd_s等需要首先安装m4-1.4.17.tar.gz包,以及autoconf-2.69.tar.gz包 c、libbson和libmongoc文件默认保存在/usr/local/lib路径下 12、mongodb启动参数说明: a、--storegeEngine mmapvi指定存储引擎类型,系统默认wiredTiger值 b、--logpath参数指定日志存储路径 c、--fork参数指定是否将进程放置在后台以daemon方式运行 13、mongodb报错套接字错误:删除/data/db/mongod.lock文件 14、git服务器搭建: a、yum install git下载并安装若缺少组件可以git-all b、用户各自创建密钥在用户.ssh目录下存在id_rsa和id_rsa.pub文件,将pub公钥复制到/home/git/.ssh/authoried_keys文件中一个用户一行 c、进入/srv路径下创建空仓git init --bare 项目名.git d、chown -R git.git 项目.git修改权限 e、远程执行git clone git@192.168.0.100:/srv/项目.git拉取 15、gitweb服务搭建: a、yum install gitweb b、vim /etc/httpd/conf.d/git.conf第一行Alias /git /var/www/git中git改为gitweb c、vim /etc/gitweb/conf文件找到#our $projectroot行接触屏蔽并改值为/srv d、页面显示'\r',打开/var/www/git/gitweb.css文件加入块信息.cntrl{display:none;} e、重启httpd服务,无法访问尝试关闭防火墙 16、mysql服务搭建: a、执行rpm -qa | grep -i mysql查看安装情况 b、执行rpm -ivh mysql-community-release-el6-5.noarch.rpm c、执行yum -y install mysql-server后启动服务即可 17、elk5.1.1服务搭建: a、es启动报错max file descriptors[4096] ... 及max number of threads[1024] ...打开/etc/security/limits.conf文件添加soft nofiile 65536\n hard nofile 131072\n softnproc 2048和hard nproc 4096,打开/etc/security/limits.d/q0-nproc.conf文件soft nproc 1024改为soft nproc 2048,打开/etc/sysctl.conf文件添加vim.max_map_count=655360 b、打开es配置文件设置node.name=名称network.host本地地址http.port端口 c、logstash配置文件设置input和output块 d、kibana设置server.port、server.host和elasticsearch.url值 补充说明: e、以redis作为消息队列组件格式见logstash配置文件定义地址端口键数据类编码和标签等 f、es启动不能使用root用户,./bin/elasticsearch -d将进程放入后台,使用curl -X GET https://192.168.0.100:9200进行测试 g、在logstash配置文件中设置好input和output后./bin/logstash -f config/logstash.conf & h、编辑kibana配置文件后执行./bin/kibana -c config/kibana.yml &在5601端口接受服务 18、git给工程打版本tag: a、在含有git信息的工程代码路径下执行git tag 标签名称 b、执行git push origin --tags输入密码后提交 19、ssh-keygen命令:第一步确认公钥存放路径、第二步输入密码、第三步再次输入密码,公钥生成完毕 20、linux系统时间修改: a、date -s 2017-06-01 b、date -s 09:00:00 c、date -s "2017-06-01 09:00:00" 21、jsoncpp库安装: a、下载SCONS工具解压缩export MYSCONS=解压缩路径,设置export SCONS_LIB_DIR=$MYSCONS/engine b、下载jsoncpp包解压缩进入包目录,执行python $MYSCONS/script/scons platform=linux-gcc c、libs目录下/linux-gcc-4.4.7下包含静态库和动态库文件各一个,将文件复制到/usr/lib下,将include下文件复制到/usr/local/include下

优秀的个人博客,低调大师

日常开发工作快照(一)

1、C、C++挂载libxml.so动态库参数:`xml2-config --cflags --libs` 2、linux终端设置内核参数:sysctl -w kernel.shmmax=xxx; sysctl -w kernel.shmall=xxx; 3、sort排序: sort file1 > file2; 排重排序:sort -u file1 > file2; 提取重复留存一份:sort file1 | uniq -d > file2; 丢弃全部重复数据:sort file1 | uniq -u > file2; 4、linux终端设置coredump:ulimit -c unlimited,(进程中务必关闭信号处理) 5、java本地化:gcj --main=含有main方法类名称 file1.java file2.java filen.java 库文件 a、gcj -C file.java b、gcj -c file1.class 库.jar -o 目标文件.o c、gcj --main=类 -o 执行文件 目标文件.o 6、linux管理员账户密码修改:GRUB引导界面按e键选择一项,再按e键进入编辑状态后在行尾输入“/ single”,按b键引导成功后passwd root修改密码。 7、crontab编辑:crontab -e进入编辑状态,定时服务运行失败多是动态库路径加载失败导致,可在脚本中添加export LD_LIBRARY_PATH=/usr/local/lib之类语言。 8、查看进程动态库加载状态:ldd 执行文件,Not found表示库路径加载失败需要手动配置。 9、mysql提示host is not allowed to connect to this mysql server错误:对mysql进行授权操作GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; 10、linux设置字符集:locale -a,在.bash_profile文件中加入export LANG=en_US 11、linux修改消息队列内核参数: a、/proc/sys/kernel目录下msgmax定义单个消息最大值默认8192,msgmnb定义消息队列最大保存至默认16384,msgmni定义可创建消息队列总数。 b、echo 新值 > /proc/sys/kernel/文件名修改 c、编辑/etc/sysctl.conf文件添加kernel.msgmax=新值;kernel.msgmnb=新值重启系统 12、g++报错undefined reference to '-Unwind Resume':编译时添加参数-WL, -Bdynamic -lgcc_s 13、linux服务器代理设置: a、编辑/etc/squid/squid.conf文件http_port 3128为http_port 本机地址:3128 transparent b、找到visible_hostname行下增加visibel_hostname 本机地址 c、检查DNS设置/etc/resolv.conf文件nameserver DNS服务器地址 d、service squid start启动代理服务 14、gdb调试锁定线程:set scheduler-locking off|on|step 15、添加动态库路径: a、打开/etc/ld.so.conf文件或在/etc/ld.so.conf.d路径下创建conf扩展文件 b、写入动态库绝对路径如/usr/hadoop/c++/linux-i386 ... c、sudo /sbin/ldconfig -v 16、samba安装 a、yum install samba b、useradd 用户名 c、smbpasswd 密码或smbpasswd -a 用户名 d、service samba start 配置或关闭SElinux:setenforce 0 17、dmesg和addr2line定位异常: a、dmsg打印错误数据如GtDemo[48997] trap divide error ip:41cdf1 sp:7f0a80da4410 error:0 in GtDemo[4000000+2900] b、使用addr2line -e GtDemo 41cdf1打印报错文件行号 c、使用readelf -w GtDemo打印DWARF格式数据如special opcode 146:advance Address by 10 to 0x4004fe and line by 1 to 5 18、抓取VLAN报文分析:tcpdump -i eth0 vlan and dst port 80 -w 文件名,其中vlan可以是vlan100或vlan200等参数 19、vim编辑器golang语法高亮: a、确认go/misc路径下存在vim路径且存在go.vim文件 b、配置GOROOT环境变量并按照《go语言编程》第八章开发工具第三小节188页创建脚本 20、go语言编译方法: a、go run 文件名.go(直接运行) b、go build 文件名.go(生成可执行文件非main包不生成) c、go install 文件名.go(main包生成执行文件其余在pkg下生成静态文件) 21、gdb调试golang: a、go build -gcflags "-N -l "文件名.go进行编译关闭内联优化 b、gdb 可执行文件,开始调试gdb需7.1及以上版本,list需l main.main方式调用 22、mongodb启动:/usr/local/mongodb-3.2.8/bin/mongod --storageEngine mmapv1 --logpath /usr/local/mongodb-3.2.8/db.log --fork 23、hive建表与数据导入: a、hive --service cli与远程hiveserver连接 b、show databases查看数据库,show tables查看表 c、create table 表名 (字段名 类型, ...... )row format delimited fields terminated by '\t'; d、load data local input '/home/data.log' overwrite into table 表名; 24、myeclipse远程调试: a、远程服务启动附加参数-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=9999 b、参数后附加-cp 路径/工程名.jar等信息 c、开发环境中点击debug选择debug configurations选择myeclipse externally launched server左上角new launch configuration新建远程调试配置 d、connection properties中填入host和port连接信息 e、在source标签中add添加java project工程勾选后开始调试 25、kafka报错Failed to send messages after 3:打开server.properties文件,找到host.name配置将localhost修改为本机地址并重启kafka服务。 26、redis乱码:./redis-cli --raw 27、mongodb数据库备份: a、./mongodump -h 127.0.0.1:27017 -d库名称 -o输出路径 b、./mongorestore -好27.0.0.1:27017 -d库名称 备份路径 28、java操作mysql中文乱码: a、/etc/my.conf文件[mysqld]块中添加default-character-set=utf8保存重启 b、jdbc连接附加参数?useUnicode=true&characterEncoding=utf8 c、建库建表设置字符集为utf8,colltation选择utf8_unicode_c 29、mongodb创建索引: a、db.表名.ensureIndex({"字段名":1}),1代表升序,-1代表降序 b、db.表名.ensureIndex({"字段名":1},{unique:true}),不能插入唯一索引项上已经存在的记录 c、db.表名.ensureIndex({"字段名":1},{unique:true,dropDups:true}) d、db.表名.dropIndex({"字段名":1})删除已经创建的索引 30、mysql本地登录中文乱码: a、show variables like 'character_set_%';查看字符集 b、set character_set_results='utf8';设置字符集

优秀的个人博客,低调大师

02Docker准备工作

准备 简介:Docker系统有两个程序:docker服务端和docker客户端。其中docker服务端是一个服务进程,管理着所有的容器。 准备开始 目标: 提示: 正确的命令: 准备开始 Docker系统有两个程序:docker服务端和docker客户端。其中docker服务端是一个服务进程,管理着所有的容器。docker客户端则扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。大部分情况下,docker服务端和客户端运行在一台机器上。 目标: 检查docker的版本,这样可以用来确认docker服务在运行并可通过客户端链接。 提示: 可以通过在终端输入docker命令来查看所有的参数。 官网的在线模拟器只提供了有限的命令,无法保证所有的命令可以正确执行。 正确的命令: $docker version

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册