关于使用Hibernate+spring+dubbo的实现微服务对象查询

  • 背景

      最近在做一个智能家居的设备管理项目,前期连接设备主机设计在500左右,可能以后设备数目还会增加设备还会增加,项目是别人手中接到到半成品,就自己折腾折腾吧;接手的时候只有consumer,没有producers;数据库查询时借用的dubbo查询接口;没的说首先就建立好对应的producers,查询了不少的相关博客;自己最后就给各位大佬做个总结;也希望对以后的读者有点用;

  • 建立过程

        因为项目中直接使用对象查询方式,这样的话使用HibernateTemplate对象查询比较适合,建立起来也比较简单;

  1. 在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那几种,大同小异吧!

posted @ 2018-04-21 16:36  随心勿欲  阅读(725)  评论(0编辑  收藏  举报