首页
友链
关于
免责声明
Search
1
王者营地战绩数据王者荣耀查询网页源码
6,211 阅读
2
群晖Active Backup for Business套件备份Linux服务器教程
4,384 阅读
3
影视分享
4,313 阅读
4
(亲测)Jrebel激活破解方式2019-08-21
4,290 阅读
5
centos7 安装及卸载 jekenis
3,573 阅读
日常
文章
后端
前端
Linux
异常
Flutter
分享
群辉
登录
Search
标签搜索
docker
springboot
Spring Boot
java
linux
Shiro
Graphics2D
图片
游戏账号交易
Mybatis
Spring Cloud
centos
脚本
Web Station
群辉
王者营地
战绩查询
平台对接
Spring Cloud Alibaba
nacos
绿林寻猫
累计撰写
249
篇文章
累计收到
26
条评论
首页
栏目
日常
文章
后端
前端
Linux
异常
Flutter
分享
群辉
页面
友链
关于
免责声明
搜索到
195
篇与
后端
的结果
2021-12-08
WebService(一)
Web Service——也叫XML Web Service WebService,是一种跨编程语言和跨操作系统平台的远程调用技术。各个应用程序之间的交流就需要Web Service来作为相互交流的桥梁。Web Service是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。XML:(Extensible Markup Language)扩展型可标记语言。面向短期的临时数据处理、面向万维网络,是Soap的基础。Soap:(Simple Object Access Protocol)简单对象存取协议。是XML Web Service 的通信协议。当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。基本的 Web services 平台是 XML + HTTP。WSDL:(Web Services Description Language) WSDL 文件是一个 XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。大多数情况下由软件自动生成和使用。WSDL 是基于 XML 的用于描述 Web Services 以及如何访问 Web Services 的语言。UDDI:UDDI 是一种目录服务,通过它,企业可注册并搜索 Web services。XML+XSD、SOAP和WSDL就是构成WebService平台的三大技术。 所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。所谓远程调用,就是一台计算机a上的一个程序可以调用到另外一台计算机b上的一个对象的方法,譬如,天气预报系统,淘宝网,校内网,百度等把自己的系统服务以Web Service服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能,这样扩展了自己系统的市场占有率。 Web Service开发可以分两方面服务端开发:把公司内部系统的业务方法发布成Web Service服务,供远程合作单位和个人调用。客户端开发:调用别人发布的Web Service服务,大多数人从事的开发都属于这个方面。例如,调用天气预报Web Service服务。 JAVA使用jdk开发WebService服务器端(注:使用jdk开发时,jdk版本为1.6及以上) 第一步:创建Java工程 ,创建相应的包(服务端)第二步:创建一个公开的接口,写方法(注:使用@WebService注解标注接口,使用WebMethod注解标注接口中的方法) package Test; import javax.jws.WebMethod; import javax.jws.WebService; /** * @ClassName: Test_WebSweviceI * @Description: TODO(webservice终端) * @author Uncle * @date 2018年9月18日 下午6:05:44 * */ @WebService public interface Test_WebSweviceI { /** * * @Title: getUserById * @Description: 通过uid得到用户信息 * @param uid * @return String * @author Uncle * @date 2018年9月18日下午6:32:12 */ @WebMethod public String getUserById(int uid); } 第三步:编写接口的实现类,使用@WebService注解标注实现类,并实现接口所有方法:package Test; import javax.jws.WebService; /** * @ClassName: Test_WebService * @Description: TODO(webservice实现类) * @author Uncle * @date 2018年9月18日 下午6:05:12 * */ @WebService public class Test_WebServiceImpl implements Test_WebSweviceI{ /* (非 Javadoc) * <p>Title: getUserById</p> * <p>Description: </p> * @param uid * @return * @see Test.Test_WebSweviceI#getUserById(int) */ public String getUserById(int uid) { // TODO Auto-generated method stub //通过这个方法拿取的数据 String str = "哈哈哈哈哈哈"; return str; } } 第四步:写发布类,使用Endponit(终端)类发布(注:发布服务:通过Endpoint类提供的publish()方法发布,发布时要保证使用的端口号没有被其他应用程序占用,Endpoint类是端点类,用来标识网络地址,IP地址是本机动态地址。)package Test; import javax.xml.ws.Endpoint; /** * @ClassName: Publish * @Description: TODO(发布) * @author Uncle * @date 2018年9月18日 下午6:10:10 * */ public class Publish { public static void main(String[] args) { String url="http://本地ip地址:1999/web/webservice"; Endpoint.publish(url, new Test_WebServiceImpl()); System.out.println("ok"); } } 第五步:使用Eclipse自带的工具测试服务端1.选择Luanch the Web Service Explorer2.选择WSDL Page,打开WSDL3.测试方法 打开浏览器也可通过http://本地ip地址:1999/web/webservice?wsdl 查看 客户端(终端)访问WebService访问别人提供的方法,在http://www.webxml.com.cn网站上有很多公开的方法我们就来测试一个天气的WEB服务 可以看到公开了很多可使用的方法,我们就拿getWeather测试1.点击更多点击选中的为wsdl结尾的链接可以得到对应的xml,我个人一般情况下都是把此文件保存到本地再通过命令生成代码,因为某些情况下可能需要改此xml文件在打开的页面:ctrl+s 保存到文件夹 可以看到文件已经保存下来 此时我们跑到Eclipse工作空间,找到对应的项目,下的文件夹中按住shift点击右键打开命令窗口在cmd命令窗口执行下述命令生成客户端代码: wsimport -keep -d D:\WorkSpace\Hibernate\Web_Service1\target\test-classes\Test -s D:\WorkSpace\Hibernate\Web_Service1\src\test\java -verbose d:/WeatherWS.xml -keep:是否生成java源文件-d:指定.class文件的输出目录-s:指定.java文件的输出目录-p:定义生成类的包名,不定义的话有默认包名-verbose:在控制台显示输出信息-b:指定jaxws/jaxb绑定文件或额外的schemas-extension:使用扩展来支持SOAP1.2 解析当中可能会报错:(根据错误提示删除xml对应的信息再解析)再次解析可以看见文件已生成 --------------测试------------package Test; import java.util.List; import cn.com.webxml.ArrayOfString; import cn.com.webxml.WeatherWS; import cn.com.webxml.WeatherWSSoap; /** * @Title: Test.java * @Package Test * @Description: TODO(用一句话描述该文件做什么) * @author Uncle * @date 2018年9月18日 下午9:56:57 * @version V1.0 */ public class Test { public static void main(String[] args) { //找到xml中wsdl:service <wsdl:service name="WeatherWS"> //获得服务 WeatherWS ws = new WeatherWS(); //SOAP 指简易对象访问协议 WeatherWSSoap soap = ws.getWeatherWSSoap(); //soap.getWeather("长沙", "")的返回类型是ArrayOfString 用getString()转成list List<String> list = soap.getWeather("长沙", "").getString(); for (String s : list) { System.out.println(s); } } } 结果:可以看到控制台根据查询输出了对应信息---------------------------------------------------------------------------以上就是使用JDK开发WebService及客户端(终端)访问WebService,下次再写使用Axis2框架开发
2021年12月08日
265 阅读
0 评论
0 点赞
2021-12-08
Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException
1.进入redis的src目录下 输入:./redis-cli将受保护模式选项设置为“no”,为了让服务器开始从外部接受连接输入:config set protected-mode "no"
2021年12月08日
274 阅读
0 评论
0 点赞
2021-12-08
Intellij IDEA使用破解补丁激活(最新)
首先下载IDEA:https://www.jetbrains.com/idea/下载破解补丁: https://pan.baidu.com/s/1C_YTnx2BZGI-0BOKivQW0g 提取码: w6mt 把下载的jar包导入进IDEA安装路径在idea.exe.vmoptions和idea64.exe.vmoptions两个文件最后一行添加:-javaagent:C:\software\ideaIU-2018.2.4.win\bin\JetbrainsCrack-3.1-release-enc.jar 修改Activation Code选择:添加:ThisCrackLicenseId-{ "licenseId":"ThisCrackLicenseId", "licenseeName":"(这里填你的名称→)Uncle", "assigneeName":"", "assigneeEmail":"(这里随便填一个游戏→)idea@163.com", "licenseRestriction":"For This Crack, Only Test! Please support genuine!!!", "checkConcurrentUse":false, "products":[ {"code":"II","paidUpTo":"3000-12-31"}, {"code":"DM","paidUpTo":"3000-12-31"}, {"code":"AC","paidUpTo":"3000-12-31"}, {"code":"RS0","paidUpTo":"3000-12-31"}, {"code":"WS","paidUpTo":"3000-12-31"}, {"code":"DPN","paidUpTo":"3000-12-31"}, {"code":"RC","paidUpTo":"3000-12-31"}, {"code":"PS","paidUpTo":"3000-12-31"}, {"code":"DC","paidUpTo":"3000-12-31"}, {"code":"RM","paidUpTo":"3000-12-31"}, {"code":"CL","paidUpTo":"3000-12-31"}, {"code":"PC","paidUpTo":"3000-12-31"} ], "hash":"2911276/0", "gracePeriodDays":7, "autoProlongated":false}确认之后,重启IDEA,查看: 至此激活成功
2021年12月08日
96 阅读
0 评论
0 点赞
2021-12-08
Mybatis介绍
MyBatis简介MyBatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。MyBatis可以使用简单的XML或注解进行配置和原始映射,以将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库的记录。ORM 对象/关系映射ORM(Object/Relation Mapping)即对象/关系映射。当使用面向对象开发时,从项目一开始就采用的是面向对象分析、面向对象设计、面向对象编程等,但到了持久层数据访问时,又必须重返关系数据库的访问方式,这是一种非常糟糕的感觉。于是人们需要一种工具,它可以把关系数据库包装成面向对象的模型,这个工具就是ORM。 注意:采用ORM框架之后,应用程序不再直接访问底层数据库,而是以面向对象的方式操作持久化对象(例如创建、修改、删除等),而ORM框架则将这些面向对象的操作转换成底层的SQL操作。基本映射方式ORM工具提供了持久化类和数据库之间的映射关系,通过这种映射关系,程序员可以很方便地通过持久化类实现对数据表的操作。数据表映射类持久化类被映射到一个数据表。程序使用这个持久化类来创建实例,修改属性,删除实例时,系统自动转换为对这个表进行CURD操作。通俗讲:在应用程序中操作实体类,就是操作数据表。 流行的ORM框架JPA:JPA本身只是一种ORM规范,并不是ORM产品。相对于其他开源ORM框架,JPA最大优势在于它是官方标准,因此具有通用性。 Hibernate:流行的开源ORM框架,被选为JBoss的持久层解决方案,已属于JBoss,而JBoss则加入了Red Hat组织,因此Hibernate属于Red Hat的一部分。 MyBatis(早期名称是iBATIS):Apache软件基金组织的子项目,它是一种“SQL Mapper”框架,它是一种“半自动化”的ORM的实现。 MyBatis与Hibernate的区别Hibernate:是一个标准ORM框架,入门门槛较高,不需要程序写SQL语句(会自动生成)。对SQL语句进行优化、修改比较困难。应用场景:适用于需求变化不多的中小型项目,比如:后台管理、ERP、ORM、OA... MyBatis:专注于SQL本身,需要程序员自己编写SQL语句,SQL优化、修改比较方便。MyBatis是一个不完全的ORM框架,也可实现映射(输入映射、输出映射)。应用场景:适用于需求变化较多的项目,比如:互联网项目 JDBC与Hibernate、MyBatis:JDBC目前极少用到,因为需要提供太多的代码,操作太多的对象,麻烦不说,还极其容易出错。Hibernate的缺陷也十分明显,多表关联复杂SQL,数据系统权限限制,根据条件变化的SQL。Hibernate适用场景不太复杂,要求性能不太苛刻的时候使用。MyBatis几乎可以取代JDBC,拥有动态列、动态表名,存储过程都支持,缺陷是需要程序员提供映射规则和SQL,所以工作量比Hibernate略大一些。
2021年12月08日
123 阅读
0 评论
0 点赞
2021-12-08
Mybatis基本配置及 一对一的测试
基本配置在pom.xml中引入依赖 <!--单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!--mybatis依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <!--mysql数据库依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.41</version> </dependency> </dependencies> <!--注意:加载src/main/java下所有的xml文件--><build><finalName>mybatis_1</finalName><resources><resource> <!--指定xml文件所在路径,以下表示src/main/java包下所有的.xml,包括子包--> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes></resource></resources></build> 注意:添加上述代码是为了在编译时,将实体包中的映射文件生成到项目下面,否则会报找不到Mapper映射文件的错误。 创建配置文件:db.properties在resources或src下创建外部配置文件:db.properties # mysql数据库连接 db.driver=com.mysql.jdbc.Driver db.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull db.user=root db.pwd=l838061522 创建核心配置文件:mybatis-config.xml在resources或src下创建核心配置文件:mybatis-config.xml<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="db.properties"></properties> <settings> <setting name="lazyLoadingEnabled" value="true"></setting> <setting name="aggressiveLazyLoading" value="false"></setting> <setting name="mapUnderscoreToCamelCase" value="true"></setting> </settings> <!--1. 配置数据库环境,默认使用development数据库构建环境--> <environments default="development"> <!--配置环境变量--> <environment id="development"> <!--配置事务管理器类别--> <transactionManager type="JDBC" /> <!--配置数据源--> <dataSource type="POOLED"> <property name="driver" value="${db.driver}" /> <property name="url" value="${db.url}" /> <property name="username" value="${db.user}" /> <property name="password" value="${db.pwd}" /> </dataSource> </environment> </environments> <!-- <!–2. 加载映射器:实体类对象/关系映射文件–> --> <!-- <mappers> --> <!-- </mapper>--> </mappers> </configuration> 创建表 CREATE TABLE card(c_id INT PRIMARY KEY AUTO_INCREMENT COMMENT "id",code VARCHAR(18) UNIQUE NOT NULL COMMENT "身份证号码")COMMENT="身份证表" CREATE TABLE person(p_id INT PRIMARY KEY AUTO_INCREMENT COMMENT "pid",p_name VARCHAR(10) NOT NULL COMMENT "姓名",p_sex VARCHAR(2) NOT NULL COMMENT "性别" CHECK (p_sex="男" OR p_sex="女") ,p_age int not null COMMENT "年龄",c_id INT not null COMMENT "card的cid外键",CONSTRAINT FK_CID FOREIGN KEY (c_id) REFERENCES card(c_id))COMMENT="人员信息表" 封装类 packageclub.lygangdai.pojo;importjava.io.Serializable;/** * @ClassName:card * @Description: TODO(类说明:身份证表 ) * @author Uncle liu * @date 2018-10-11 19:16:13 */ public classCardimplementsSerializable{ private static final longserialVersionUID =1L; privateIntegercId; //id privateStringcode; //身份证号码 //封装属性、构造方法} packageclub.lygangdai.pojo;importjava.io.Serializable;/** * @ClassName:person * @Description: TODO(类说明:人员信息表 ) * @author Uncle liu * @date 2018-10-11 19:16:13 */ public classPersonimplementsSerializable{ private static final longserialVersionUID =1L; privateIntegerpId; //pid privateStringpName; //姓名 privateStringpSex; //性别 privateIntegerpAge; //年龄 privateCardcard;//身份证对象//封装属性、构造方法} 创建接口代理 packageclub.lygangdai.dao;importclub.lygangdai.pojo.Card;importclub.lygangdai.pojo.Person;public interfacePersonDao { /* * @Author Uncle Liu * @Description //TODO 根据id查询Person * @Date 19:17 2018/10/11 * @Param cid * @return Card **/ publicPerson selectPersonById(Integer pid); /* * @Author Uncle Liu * @Description //TODO 添加Person * @Date 19:19 2018/10/11 * @Param person * @return **/ public voidaddPerson(Person person); /* * @Author Uncle Liu * @Description //TODO 修改Person * @Date 19:58 2018/10/11 * @Param Person * @return **/ public voideditPerson(Person person); /* * @Author Uncle Liu * @Description //TODO 根据id删除Card * @Date 19:59 2018/10/11 * @Param * @return **/ public voiddeletePersonById(Integer pid);} packageclub.lygangdai.dao;importclub.lygangdai.pojo.Card;public interfaceCardDao { /* * @Author Uncle Liu * @Description //TODO 根据id查询Card * @Date 19:17 2018/10/11 * @Param cid * @return Card **/ publicCard selectCardById(Integer cid); /* * @Author Uncle Liu * @Description //TODO 添加Card * @Date 19:19 2018/10/11 * @Param * @return **/ public voidaddCard(Card card); /* * @Author Uncle Liu * @Description //TODO 修改Card * @Date 19:58 2018/10/11 * @Param card * @return **/ public voideditCard(Card card); /* * @Author Uncle Liu * @Description //TODO 根据id删除Card * @Date 19:59 2018/10/11 * @Param * @return **/ public voiddeleteCardById(Integer cid);} 对象/关系映射 配置*mapper.xmlCardMapper.xml <?xml version="1.0"encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="club.lygangdai.dao.CardDao"> <selectid="selectCardById"parameterType="Integer"resultType="club.lygangdai.pojo.Card"> SELECT* FROM card WHERE c_id=#{cId} </select> <insertid="addCard"parameterType="club.lygangdai.pojo.Card"keyProperty="cId"useGeneratedKeys="true"keyColumn="c_id"> insert into card(code) values(#{code}) <selectKeykeyProperty="cId"resultType="int"order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> </insert> <deleteid="deleteCardById"parameterType="Integer"> DELETE FROM card WHERE c_id=#{cId} </delete> <updateid="editCard"parameterType="club.lygangdai.pojo.Card"> UPDATE card SET code=#{code} WHERE c_id=#{cId} </update></mapper> PersonMapper.xml <?xml version="1.0"encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="club.lygangdai.dao.PersonDao"> <!--映射Person对象的resultMap(结果映射集)--> <resultMapid="personMapper"type="club.lygangdai.pojo.Person"> <idproperty="pId"column="p_id"/> <resultproperty="pName"column="p_name"/> <resultproperty="pSex"column="p_sex"/> <resultproperty="pAge"column="p_age"/> <associationproperty="card"column="c_id"select="club.lygangdai.dao.CardDao.selectCardById"></association> </resultMap> <selectid="selectPersonById"parameterType="Integer"resultMap="personMapper"> select* from person where p_id=#{pId} </select> <insertid="addPerson"parameterType="club.lygangdai.pojo.Person"keyProperty="pId"useGeneratedKeys="true"keyColumn="p_id"> insert into person(p_name,p_sex,p_age,c_id) values(#{pName},#{pSex},#{pAge},#{card.cId}) <selectKeykeyProperty="pId"resultType="int"order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> </insert> <deleteid="deletePersonById"parameterType="Integer"> DELETE FROM person WHERE p_id=#{pId} </delete> <updateid="editPerson"parameterType="club.lygangdai.pojo.Person"> UPDATE person SET p_name=#{pName},p_age=#{pAge},p_sex=#{pSex} WHERE p_id=#{pId} </update></mapper> 在mybatis-config.xml中配置mapper映射文件 <mappers><mapperresource="club/lygangdai/mapping/PersonMapper.xml"></mapper><mapperresource="club/lygangdai/mapping/CardMapper.xml"></mapper></mappers> 测试 @org.junit.Test public voidtest(){ try{ //通过Resources类加载核心配置文件,得到文件的输入流 InputStream inputStream = Resources.getResourceAsStream("mybatisconfig.xml"); //创建会话工厂,编译配置文件流,获得sqlsessionfactory SqlSessionFactory sqlSessionFactory =newSqlSessionFactoryBuilder().build(inputStream); //通过sqlSessionFactory得到sqlsession对象 SqlSession sqlSession =sqlSessionFactory.openSession(); //一对一 oneTOone(sqlSession); oneTOoneSelect(sqlSession); oneTOoneEdit(sqlSession); oneTOoneDelete(sqlSession); }catch(Exception e){ e.printStackTrace(); } }------方法 /* * @Author Uncle Liu * @Description //TODO 一对一添加测试 * @Date 19:34 2018/10/11 * @Param * @return **/ public voidoneTOone(SqlSession sqlSession){ try{ CardDao cardDao = sqlSession.getMapper(CardDao.class); PersonDao personDao = sqlSession.getMapper(PersonDao.class); Card card =newCard(); card.setCode("4305111111111"); //添加完Card,根据配置会把主键值返回给card对象// <selectKey keyProperty="cId" resultType="int" order="AFTER">// SELECT LAST_INSERT_ID()// </selectKey> cardDao.addCard(card); System.out.println(card); Person person =newPerson(); person.setCard(card); person.setPAge(12); person.setPName("张三"); person.setPSex("男"); //添加完Person,根据配置会把主键值返回给person对象 personDao.addPerson(person); System.out.println(person); //提交 sqlSession.commit(); }catch(Exception e){ //回滚 sqlSession.rollback(); System.out.println(e); }finally{ //关闭 sqlSession.close(); } } /* * @Author Uncle Liu * @Description //TODO 一对一查询 * @Date 19:52 2018/10/11 * @Param * @return **/ public voidoneTOoneSelect(SqlSession sqlSession){ PersonDao personDao = sqlSession.getMapper(PersonDao.class); Person person = personDao.selectPersonById(2); System.out.println(person); System.out.println(person.getCard()); } /* * @Author Uncle Liu * @Description //TODO 一对一修改 * @Date 19:52 2018/10/11 * @Param * @return **/ public voidoneTOoneEdit(SqlSession sqlSession){ try{ PersonDao personDao = sqlSession.getMapper(PersonDao.class); Person person = personDao.selectPersonById(2); person.setPName("李四"); personDao.editPerson(person); sqlSession.commit(); }catch(Exception e){ //回滚 sqlSession.rollback(); System.out.println(e); }finally{ //关闭 sqlSession.close(); } } /* * @Author Uncle Liu * @Description //TODO 一对一删除 * @Date 19:52 2018/10/11 * @Param * @return **/ public voidoneTOoneDelete(SqlSession sqlSession){ try{ PersonDao personDao = sqlSession.getMapper(PersonDao.class); Person person = personDao.selectPersonById(2); personDao.deletePersonById(person.getPId()); CardDao cardDao = sqlSession.getMapper(CardDao.class); cardDao.deleteCardById(person.getCard().getCId()); sqlSession.commit(); }catch(Exception e){ //回滚 sqlSession.rollback(); System.out.println(e); }finally{ //关闭 sqlSession.close(); } }
2021年12月08日
88 阅读
0 评论
0 点赞
2021-12-08
ssm不执行sql,不报错且程序接着运行
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression 'programa.pId != null'. Cause: org.apache.ibatis.ognl.OgnlException: source is null for getProperty(null, "pId")------------------------------------------------------SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@68a32861] was not registered for synchronization because synchronization is not active------------------------------------------------------Caused by: org.apache.ibatis.builder.BuilderException: Error evaluating expression 'programa.pId != null'. Cause: org.apache.ibatis.ognl.OgnlException: source is null for getProperty(null, "pId") 最开始删除的方法没有try不知道错在哪里也没抛异常 动态拼接的时候最开始用的只是根据programa.pId做条件删除,所有本身Article对象的aId属性是为空的,删除的时候没有问题。<if test="aId != null ">and a_id=#{aId} </if> <if test="programa.pId != null" > and p_id=#{programa.pId} </if>当我根据aId来删除的时候,条件还是↓↓↓↓<if test="aId != null ">and a_id=#{aId} </if> <if test="programa.pId != null" > and p_id=#{programa.pId} </if>到这里的时候就怎么也不执行删除的sql,代码还是接着运行,发现是因为没有判断对象属性不为空一次泪奔的总结┭┮﹏┭┮
2021年12月08日
182 阅读
0 评论
0 点赞
2021-12-08
删除CSDN自己上传的资源
打开自己资源页面: 如 https://download.csdn.net/download/qq_40369944/17777777删除修改请求为: http://download.csdn.net/index.php/user_console/del_my_source/17777777删除成功返回 {"succ":1,"msg":""}删除失败返回 {"succ":0,"msg":"\u4f60\u6ca1\u6709\u6743\u9650\u64cd\u4f5c"} 即:{"succ":0,"msg":"你没有权限操作"}--------------------- 作者:绿林寻猫 来源:CSDN 原文:https://blog.csdn.net/qq_40369944/article/details/80208358 版权声明:本文为博主原创文章,转载请附上博文链接!
2021年12月08日
92 阅读
0 评论
0 点赞
2021-12-08
利用Redis锁解决并发问题
转发 https://blog.csdn.net/fuyifang/article/details/83008884用redis处理高并发是个很常见的方式,因为redis的访问效率很高(直接访问内存),一般我们会用来处理网站一瞬间的并发量。那如果要使用redis来进行高并发问题的解决的话,应注意以下几点:1、首先我们要先知道,我们在存储时,应使用redis的setnx方法,不应该使用set方法,因为setnx拥有原子操作命令(正确点说法应该是使用setnx,根据其属性可以保证共享资源的原子性操作),当资源锁存在不能设置值,则返回0,而当锁不存在,则设置锁,返回1; 但如果使用set方法,则会出现在高并发情况下,进程同时获取锁状态为null,同时设置,锁之间相互覆盖,但是俩进程仍在并发执行业务代码的情况。2、为了防止死锁,我们不应直接使用jedis.setnx(lock, 1) 来进行简单的加锁,这样会导致当进程执行出现问题,锁未释放,则其他进程永远处于阻塞状态,出现死锁。 为了避免死锁,我们在加锁时带上时间戳,setnx(lock, 时间戳+超时时间),当发现锁超时了,便可以对锁进行重置,避免死锁。接下来,实际操作!设置锁://其中currentTimeMullis为当前时间、valideTime为超时时间,key为资源//对该资源进行锁获取,如果存在锁则会返回false,不存在则设置值并返回trueboolean lock = redisService.setnx(key, currentTimeMullis+valideTime);//如果不存在并设置了值,则可以直接返回,因为已经获取资源锁成功//否则,则代表存在这个锁,则进行锁是否超时的判断。获取该资源的锁时间,用于判断是否超时了String keyTime = redisService.get(key);if((Long.valueOf(currentTimeMullis)-Long.valueOf(keyTime))>valideTime){ //该判断代表该资源锁已经超时,那么便进行资源锁的重置,也就是进行资源锁的重新设置(删除并重新设置)//重新设置成功后也返回,因为获取锁成功,可以进行操作啦。}//如果以上操作都没有成功,则返回失败,代表获取锁失败,不可以进行操作。释放锁:当对资源处理结束后,则调用释放方法释放锁资源(经提醒,我发现我这里少了个判断逻辑…)//在删除前,应该先对该资源锁进行获取,判断值与此时释放锁的线程所携带的值是否相等,也就是我们上面创建时用的currentTimeMullis+valideTime。String keyLockTime = redisService.get(key);if(keyLockTime!=null&&keyLockTime.equals(currentTimeMullis+valideTime)){ //此时锁还由当前线程保持则释放锁redisService.del(key);}else{ //此时说明该资源锁被其他线程重置或释放,已不再拥有锁的释放权//结束}
2021年12月08日
274 阅读
0 评论
0 点赞
2021-12-08
web开发性能优化---代码优化篇
原文:https://blog.csdn.net/fuyifang/article/details/40519421 1、合理使用缓存使用提高性能最好最快的办法当然是通过缓存来改善,对于任何一个web开发者都应该善用缓存。Asp.net下的缓存机制十分强大,用好缓存机制可以让我们极大的改善web应用的性能。1.页面缓存 2.部分页面缓存3.使用DataSource缓存4.Cache对象2、避免数据库频繁连接1.能采用SQL或直接存储过程一次执行的尽量不要用代码多次执行2.及时关闭数据库连接3.适当采取配置文件文件存频繁使用文件4.对不经常更改并且数据量小的可采用xml或者配置文件设置4、资源文件上传大小验证1.严格验证上传图片大小2.严格控制上传Flash动画和视频大小5、尽量避开访问高峰期,进行数据作业和数据服务1.执行定时任务尽量避开访问高峰期2.对应固定报表2可以采取预定格式,避开高峰自动提取6、数据查询采用真分页1.需要多少数据取多少数据7、建设页面跳转覆盖1.尽量采取弹框或切换选项方式展示数据,避免来回刷新列表重新获大量数据8、取数据不要查询全部字段1.查询数据尽量不要SELECT *
2021年12月08日
135 阅读
0 评论
0 点赞
2021-12-08
高并发量网站解决方案、性能优化
一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构、性能的要求都很简单。随着互联网业务的不断丰富,网站相关的技术经过这些年的发展,已经细分到很细的方方面面,尤其对于大型网站来说,所采用的技术更是涉及面非常广,从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很高的要求,已经不是原来简单的html静态网站所能比拟的。 大型网站,比如门户网站,在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。这几个解决思路在一定程度上意味着更大的投入。 1、HTML静态化 其实大家都知道,效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站,我们无法全部手动去挨个实现,于是出现了我们常见的信息发布系统CMS,像我们常访问的各个门户站点的新闻频道,甚至他们的其他频道,都是通过信息发布系统来管理和实现的,信息发布系统可以实现最简单的信息录入自动生成静态页面,还能具备频道管理、权限管理、自动抓取等功能,对于一个大型网站来说,拥有一套高效、可管理的CMS是必不可少的。 除了门户和信息发布类型的网站,对于交互性要求很高的社区类型网站来说,尽可能的静态化也是提高性能的必要手段,将社区内的帖子、文章进行实时的静态化、有更新的时候再重新静态化也是大量使用的策略,像Mop的大杂烩就是使用了这样的策略,网易社区等也是如此。 同时,html静态化也是某些缓存策略使用的手段,对于系统中频繁使用数据库查询但是内容更新很小的应用,可以考虑使用html静态化来实现。比如论坛中论坛的公用设置信息,这些信息目前的主流论坛都可以进行后台管理并且存储在数据库中,这些信息其实大量被前台程序调用,但是更新频率很小,可以考虑将这部分内容进行后台更新的时候进行静态化,这样避免了大量的数据库访问请求。 2、图片服务器分离 大家知道,对于Web服务器来说,不管是Apache、IIS还是其他容器,图片是最消耗资源的,于是我们有必要将图片与页面进行分离,这是基本上大型网站都会采用的策略,他们都有独立的、甚至很多台的图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力,并且可以保证系统不会因为图片问题而崩溃。 在应用服务器和图片服务器上,可以进行不同的配置优化,比如apache在配置ContentType的时候可以尽量少支持、尽可能少的LoadModule,保证更高的系统消耗和执行效率。 3、数据库集群、库表散列 大型网站都有复杂的应用,这些应用必须使用数据库,那么在面对大量访问的时候,数据库的瓶颈很快就能显现出来,这时一台数据库将很快无法满足应用,于是我们需要使用数据库集群或者库表散列。 在数据库集群方面,很多数据库都有自己的解决方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是类似的方案,您使用了什么样的DB,就参考相应的解决方案来实施即可。 上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用DB类型的限制,于是我们需要从应用程序的角度来考虑改善系统架构,库表散列是常用并且最有效的解决方案。 我们在应用程序中安装业务和应用或者功能模块将数据库进行分离,不同的模块对应不同的数据库或者表,再按照一定的策略对某个页面或者功能进行更小的数据库散列,比如用户表,按照用户ID进行表散列,这样就能够低成本的提升系统的性能并且有很好的扩展性。 sohu的论坛就是采用了这样的架构,将论坛的用户、设置、帖子等信息进行数据库分离,然后对帖子、用户按照板块和ID进行散列数据库和表,最终可以在配置文件中进行简单的配置便能让系统随时增加一台低成本的数据库进来补充系统性能。 4、缓存 缓存一词搞技术的都接触过,很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。 架构方面的缓存,对Apache比较熟悉的人都能知道Apache提供了自己的缓存模块,也可以使用外加的Squid模块进行缓存,这两种方式均可以有效的提高Apache的访问响应能力。 网站程序开发方面的缓存,Linux上提供的Memory Cache是常用的缓存接口,可以在web开发中使用,比如用Java开发的时候就可以调用MemoryCache对一些数据进行缓存和通讯共享,一些大型社区使用了这样的架构。另外,在使用web语言开发的时候,各种语言基本都有自己的缓存模块和方法,PHP有Pear的Cache模块,Java就更多了,.net不是很熟悉,相信也肯定有。 5、镜像 镜像是大型网站常采用的提高性能和数据安全性的方式,镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异,比如ChinaNet和EduNet之间的差异就促使了很多网站在教育网内搭建镜像站点,数据进行定时更新或者实时更新。在镜像的细节技术方面,这里不阐述太深,有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路,比如Linux上的rsync等工具。 6、负载均衡 负载均衡将是大型网站解决高负荷访问和大量并发请求采用的高端解决办法。 负载均衡技术发展了多年,有很多专业的服务提供商和产品可以选择,我个人接触过一些解决方法,其中有两个架构可以给大家做参考。(1)、硬件四层交换 第四层交换使用第三层和第四层信息包的报头信息,根据应用区间识别业务流,将整个区间段的业务流分配到合适的应用服务器进行处理。 第四层交换功能就像是虚IP,指向物理服务器。它传输的业务服从的协议多种多样,有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上,需要复杂的载量平衡算法。在IP世界,业务类型由终端TCP或UDP端口地址来决定,在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决定。 在硬件四层交换产品领域,有一些知名的产品可以选择,比如Alteon、F5等,这些产品很昂贵,但是物有所值,能够提供非常优秀的性能和很灵活的管理能力。“Yahoo中国”当初接近2000台服务器,只使用了三、四台Alteon就搞定了。(2)、软件四层交换 大家知道了硬件四层交换机的原理后,基于OSI模型来实现的软件四层交换也就应运而生,这样的解决方案实现的原理一致,不过性能稍差。但是满足一定量的压力还是游刃有余的,有人说软件实现方式其实更灵活,处理能力完全看你配置的熟悉能力。 软件四层交换我们可以使用Linux上常用的LVS来解决,LVS就是Linux Virtual Server,他提供了基于心跳线heartbeat的实时灾难应对解决方案,提高系统的强壮性,同时可供了灵活的虚拟VIP配置和管理功能,可以同时满足多种应用需求,这对于分布式的系统来说必不可少。 一个典型的使用负载均衡的策略就是,在软件或者硬件四层交换的基础上搭建squid集群,这种思路在很多大型网站包括搜索引擎上被采用,这样的架构低成本、高性能还有很强的扩张性,随时往架构里面增减节点都非常容易。 对于大型网站来说,前面提到的每个方法可能都会被同时使用到,这里介绍得比较浅显,具体实现过程中很多细节还需要大家慢慢熟悉和体会。有时一个很小的squid参数或者apache参数设置,对于系统性能的影响就会很大。 7、最新:CDN加速技术什么是CDN? CDN的全称是内容分发网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户可以就近取得所需的内容,提高用户访问网站的响应速度。 CDN有别于镜像,因为它比镜像更智能,或者可以做这样一个比喻:CDN=更智能的镜像+缓存+流量导流。因而,CDN可以明显提高Internet网络中信息流动的效率。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等问题,提高用户访问网站的响应速度。CDN的类型特点 CDN的实现分为三类:镜像、高速缓存、专线。 镜像站点(Mirror Site),是最常见的,它让内容直接发布,适用于静态和准动态的数据同步。但是购买和维护新服务器的费用较高,还必须在各个地区设置镜像服务器,配备专业技术人员进行管理与维护。对于大型网站来说,更新所用的带宽成本也大大提高了。 高速缓存,成本较低,适用于静态内容。Internet的统计表明,超过80%的用户经常访问的是20%的网站的内容,在这个规律下,缓存服务器可以处理大部分客户的静态请求,而原始的服务器只需处理约20%左右的非缓存请求和动态请求,于是大大加快了客户请求的响应时间,并降低了原始服务器的负载。 CDN服务一般会在全国范围内的关键节点上放置缓存服务器。 专线,让用户直接访问数据源,可以实现数据的动态同步。CDN的实例 举个例子来说,当某用户访问网站时,网站会利用全球负载均衡技术,将用户的访问指向到距离用户最近的正常工作的缓存服务器上,直接响应用户的请求。 当用户访问已经使用了CDN服务的网站时,其解析过程与传统解析方式的最大区别就在于网站的授权域名服务器不是以传统的轮询方式来响应本地DNS的解析请求,而是充分考虑用户发起请求的地点和当时网络的情况,来决定把用户的请求定向到离用户最近同时负载相对较轻的节点缓存服务器上。 通过用户定位算法和服务器健康检测算法综合后的数据,可以将用户的请求就近定向到分布在网络“边缘”的缓存服务器上,保证用户的访问能得到更及时可靠的响应。 由于大量的用户访问都由分布在网络边缘的CDN节点缓存服务器直接响应了,这就不仅提高了用户的访问质量,同时有效地降低了源服务器的负载压力。附:某CDN服务商的服务说明 采用GCDN加速方式 采用了GCDN加速方式以后,系统会在浏览用户和您的服务器之间增加一台GCDN服务器。浏览用户访问您的服务器时,一般静态数据,如图片、多媒体资料等数据将直接从GCDN服务器读取,使得从主服务器上读取静态数据的交换量大大减少。 为VIP型虚拟主机而特加的VPN高速压缩通道,使用高速压缩的电信<==>网通、电信<==>国际(HK)、网通<==>国际(HK)等跨网专线通道,智能多线,自动获取最快路径,极速的动态实时并发响应速度,实现了网站的动态脚本实时同步,对动态网站有一个更加明显的加速效果。 每个网络运营商(电信、网通、铁通、教育网)均有您服务器的GCDN服务器,无论浏览用户是来自何处,GCDN都能让您的服务器展现最快的速度!另外,我们将对您的数据进行实时备份,让您的数据更安全!
2021年12月08日
123 阅读
0 评论
0 点赞
1
...
5
6
7
...
20