SpringMVC+Atomikos+TinyDSL
最近在客户现场支持了一个月,去后不久发现了一个挺有意思的框架,对它的数据库访问组件产生了浓厚的兴趣,写了个小例子,同时在论坛上发布了一个帖子,具体的如下:
一直在.NET平台下,去年底因为项目的需要开始实际接触J2EE,通过半年的时间也算有所了解,Hibernate也算用的熟练了。在.NET平台下可以配合LINQ来使用NHibernate,那种方式一方面让人感觉代码清爽优雅,一方面也便于维护与管理。但是在这半年使用Hibernate的时候感觉很别扭,虽然HQL可以让我觉的是在面向对象开发,可是大段的字符串真是看起来不爽,另外错没错只有在运行时才知道。直到前些阵子听说了Tiny,发现了TinyDSL数据库组件之后,便产生了浓厚的兴趣。
鉴于之前开发的企业应用大部分都会同时操纵两个或者两个以上的数据库,所以在接触新的框架或组件时,我会更多的关注多数据库操作方面的支持,其实要求也不多,只要能够同时操纵多个数据库,可以在出现错误的时候进行事务回滚即可。
之前发了一个求助帖,在肯定了方向之后,我就把SpringMVC和TinyDSL整合了,今天完成了示例,所以来分享一下。我想我不太可能应用所有的组件和框架,而且学习时间和曲线应该不允许,我会持续更新这个例子,我只是希望能够整合使用TinyUI和TinyDSL。另外我也希望有朋友可以针对数据库访问方面提供好的建议,除了这么整合,是否还有其它更好的方案。
首先依赖于两个核心库:springframework4.0和atomikos3.9,另外引入了Tiny的DSL组件,如下:
- <!-- tiny -->
- <dependency>
- <groupId>org.tinygroup</groupId>
- <artifactId>org.tinygroup.tinysqldsl</artifactId>
- <version>${tiny.version}</version>
- </dependency>
- <dependency>
- <groupId>org.tinygroup</groupId>
- <artifactId>org.tinygroup.jdbctemplatedslsession</artifactId>
- <version>${tiny.version}</version>
- </dependency>
- <dependency>
- <groupId>org.tinygroup</groupId>
- <artifactId>org.tinygroup.databasechange</artifactId>
- <version>${tiny.version}</version>
- </dependency>
在配置文件中声明了两个datasource,这两个datasource的类型为“com.atomikos.jdbc.AtomikosDataSourceBean”,然后使用这两个datasource创建了两个dslsession,关键配置就是这些了。
- <bean id="dataSource1" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">
- <property name="uniqueResourceName" value="jdbc_ds1"/>
- <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/>
- <property name="poolSize" value="3"/>
- <property name="maxPoolSize" value="30"/>
- <property name="minPoolSize" value="1"/>
- <property name="xaProperties">
- <props>
- <prop key="user">root</prop>
- <prop key="password">root</prop>
- <prop key="url">jdbc:mysql://127.0.0.1:3306/ces.services?useUnicode=true&charaterEncoding=utf-8</prop>
- </props>
- </property>
- <property name="testQuery" value="select 1"/>
- </bean>
- <bean id="dslSession1" scope="prototype"
- class="org.tinygroup.jdbctemplatedslsession.SimpleDslSession">
- <constructor-arg>
- <ref bean="dataSource1"/>
- </constructor-arg>
- </bean>
- <bean id="dslSession2" scope="prototype"
- class="org.tinygroup.jdbctemplatedslsession.SimpleDslSession">
- <constructor-arg>
- <ref bean="dataSource2"/>
- </constructor-arg>
- </bean>
测试的代码如下:
- public void createUser(String userId) throws Exception{
- User user = new User();
- user.setUserId(userId);
- user.setUserName("张三");
- Account account = new Account();
- account.setId(UUID.randomUUID().toString());
- account.setAccount("zhangsan");
- account.setUserId(user.getUserId());
- userService.addUser(user);
- if (userId.equals("test01")) {
- throw new Exception("人为制造的错误");
- }
- accountService.addAccount(account);
- }
如果是正常的情况,会在数据库的Account和User两张表内增加两条记录;如果传入的ID为test01,强执抛出错误让数据回滚。测试了几次之后,确定是有效的。
最后,源码的下载地址在这里:https://git.oschina.net/xnck/xnckMavenTest。