• 2007-09-03

    数据库处理上的几个问题 - [工作学习]

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://jimsu.yourblog.org/logs/619939.html

    1,今天测试当数据较多时,hibernate访问mysql报错Caused by: org.hibernate.type.SerializationException: could not deserialize 后来发现:原来某个字段类型是tinyblob,而不是我预想的blob,改为blob即可。 这需要修改hibernate tag,加入length="65535",因为:The "serialized" type defaults to tinyBlob using the MySQLInnoDB dialect, which has size 255 bytes. mysql中 varchar长度的是0~256,这比较郁闷。 text最大长度65535 blob还有4种,分别是TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。 2,oracle9i的jdbc驱动对blob处理有bug,只能存入2k字节的数据。需要使用10g的jdbc驱动。 3,HibernateTemplate alwaysUseNewSession 使得即使是提前绑定的Session也强制为一个新的Session,也就是说Template每次使用一个新的session,如果在一个事务内,对还没有提交到数据库中的信息,只要他保存在Session的缓存中,查询也能将其查询出来。新创建的session会通过同一JDBC连接参与到同一事务中,即这些session将参与到同一个事务。 Within a transaction, a new Hibernate Session used by this template will participate in the transaction through using the same JDBC Connection. In such a scenario, multiple Sessions will participate in the same database transaction. 对于spring中配置了Hibernate事务管理器,它包含了HibernateSessionFactory实例。 事务管理器每次执行时,都会做如下处理: 检查Hibernate Session是否绑定到当前线程。如果已绑定,则直接使用它。 如果还未绑定,事务管理器将告知Hibernate SessionFactory创建新的Session,然后将创建的Session绑定到当前线程。 这样每个thread都有自己的Session(Session是有状态的),这样就thread safe了。 既然Session是有状态的,那么spring里面的bean又都是singleton的,那就只能通过ThreadLocal来解决thread safe了。 举例说: 有3个thread需要存取数据,他们都通过DataAccessIf来访问数据库,那在DataAccessIf的业务方法中,每个Session实际上都不一样。 HibernateDaoSupport有SessionFactory 里面包含了连接池,从factory能获取到Session。实际上这个是从ThreadLocal(线程局部变量)中获取的,即每个thread有一份他的副本,而不影响其他thread。每个事务操作结束后,thread结束时,会自动让session.close掉。 通过ThreadLocal能隔离各个thread的数据冲突,但是如果多个thread间需要通信,则threadlocal无法解决问题,必须使用同步。 org.hibernate.Session:能flush将cache存入db,beginTransaction开始事务(返回一个Transaction对象,结束后调用commit) 他通过createQuery,createCriteria进行查询。 Session.close()做了些什么:调用连接池的close,连接池可能会释放JDBC Connection,也可能不会释放。

    收藏到:Del.icio.us




发表评论

您将收到博主的回复邮件
记住我