工作中遇到的问题与处理(二)

5 篇文章 0 订阅
5 篇文章 0 订阅

(一)hibernate自动更新

问题描述:
Hibernate并没有调用update却自动更新:
原因:
hibernate在每个session里都会做些处理,比如把查询过的对象缓存起来,这个时候这些对象的实例是和数据库保持关联的,hibernate会记录session生命周期内所有缓存对象的操作过程,最后都会反映到数据库去,也就是所谓的托管状态,所以才会有自动更新这种问题。
解决方法:
只要每次都把查询到的对象用evict(或clear)清除,那么就不会有托管状态的entity,也就不会有自动更新,但这不会影响update(或saveOrUpdate)操作,evict只是清除实例与数据库的关联而已,不是清除实例本身。
hibernateTemplate.getSessionFactory().getCurrentSession().clear();
解决方法2:
主要就是让查询出来的实体不进行变动,所以可以使用克隆,得到新的对象,这样也可以保持数据库查出来的实体没有变动,不会自动更新。

其他相关:
hibernate对象的三种状态:

  • 瞬时状态 (Transient)
  • 持久化状态(Persistent)
  • 游离状态(Detached)

瞬时状态:
没有持久化,没有处于Session中
持久化状态:
加入到了Session缓存中,当一个session执行close()或clear()、evict()之后,持久对象变成脱管对象,此时该对象虽然具有数据库识别值,但它已不在HIbernate持久层的管理之下
游离状态:
当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象。当脱管对象被重新关联到session上时,并再次转变成持久对象。脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法,转变成持久对象。

(二)阿里云上用JavaMail发不出邮件

问题描述:
程序中用javaMail发送邮件,本地环境、测试环境可以正常发送,到了生产环境就发送不出去了。
原因:
当前阿里云服务器禁用了 25端口,导致调用25端口的发送邮件功能无法正常发送。
解决方法:
修改邮件服务器端口为 465,设置为 ssl协议加密传输
示例:

   		//在发送邮件的配置上,加入以下内容:
		props.setProperty("mail.smtp.port", "465");
        props.setProperty("mail.smtp.socketFactory.port", "465");
        props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.put("mail.smtp.auth", "true");

(三)Tomcat工程残留

问题描述:
Tomcat部署JavaWeb工程:每一个页面第一次打开404,刷新后才正常显示
问题分析:

  • 每次打开,都是错误的页面,说明读取到了其他地方。
  • 刷新之后,恢复正常。说明最新的包部署正常。
  • 所以应该是tomcat上有上次发布的包残留导致,推测是之前的旧文件没有删除干净。

解决方法:
在Tomcat目录下找了一遍,果然在work/Catalina目录下发现了一个工程的同名文件!

  1. 关闭Tomcat,删除同名文件夹。
  2. 重新把新的war包copy到webapp目录下后重启Tomcat。
  3. 恢复正常

(四)MySql数据库时间错误

问题描述:
数据库表有个时间字段,是获取数据库时间进行记录的。但发现其与系统记录的时间不一致。
问题分析:
数据库记录的时间与操作系统上的时间不一致。排除项目上的bug和系统设置,基本就是数据库的问题。
仔细研究会发现,错误的时间与实际时间间隔大概8小时,大概就是时区设置的问题了。
解决方法:
将数据库时区设置为东8区即可。
实操过程:

-- mysql检查语句:
-- 当前时间
select now();  
 
-- 时区设置(system_time_zone是操作系统设置的时区,time_zone是mysql设置的时区)
show variables like "%time_zone%"; 

时区知识:
时区(system_time_zone)一般有几种设置:

  • UTC:比GMT更为精确的世界时间,精确到秒,误差在0.9s以内。(即大体与GMT一致)
  • GMT:格林威治标准时间,0°经线开始地方的时间,GMT时间比北京时间慢8小时。
  • DST:(少用)夏季节约时间,即夏令时;是为了利用夏天充足的光照而将时间调早一个小时,北美、欧洲的许多国家实行夏令时;
  • CST:时间戳:表示从1970年1月1日 00:00:00到现在所经历的秒数,与时区无关(有4种表示)
    • Central Standard Time (USA) UT-6:00 美国标准时间
    • Central Standard Time (Australia) UT+9:30 澳大利亚标准时间
    • China Standard Time UT+8:00 中国标准时间
    • Cuba Standard Time UT-4:00 古巴标准时间

实际处理方案:
选择影响最小的修改方式,就是在项目的数据库连接语句上加入时区设置,有以下两种选择可以达到效果:

  1. serverTimezone=GMT%2B8 (修改时区为东8区)
  2. serverTimezone=Asia/Shanghai (这个有些地方会造成部分hibernate的读取问题,谨慎使用)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值