今天感觉有几点收获:1.坚持解决了Hibernate映射报错的问题;2.知道了Hibernate中getsession方法的缺陷;3.熟悉了MyEclipse开发工具的使用。
Hibernate映射报错问题
今天费了很长时间大概有2小时在解决一个hibernate映射文件报错的问题(还没完全弄明白,hibernate映射domain中表结构的顺序,这些要进一步深入学习hibernate),明明在src的xml配置文件中没有引用到一个dto的类,但是总报找不到该类的映射,搜索了对应表字段,没有找到,还要说没有引用的类都没有找到。叫了一个有些经验的java程序员还是弄了近30小时,把修改的代码都还原了还是不行,不经意间我ctrl+shift+R定位时发现了WebRoot下的class中对应的xml配置文件,打开果然里面引用了对应的类,猛然间想起来昨天晚上不小心本应该修改src中的xml,结果修改成了class中的xml,删掉对应的类引用后,果然程序能正常运行了。不知为何hibernate中src中的xml没有同步到class中,可能是不能对哪里面增加的东西进行增加吧。
另外一个映射报错问题是因为我表对应类class路径写错了。
不要用Hibernate的getsession方法
晚上一位老程序员指出我hibernate迁移dao代码时不应该用getsession,有泄露连接的嫌疑。仔细搜索了果然这样。
在 Spring+Hibernate的集成环境里,如果DAO直接使用HibernateDaoSupport的getSession()方法获取 session进行数据操作而没有显式地关闭该session,那么程序表现为:每个session会打开一个connection,并且 connection会一直保持(因为没有显式地close).如果程序使用了c3p0连接池,则因为c3p0连接池默认最大连接数是15,程序会表现为当打开第15个连接时,程序处于停滞状态,等待从连接池获取新的连接.
在同样条件下,使用HibernateTemplate进行数据操作,就没有连接数持续增长的情况,程序结束时连接数归零.这印证了spring文档上所说:HibernateTemplate会对session进行了管理,能够确保Session实例的正确打开和关闭.
需要注意的是:在Spring环境里,即使我们使用Hibernate原生的API,比如这里所说的使用HibernateDaoSupport的getSession()方法得到Session进行数据操作(而不是使用Spring自己提供的API,比如HibernateTemplate),这些操作也依然会被纳入spring管理的事务中去.原因是通过getSession()方法得到Session是一个绑定到当前事务上的session.此处可参考:http://www.javaeye.com/topic/110801.这就是为什么Spring文档中提到的:You can implement DAOs based on the plain Hibernate 3 API, while still being able to participate in Spring-managed transactions.
如果程序使用了OpenSessionInViewFilter或者OpenSessionInViewInterceptor那将是另外一种情形了.
简单总结: HibernateDaoSupport的getSession()得到的Session会参与Spring管理的事务中,但是不能自动的关闭. HibernateTemplate 除能参与到 Spring管理的事务中,还 能够确保Session实例的正确打开和关闭.
Myeclipse工具使用问题
今天再次学习了Myeclipse快捷键使用问题,发现原来我知道的快捷键真是太少了。再次学习有以下几个感受:
- myeclipse中可以直接在资源管理器中打开包浏览器中对应的文件,不用再属性中复制路径到资源管理器中(这两天我一直这样干的,感觉很不爽,原来myeclipse一直提供有工具栏这是我没有发现;主要感觉在资源管理器中打开提交svn,比直接在myeclipse中插件方便些,引用可以在提交对比修改代码时进行相应的修改操作。不用重复选择,且图标看着比插件中更具体清晰。)
默认情况下使用eclipse打开当前文件所在文件夹很麻烦,需要右键点击 Package Explorer 中的节点选择属性,然后复制路径,再打开资源管理器,然后再把路径粘贴进去。而MyEclipse一直有一个很好用的工具在工具栏上,只要选中 Package Explorer 的节点,一点击这个图标就可以在资源管理器中打开文件了。
MyEclipse 里面的插件名叫:Desktop toolbar。
于是我就在 Eclipse 的工具栏配置中寻找这个插件,可是没有找到,经过在网上查阅资料后,终于找到了一个模拟这个插件的办法,配置和操作起来也比较简单,在这里分享给大家。
Run ---- External Tools ---- External Tools Configurations
2.在 Location 中填写 windows 资源管理器路径;
3.在 Arguments 中填写 ${container_loc};(不带分号)
5.选中 External Tools 复选框(使该项出现在工具栏中);
好了,单击工具栏上的 External Tools 按钮即可在资源管理器中打开你在 Package Explorer 中选中的文件所在的目录了。