关于使用Hibernate+spring+dubbo的实现微服务对象查询
背景
最近在做一个智能家居的设备管理项目,前期连接设备主机设计在500左右,可能以后设备数目还会增加设备还会增加,项目是别人手中接到到半成品,就自己折腾折腾吧;接手的时候只有consumer,没有producers;数据库查询时借用的dubbo查询接口;没的说首先就建立好对应的producers,查询了不少的相关博客;自己最后就给各位大佬做个总结;也希望对以后的读者有点用;
建立过程
因为项目中直接使用对象查询方式,这样的话使用HibernateTemplate对象查询比较适合,建立起来也比较简单;
- 在hibernate的配置文件中加入相关的配置,这里我就贴出整个配置文件供大家参考;
<?xml version="1.0" encoding="UTF-8"?>
< beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd "><!-- 引用外部数据库配置文件 -->
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>file:config/properties/database.properties</value>
</list>
</property>
<!-- 设置编码格式 -->
<property name="fileEncoding" value="UTF-8"></property>
</bean><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClassName}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="autoCommitOnClose" value="true" />
<property name="checkoutTimeout" value="4000" />
<property name="initialPoolSize" value="15" />
<property name="minPoolSize" value="3" />
<property name="maxPoolSize" value="300" />
<property name="maxIdleTime" value="30000" />
<property name="acquireIncrement" value="3" />
<property name="maxIdleTimeExcessConnections" value="1800" />
<!-- 添加 2017-9-1 -->
<!--每60秒检查所有连接池中的空闲连接。Default: 0 -->
<property name="idleConnectionTestPeriod" value="60" />
<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
<property name="acquireRetryAttempts" value="30" />
<property name="breakAfterAcquireFailure" value="true" />
<property name="testConnectionOnCheckout" value="false" />
</bean><!-- Hibernate配置 sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property><property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true </prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>
</props>
</property><property name="mappingResources">
<list>
<value>/hibernate/Device.hbm.xml</value>
<value>/hibernate/Project.hbm.xml</value>
<value>/hibernate/Rcu.hbm.xml</value>
<value>/hibernate/Energy.hbm.xml</value>
<value>/hibernate/RoomArea.hbm.xml</value>
<value>/hibernate/Scene.hbm.xml</value>
<value>/hibernate/Service.hbm.xml</value>
</list>
</property></bean>
<!-- 创建Hibernate操作数据库的模版 -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 使用XML方式配置事物-->
<tx:advice id="txAdvice" transaction-manager="transactionManager" >
<tx:attributes>
<tx:method name="backup*" propagation="REQUIRED"/>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="select*" read-only="true"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="bussinessService" expression="execution(public * com.moorgen.service.impl.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="bussinessService" />
</aop:config><!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 开启事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager" /></beans>
2. 上面主要是--创建Hibernate操作数据库的模版,其他的都是一般的过场;随后将其注入到DaoImpl中
@Autowired
private HibernateTemplate hibernateTemplate;其他的怎么折腾就随意了;列举两个
public Object selectByParam(Object param) throws Exception {
return hibernateTemplate.findByExample(param);
}public Integer insert(Object obj) throws Exception {
return (Integer) this.hibernateTemplate.save(obj);
}public void update(Object obj) throws Exception {
this.hibernateTemplate.update(obj);
}
总结
过程并不复杂,而且用起来也比较顺手,最后还有这样的数据库查询可以使用dubbo高可用开启多个,防止高并发的压力,查询的方案开一配置在消费者属性中,选项类似spring-cloud那几种,大同小异吧!