日期:2014-05-16  浏览次数:20462 次

记一次hibernate无法取得jdbc插入数据的问题折腾

大概情况如下

前端:struts2+spring3+hibernate3 + mysql 主要用于取得数据库的数据显示在页面,含有少量的数据更新操作。

后端:jdbc + mysql 用于接收某客户端发来的数据(socket通信),并存入数据库,供前端显示。

?

问题:

jdbc可以成功插入数据库,但前端无法取得jdbc插入的数据,而前端自己的更新操作均无问题。

经查看数据库,确定jdbc确实插入了数据库,但hibernate取得的数据列表中就是没有jdbc插入的数据。

同样,jdbc对数据库中的某条数据进行更新操作,经确定已更新到数据库中。但前端hibernate取的数据仍然是未更新前的数据。hibernate的二级缓存未开启,所以排除缓存的原因,而且控制台打印的确实有sql查询语句,也说明并未使用缓存。

?

通过对照以前一个项目,发现我使用是hibernate的默认数据库连接池,未使用dbcp或c3p0。

?

尝试一:偷懒了下,把hibernate的数据库配置,移到spring中。

?

结果:jdbc插入的数据可以被hibernate取得,但jdbc对已有数据的更新,hibernate依旧取到的是未更新前的数据

?

一番折腾后再次尝试:

?

尝试二:为spring的aop事务添加一个默认匹配全部方法的配置,以前只配置了更新,添加,删除的方法

添加匹配其他方法配置 如下

<tx:method name="*" read-only="true"/>

?

结果:OK,hibernate可以正确读取jdbc插入和更新的数据了。

?

最后把spring的数据库配置改为原来的使用hibernate默认的链接池配置,未再出现前面的问题。

?

看来问题确实出在,事务的配置上了。 如果不使用jdbc操作数据库恐怕还发现不了这个问题。。。

?

?