论坛首页 Java企业应用论坛

多数据库环境下如何运用spring 来同时用jdbc,hibernate

浏览 5123 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-05-10  
项目中必须同时操作两个数据库,都是sybase 11,旧数据库是N 年前设计的,有些表主键都很难找,结构现在不能改变,所以采用jdbc来处理;新数据库是我们自己设计结构,所以采用hibernate + spring来处理。spring对jdbc也有良好支持,所以想借用spring来简化 代码和处理 事务。
但是碰到以下问题:
1.jdbcTemplate 需要DataSource, 而我们在hibernate的DAO中已经配置了一个DataSource,如何增加一个DataSource呢?
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName"><value>com.sybase.jdbc2.jdbc.SybDriver</value></property>
		<property name="url"><value>jdbc:sybase:Tds:182.2.183.150:5000/rls?charset=eucgb</value></property>
		<property name="username"><value>sa</value></property>
		<property name="password"><value>111111</value></property>
	</bean>

2.事务处理
我们现在的事务处理如下:
<bean id="txProxyTemplate" abstract="true"
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="transactionManager"><ref bean="transactionManager"/></property>
        <property name="transactionAttributes">
            <props>
                <prop key="save*">PROPAGATION_REQUIRED</prop>
                <prop key="update*">PROPAGATION_REQUIRED</prop>
                <prop key="remove*">PROPAGATION_REQUIRED</prop>
                <prop key="*">PROPAGATION_REQUIRED</prop>
                <!--<prop key="*">PROPAGATION_REQUIRED,readOnly</prop-->
            </props>
        </property>
    </bean>  

    <!-- Generic manager that can be used to do basic CRUD operations on any objects -->
    <bean id="manager" parent="txProxyTemplate">
        <property name="target">
            <bean class="net.gbicc.loan.service.impl.BaseManager">
                <property name="DAO"><ref bean="dao"/></property>
            </bean>
        </property>
    </bean>


如果在manager里面 加入一个 JDBCDAO(连接另外一个db) 还能利用txProxyTemplate来处理 事务么?
denis 写道
但是jdbc daosupport和hibernate daosupport却能被wrap到同一个事务里。成立需要几点条件:
1、使用同一个datasource
2、事务交由hibernateTransactionManager管理
3、相关dao以及service需要使用runtime exception体系,使用spring提供的exception可以,自己封装设计的runtime exception体系也行。

根据denis这段话这两个dao不能捆绑在一个事务中,那要怎么来处理好呢?
   发表时间:2005-05-11  
datasource已经加入了2个,直接加一个datasource就可以,难道这就是DI?
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName"><value>com.sybase.jdbc2.jdbc.SybDriver</value></property>
		<property name="url"><value>jdbc:sybase:Tds:182.2.183.150:5000/rls?charset=eucgb</value></property>
		<property name="username"><value>sa</value></property>
		<property name="password"><value>111111</value></property>
	</bean>
	<bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName"><value>com.sybase.jdbc2.jdbc.SybDriver</value></property>
		<property name="url"><value>jdbc:sybase:Tds:182.2.183.148:5000/rls?charset=eucgb</value></property>
		<property name="username"><value>sa</value></property>
		<property name="password"><value>111111</value></property>
	</bean>

现在的问题是,事务处理有问题,当jdbc这边的dao出现异常可以正常回滚,hibernate这边的dao出现异常就有问题了,jdbc的 dao那边还是成功进行了数据库操作,现在正在寻求解决方案,难道要放弃jdbcTemplate?
0 请登录后投票
   发表时间:2005-05-12  
bygoner 写道
datasource已经加入了2个,直接加一个datasource就可以,难道这就是DI?
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName"><value>com.sybase.jdbc2.jdbc.SybDriver</value></property>
		<property name="url"><value>jdbc:sybase:Tds:182.2.183.150:5000/rls?charset=eucgb</value></property>
		<property name="username"><value>sa</value></property>
		<property name="password"><value>111111</value></property>
	</bean>
	<bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName"><value>com.sybase.jdbc2.jdbc.SybDriver</value></property>
		<property name="url"><value>jdbc:sybase:Tds:182.2.183.148:5000/rls?charset=eucgb</value></property>
		<property name="username"><value>sa</value></property>
		<property name="password"><value>111111</value></property>
	</bean>

现在的问题是,事务处理有问题,当jdbc这边的dao出现异常可以正常回滚,hibernate这边的dao出现异常就有问题了,jdbc的 dao那边还是成功进行了数据库操作,现在正在寻求解决方案,难道要放弃jdbcTemplate?


再写一个txProxyTemplate2
0 请登录后投票
   发表时间:2005-05-12  
pikachu 写道
再写一个txProxyTemplate2

老大,指点一下这个txProxyTemplate2怎么写才能把JDBCDAO和HibernateDAO放在同一个事务里面?

现在我们的做法是放弃了jdbcTemplate,然后在action那一层才能catch到spring 处理service后抛出的NestedRuntimeException,这时候才能connection.rollback(),所以jdbc的connection只能在action这层获得,这种做法真是不伦不类啊,ugly啊,ugly。
0 请登录后投票
   发表时间:2005-05-16  
bygoner 写道
项目中必须同时操作两个数据库,都是sybase 11,旧数据库是N 年前设计的,有些表主键都很难找,结构现在不能改变,所以采用jdbc来处理;新数据库是我们自己设计结构,所以采用hibernate + spring来处理。spring对jdbc也有良好支持,所以想借用spring来简化 代码和处理 事务。



你应该使用JTA TransactionManager。在JTA事务方式下,session的生命周期小于事务的生命周期,所以编程方式和jdbc事务方式不同。幸运的是spring提供的SessionFactoryUtils类可以自动侦测到你使用的transactionManager是JTA的还是jdbc的,所以可以做到透明切换transactionManager而编程方式无须更改。

需要注意的是在你的服务器上建立的datasource需要支持tx,如果你的服务器不支持也可使用三方的,例如jotm。其他的没什么了,和你习惯的编程方式没什么两样。具体也可以到spring的论坛分版data Access上去查,相关帖子多的很。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics