当前位置:主页 > 网络安全 >

服务器防ddos_高防ip怎么用_免费试用

时间:2021-06-11 20:50来源:E度网络 作者:E度网络 点击:

服务器防ddos_高防ip怎么用_免费试用

在我来到SourceClear之前,javapersistenceapi(JPA)是我在职业生涯中无意中避免使用的一种技术(连同Spring框架),尽管我在拥有大型关系数据模型的消费者网站上工作了15年。我认为这是福也是祸。这种延迟让我受益匪浅——冗长的XML配置长期以来给这些框架(实际上,整个Java)带来了笨重、缓慢和明显不酷的名声。现在,有了简单的注释,就可以在Spring、Hibernate和RDBMS之间展开复杂的舞蹈,而无需编写一行XML或SQL。什么不是爱?嗯,就像一把可靠的锤子,cc防御是什么意思呢,JPA非常好地解决了一些问题;其他问题需要更精确和更谨慎。为了证明这一点,防火墙能防御ddos吗,我们将使用一个简单的应用程序数据模型原型,这个原型在以前只做了几千次*——一个照片共享网站。在这个数据模型中,用户(Account表)有零个或多个相册,其中包含照片。由于一张照片可以出现在多个相册中,因此它被建模为与联接表相册photo的多对多关系:+------------------+|帐户|+------------------+|id(PK)||电子邮件||位置|+------------------+| 1|*+------------------+|相册|+------------------+|id(PK)||账户账号(FK)||姓名||日期|+------------------+|1|*+------------------+|相册照片|+------------------+|专辑编号(FK)||照片编号(FK)|+------------------+|*| 1+------------------+|照片|+------------------+|id(PK)||文件名||标题|+------------------+(*包括您的两次)以下是实体类来建模上述内容(请注意,为了简洁起见,省略了一些字段和访问器):帐户.java:@实体@表格(name="account")publicclassAccountimplementsSerializable{@Id@GeneratedValue(策略=GenerationType.IDENTITY)私有内部id;私人字符串电子邮件;私有字符串位置;@OneToMany(mappedBy="account")@OrderBy("date")私人集相册;公共集getAlbums(){归还相册;}}相册.java:@实体@表格(name="相册")publicclassAlbumimplementsSerializable{@Id@GeneratedValue(策略=GenerationType.IDENTITY)私人身份证;@JoinColumn处的ManyToOne(name="account_id",cc攻击防御原理,cc可以防御,可空=false)私人账户;私有字符串名称;@manytomy@可连接(name="相册照片",joinColumns=@JoinColumn(name="album_id"),inverseJoinColumns=@JoinColumn(name="photo帴id"))私人设置照片;公共集getPhotos(){返回照片;}}照片.java:@实体@表格(name="photo")公共类照片实现可序列化{@Id@GeneratedValue(策略=GenerationType.IDENTITY)私人身份证;privateStringfilename;privateStringcaption;}我们可以在这里看到JPA的强大和简单(尽管有些模糊的术语)。只需几个注释,我们就可以为每个to-many关系建模;我们甚至不需要为连接表AlbumPhoto指定实体类。(图中没有显示Spring/Hibernate/JPA设置过程,该过程功能强大,但绝不诱人。我希望能在以后的博客文章中谈谈从那里学到的一些经验。)要使用这些实体,我们将首先创建一个服务方法,以事务方式加载帐户并查看其相册:@事务性(只读=true)@OverridepublicAccount findByEmailWithAlbums(字符串电子邮件){账户账户=accountRepository.findByEmail(电子邮件);退货账户;}我们服务的客户看起来像:账户账户=FinWithMailDbYesService帐户("test@sourceclear.com");System.out.println(账户);设置albums=account.getAlbums();System.out.println(相册);运行上述操作,输出如下:Hibernate:选择account0_0_1_0_216;,account0_U0_2;email2_0_0_FromAccount0匼where account0_u0.email=?账户{id=1,电子邮件=test@sourceclear.com}"主"除外org.hibernate.LazyInitializationException:延迟初始化角色集合失败:模型.帐户.相册,无法初始化代理-nosessionhmm,这不太好。怎么搞的?延迟初始化出于性能原因,JPA指定默认情况下延迟初始化一对多和多对多集合。这意味着持久化层将不加载连接表(在本例中是相册),直到实际通过调用代码请求它为止。问题是,当调用代码请求连接数据时,事务和数据库会话已经关闭。(这种情况在webmvc场景中尤其普遍,在这种情况下,呈现视图可能在数据库操作完成之后很久才请求连接的数据)天真的解决方案:急切的吸引人除了默认的lazy集合初始化之外,JPA还允许您急切地初始化许多集合。要实现这一点,我们只需修改注释如下:@OneToMany(mappedBy="account",获取=FetchType.EAGER)@OrderBy("日期")私人集相册;重新运行我们的测试代码控制台输出现在是:Hibernate:选择account0_0_1_0_216;,account0_U0_2;email2_0_0_FromAccount0匼where account0_u0.email=?休眠:选择albums0_0.account_.id作为account_4_0_0_0_10;、albums0_0.id作为id1_1_1_1_1_1_10;albums0_u.account_id作为account_4_1_1_1_1_1_1_1_0_0_0_0_0_0_0_0_2;,albums0_0_3_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_?按相册订购日期账户{id=1,电子邮件=test@sourceclear.com}[相册{id=1,person=Account{id=1,电子邮件=test@sourceclear.com},name=夏威夷2014,date=2015-03-3016:21:00.0},相册{id=10,java防御ddos,person=Account{id=1,电子邮件=test@sourceclear.com},名称=欧洲2014,日期=2015-03-3018:36:22.0}]这似乎是期望的结果:所有数据都已加载,更重要的是,没有堆栈跟踪。然而,我们将了解为什么延迟抓取作为默认值是有意义的,以及在处理错误时了解所涉及的用例的重要性。为了演示,让我们添加一些新功能来获取特定位置的帐户列表:列表accounts=accountService.findByLocation("94112");System.out.println(accounts);控制台输出:休眠:选择account0_0.idas id1_0_0帴,account0帴电子邮件为email2_0_0帴,account0帴location为location3帴0帴,其中account0帴location=?休眠:选择albums0_0.account_Uid作为account_4_0_0_0_10;、albums0_0.idas id1_1_1_1_0_10;.account_uid作为account_4_1_1_1_1_1_1_1_1_1_1_0_0_0_0_0.albums0_0.ideas name3_1_1_1_1;,其中albums0_0.account_id=?按相册订购休眠:选择albums0_0.account_Uid作为account_4_0_0_0_10;、albums0_0.idas id1_1_1_1_0_10;.account_uid作为account_4_1_1_1_1_1_1_1_1_1_1_0_0_0_0_0.albums0_0.ideas name3_1_1_1_1;,其中albums0_0.account_id=?按相册订购休眠:选择albums0_0.account_Uid作为account_4_0_0_0_10;、albums0_0.idas id1_1_1_1_0_10;.account_uid作为account_4_1_1_1_1_1_1_1_1_1_1_0_0_0_0_0.albums0_0.ideas name3_1_1_1_1;,其中albums0_0.account_id=?按相册订购...这里发生了什么事?Account表上的查询看起来不错,但是现在我们在Album表上有一系列单独的查询。实际上,我们在"94112"位置为每个用户提供一个查询。这肯定不会扩大规模,我们将很快恢复到FetchType.LAZY为我们的联合收藏。可能更好的解决方案:手动获取对于可能很大的数据集,急取几乎永远不是一个好的默认值,那么有什么更好的方法来检索我们的唱片集数据呢?一种可能是手动触发获取。假设(人为的示例警告!)我们要显示给定位置的前五个用户的相册:@事务性(只读=true)@覆盖public ListfindByLocationWithAlbums(字符串位置,int限制){列表accounts=accountRepository.findByLocation(位置);返回帐户.stream().限制(限制).peek(帐户->休眠。初始化(account.getAlbums())).collect(toList());}号召休眠。初始化()的效果与FetchType.EAGER在集合上-执行一个单独的查询来获取每个相册行并初始化相册对象。除此之外,我们控制执行额外DB往返的记录。控制台输出显示帐户查询和(最多)5个相册查询。峰值性能(维护):联接查询Spring JPA允许您指定存储库方法使用的查询:@存储库公共接口accountrepositoryextendsJParepository{ListfindByLocation(字符串位置);@查询("从帐户作为帐户左联接获取帐户.相册哪里帐户.位置= ?1")ListfindByLocationJoinAlbums(字符串位置);}此查询在查找帐户的同时检索并填充唱片集数据。控制台输出显示:冬眠期:选择"帐户0"作为"0"的"国际达人id1 1"u 0 0"u 0"的"相册1"的"idas id1 Iu 1 U 1 U 1 1 U 1,account0 0 0"的电子邮件作为电子邮件的电子邮件2 2 U 0 0 0 0 0 U 0 0 0 9,account0 0 2地理位置定位定位为位置3 3 0 0 0 0 0 0 0 0 0 2,相册1 1 1 9"天价2加上天价2 2加1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2"2 2 2 2 2 2 2 2 2_0_0_0_u,相册1_.idas id1_1_0_u来自帐户帐户0_左侧外部加入相册1_在account0_2;.id=albums1\.account_id,其中account0_U.location=?order by albums1\uu.date在单个数据库往返中获取所有内容。注意这里有一个小的折衷。而springjpa可以自动地将一个方法名构造(比如findByLocation)解析为SQL查询,但是用我们自己的查询覆盖会增加字符串查询结构的维护成本和脆弱性。幸运的是,像intellijidea这样的现代IDE具有完整的JPA/Hibernate集成,可以帮助这里的开发人员,例如通过自动完成自定义查询中的表和列名,以及链接内部字符串值ba

推荐文章
最近更新