• 关于使用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那几种,大同小异吧!

  • 相关阅读:
    绑定class -vue
    二叉树按层打印,并且按层换行的方法
    curl相关知识
    python创建简单的http服务器
    有关rides数据库的想法
    java模拟实现有序表操作
    php静态方法
    php关闭浏览器不终止运行
    php读取图片以二进制输出
    借用face++人脸识别,来识别年龄
  • 原文地址:https://www.cnblogs.com/lichunyang321/p/8902117.html
Copyright © 2020-2023  润新知