【SSH网上商城项目实战16】Hibernate的二级缓存处理首页的热门显示

        网上商城首页都有热门商品,那么这些商品的点击率是很高的,当用户点击某个热门商品后需要进入商品的详细信息页面,就像淘宝里面那样。那么每次点击都要去后台查询一下该商品的详细信息,就会发送相应的sql语句,每次刷新一下详细页面也会发sql语句,这样的话,性能肯定会受到很大的影响。那么使用hibernate的二级缓存就可以解决这个问题。

        有些人可能会想,我们可以使用重定向,这样的话,在用户第一次访问的时候把信息查出来放到session中,以后每次用户刷新就可以去session中拿了,这样就不用去数据库中查询了,这是有道理的,但是不能解决上面的问题,因为我们要解决的是多用户去访问同一商品,去点击同一商品,重定向只能保证同一用户去点击或刷新。但是二级缓存可以解决这些问题。

        我们先详细解说一下基于Hibernate4.3的二级缓存技术,然后再针对本项目做一个具体的配置。

1. Hibernate4.3二级缓存基本配置

        与Hibernate3不同,Hibernate4.3的核心包里没有跟缓存相关的类,我们要用二级缓存的话,需要加上缓存的jar包,从官方下载的hibernate-release-4.3.11.Final中的lib/optional/ehcache中有二级缓存所需要的jar包,先要添加到工程中。如下:


       然后我们在hibernate.cfg.xml中配置二级缓存相关的配置:

  1. <hibernate-configuration>  
  2.   
  3.     <session-factory>  
  4.         <property name=“dialect”>  
  5.             org.hibernate.dialect.MySQLDialect  
  6.         </property>  
  7.           
  8.         <property name=“show_sql”>true</property>  
  9.           
  10.         <!– 配置二级缓存提供商,注意此处并不是缓存的jar包 –>  
  11.         <property name=“hibernate.cache.region.factory_class”>org.hibernate.cache.ehcache.EhCacheRegionFactory</property>  
  12.           
  13.         <mapping class=“cn.it.shop.model.Category” />  
  14.         <mapping class=“cn.it.shop.model.Account” />  
  15.         <mapping class=“cn.it.shop.model.Product” />  
  16.   
  17.         <!– 配置哪些类支持缓存,这里主要是显示首页的热门商品,所以Product类支持缓存 –>  
  18.         <class-cache usage=“read-only” class=“cn.it.shop.model.Product”/>  
  19.     </session-factory>  
  20.   
  21. </hibernate-configuration>  
<hibernate-configuration>

    <session-factory>
        <property name="dialect">
            org.hibernate.dialect.MySQLDialect
        </property>

        <property name="show_sql">true</property>

        <!-- 配置二级缓存提供商,注意此处并不是缓存的jar包 -->
        <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

        <mapping class="cn.it.shop.model.Category" />
        <mapping class="cn.it.shop.model.Account" />
        <mapping class="cn.it.shop.model.Product" />

        <!-- 配置哪些类支持缓存,这里主要是显示首页的热门商品,所以Product类支持缓存 -->
        <class-cache usage="read-only" class="cn.it.shop.model.Product"/>
    </session-factory>

</hibernate-configuration>
        然后我们开启tomcat服务器,然后访问首页,点击热门商品,后台就没有再发送sql语句了,大家可能会纳闷,难道二级缓存就这么简单?配置上面这两个项就搞定了?其实到现在为止,二级缓存已经生效的原因是它有个默认的配置,在上面那个ehcache-core-2.4.3.jar中有个ehcache-failsafe.xml文件,里面已经有了默认配置,我们等会再具体分析。我们先来分析一下Hibernate的查询策略:

2. Hibernate4.3的查询策略

        Hibernate支持两种查询方式:session查询和hql查询。
        session中有session.save()  update() delete() get() load()等方法,此方式仅仅操作一条记录,默认不用任何配置就支持二级缓存。因此:read-only配置对session是生效的。在session中如果二级缓存中配置了read-only,则session.update()和delete()操作都会失败,如果想要成功,则需要配置成read-write。但是save()和get() load()是成功的。
        hql:此方式默认是用来操作多条记录,比如list()和executeUpdate() 方法。此方式默认二级缓存的配置包括read-only是无效的。hql的list()查询的是多条记录,直接查询数据库,并将查询的结果交给二级缓存,便于get()和load()的调用。executeUpdate也是不支持二级缓存的,也是直接到数据库更新,Hibernate会保证数据库与缓存同步。注意:hql是没有save()方法的,如果需要插入数据只能调用session.save()方法。
       【注】:Hibernate中的一级缓存(默认存在)也称为session级别缓存,不是用来提升性能,而是用来处理事务的;二级缓存为sessionFactory缓存,对所有session都有效,生命周期与sessionFactory相同(sessionFactory是单例,而且项目启动时候就会创建)。

        具体的查询策略,我们看下面的这张图:


        【注】:图片文字如果太小,可以把图片拖到新的窗口看~

        以上就是Hibernate的查询的策略,下面我们来继续看二级缓存的配置。

3. Hibernate4.3二级缓存高级配置

        上面提到了,我们之所以在hibernate.cfg.xml中配置了两项就可以使用二级缓存,是因为有个默认的配置,下面我们先来看一下这个默认配置:

  1. <ehcache xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xsi:noNamespaceSchemaLocation=“../config/ehcache.xsd”>  
  2.       
  3.     <!– 如果缓存内存溢出,则存储到硬盘空间 –>  
  4.     <diskStore path=“java.io.tmpdir”/>  
  5.   
  6.     <defaultCache  
  7.         maxElementsInMemory=“10000” : <!– 内存支持的最大对象的数量 –>  
  8.         eternal=“false”     :<!– 对象是否永久生效,建议为false,这样下面的两个参数才会有效 –>  
  9.         timeToIdleSeconds=“60” :<!– 对象的间隔周期,默认单位为秒。即60秒后如果还没人用这个对象,会提前销毁 –>  
  10.         timeToLiveSeconds=“120” :<!– 对象的生命周期,默认单位为秒 –>  
  11.         overflowToDisk=“true”   :<!– 是否支持溢出到硬盘,建议为true –>  
  12.         maxElementsOnDisk=“10000000” :<!– 硬盘上支持的最大对象的数量 –>  
  13.         memoryStoreEvictionPolicy=“LRU” :<!– 对象的替换策略 –>  
  14.        />       
  15. </ehcache>  
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">

    <!-- 如果缓存内存溢出,则存储到硬盘空间 -->
    <diskStore path="java.io.tmpdir"/>

    <defaultCache
        maxElementsInMemory="10000" : <!-- 内存支持的最大对象的数量 -->
        eternal="false"     :<!-- 对象是否永久生效,建议为false,这样下面的两个参数才会有效 -->
        timeToIdleSeconds="60" :<!-- 对象的间隔周期,默认单位为秒。即60秒后如果还没人用这个对象,会提前销毁 -->
        timeToLiveSeconds="120" :<!-- 对象的生命周期,默认单位为秒 -->
        overflowToDisk="true"   :<!-- 是否支持溢出到硬盘,建议为true -->
        maxElementsOnDisk="10000000" :<!-- 硬盘上支持的最大对象的数量 -->
        memoryStoreEvictionPolicy="LRU" :<!-- 对象的替换策略 -->
       />     
</ehcache>
        关于默认配置的相关解释已经在上面的注释中了,我们现在知道了,正因为这个默认的配置,才使得Hibernate4.3的二级缓存得以正确执行。现在如果我们要自己进行缓存的配置,就需要自己在src目录下新建一个ehcache.xml文件,然后在里面对上面这些配置项重新配置即可。我们接下来要测试一下各个配置,在测试之前,我先把首页显示的情况贴出来,并编个号,等会测试的时候好说明:

        以上是首页显示的部分内容,Hibernate已经从数据库中帮我们查出了显示信息,并且已经显示好了。我们将它们编个号,等会我们测试缓存的时候就方便分析了。下面我们开始测试一下上面的缓存配置项:

        测试一:测试内存中的对象数量。将配置改成下面情况:

  1. <defaultCache  
  2.          maxElementsInMemory=“6” <!– 设置只支持缓存6个 –>  
  3.          eternal=“true”  
  4.          overflowToDisk=“false”  
  5.          memoryStoreEvictionPolicy=“FIFO” :<!– 先进先出 –>  
  6.          />  
<defaultCache
         maxElementsInMemory="6" <!-- 设置只支持缓存6个 -->
         eternal="true"
         overflowToDisk="false"
         memoryStoreEvictionPolicy="FIFO" :<!-- 先进先出 -->
         />
配置好后,我们重启一下服务器,打开首页,由于配置的是6个,所以缓存中只存了最后查出来的6条记录,也就是编号3-8,我们点击3-8中的任何一个商品进入商品详细页面,注意看后台的控制台没有输出任何查询信息,说明并没有发sql语句,但是当我们点击编号2的商品时,后台发了一条sql语句,即查询了数据库,我们后退再次点击2商品,就没有再发sql语句了,说明已经放到缓存里了,但是缓存只支持6条数据,因为配置的对象替换策略是先进先出,所以刚刚缓存中的编号3被移除,我们点击一下3试试,发了一条sql语句,于是测试完毕,二级缓存执行正常。

        测试二:测试对象的生命周期。将配置改成下面的情况:

  1. <defaultCache  
  2.      maxElementsInMemory=“100”  
  3.      eternal=“false” <!– 配成false才能设置下面的生命周期 –>  
  4.      timeToIdleSeconds=“20”   
  5.      timeToLiveSeconds=“40”  
  6.      overflowToDisk=“false”  
  7.      memoryStoreEvictionPolicy=“FIFO”  
  8.      />  
<defaultCache
     maxElementsInMemory="100"
     eternal="false" <!-- 配成false才能设置下面的生命周期 -->
     timeToIdleSeconds="20" 
     timeToLiveSeconds="40"
     overflowToDisk="false"
     memoryStoreEvictionPolicy="FIFO"
     />
上面配置了缓存的时间为40秒,如果20秒没有操作就移除。由于我们配了100条记录,所以上面编号1-8都在缓存里,我们开启服务器后,随便点击一个,比如点击编号8,没有发出sql语句,正常,20秒后,再点击编号8,发了一条sql语句,说明我们配置的生命周期生效了。这里要注意一下,不能配置太短,比如配置10秒,因为tomcat启动也要好几秒,如果配置少了,还没测试可能时间已经到了……那就不行了。

        测试三: 测试二级缓存是否支持硬盘存储。

  1. <defaultCache  
  2.      maxElementsInMemory=“4”  
  3.      eternal=“false” <!– 配成false才能设置下面的生命周期 –>  
  4.      timeToIdleSeconds=“100”   
  5.      timeToLiveSeconds=“200”  
  6.      overflowToDisk=“true”  <!– 配置成true才支持硬盘存储 –>  
  7.      memoryStoreEvictionPolicy=“FIFO”  
  8.      />  
<defaultCache
     maxElementsInMemory="4"
     eternal="false" <!-- 配成false才能设置下面的生命周期 -->
     timeToIdleSeconds="100" 
     timeToLiveSeconds="200"
     overflowToDisk="true"  <!-- 配置成true才支持硬盘存储 -->
     memoryStoreEvictionPolicy="FIFO"
     />
我们将支持硬盘存储设置成了true,并将二级缓存最大存储量配置成了4。重启服务器,因为二级缓存最多存4条记录,所以肯定是编号5-8,点击5-8肯定不会发sql语句,但是当我们点击1-4时,也不会发sql语句,因为我们设置了支持硬盘存储,Hibernate将查询结果存在硬盘上了,所以我们也可以直接拿到数据,不需要发sql语句。

        测试四: 测试二级缓存的替换策略

  1. <defaultCache  
  2.      <!–   
  3.       FIFO已经淘汰了,不会再用了……   
  4.       LRU:最近最少被访问算法(时间策略),会忽略访问频率,离现在最远时间访问的会被替换掉  
  5.       LFU:最近最未使用算法(频率测量),会忽略访问的先后时间,访问频率最少的会被替换掉  
  6.      –>  
  7.      maxElementsInMemory=“3”  
  8.      eternal=“false” <!– 配成false才能设置下面的生命周期 –>  
  9.      timeToIdleSeconds=“100”   
  10.      timeToLiveSeconds=“200”  
  11.      overflowToDisk=“false”  <!– 配置成true才支持硬盘存储 –>  
  12.      memoryStoreEvictionPolicy=“LFU”  
  13.      />  
<defaultCache
     <!-- 
      FIFO已经淘汰了,不会再用了…… 
      LRU:最近最少被访问算法(时间策略),会忽略访问频率,离现在最远时间访问的会被替换掉
      LFU:最近最未使用算法(频率测量),会忽略访问的先后时间,访问频率最少的会被替换掉
     -->
     maxElementsInMemory="3"
     eternal="false" <!-- 配成false才能设置下面的生命周期 -->
     timeToIdleSeconds="100" 
     timeToLiveSeconds="200"
     overflowToDisk="false"  <!-- 配置成true才支持硬盘存储 -->
     memoryStoreEvictionPolicy="LFU"
     />
顾名思义,LRU和LFU分别是关注最后访问时间和访问频率的,我们拿LFU来举例子,现在我们设置了最大存储为3条记录,也就是编号6-8,现在我们依次访问编号6三次,编号7两次,编号8一次,都不会发sql语句,我们再访问编号7,发了sql语句,现在编号7存在了缓存里,编号8已经被移除了,因为它访问的次数最少,我们可以再次点击编号8测试一下,发出了sql语句,测试成功。如果是LRU,则刚刚移除的是编号6,因为编号6最早访问的。

        到这里,相信大家对二级缓存的使用已经掌握了,二级缓存的测试就到这里。下面针对我们这个网上商城的项目做一下配置。

4. 网上商城项目的实际配置

        我们配置二级缓存的最大记录数为1000,设置生命周期为120秒,间隔周期为60秒,支持硬盘存储,并且使用频率优先(LFU)的替换策略,因为用户点击率高的,肯定要放在二级缓存里。

  1. <ehcache xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xsi:noNamespaceSchemaLocation=“../config/ehcache.xsd”>  
  2.       
  3.     <!– 如果缓存内存溢出,则存储到硬盘空间 –>  
  4.     <diskStore path=“java.io.tmpdir”/>  
  5.   
  6.     <defaultCache  
  7.             maxElementsInMemory=“1000”  
  8.             eternal=“false”  
  9.             timeToIdleSeconds=“60”  
  10.             timeToLiveSeconds=“120”  
  11.             overflowToDisk=“true”  
  12.             memoryStoreEvictionPolicy=“LFU”  
  13.             />       
  14. </ehcache>  
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">

    <!-- 如果缓存内存溢出,则存储到硬盘空间 -->
    <diskStore path="java.io.tmpdir"/>

    <defaultCache
            maxElementsInMemory="1000"
            eternal="false"
            timeToIdleSeconds="60"
            timeToLiveSeconds="120"
            overflowToDisk="true"
            memoryStoreEvictionPolicy="LFU"
            />     
</ehcache>
        好了,结合网上商城这个项目,Hibernate4.3的二级缓存配置及使用就介绍完了。


        相关阅读:http://blog.csdn.net/column/details/str2hiberspring.html

         整个项目的源码下载地址:http://blog.csdn.NET/eson_15/article/details/51479994

_____________________________________________________________________________________________________________________________________________________

—–乐于分享,共同进步!

—–更多文章请看:http://blog.csdn.net/eson_15
document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000)
    <div id="digg" articleid="51405911">
        <dl id="btnDigg" class="digg digg_enable" onclick="btndigga();">

             <dt>顶</dt>
            <dd>5</dd>
        </dl>


        <dl id="btnBury" class="digg digg_enable" onclick="btnburya();">

              <dt>踩</dt>
            <dd>0</dd>               
        </dl>

    </div>
 <div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);" target="_blank">&nbsp;</a>   </div>
<div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);" target="_blank">&nbsp;</a></div>
<script type="text/javascript">
            function btndigga() {
                $(".tracking-ad[data-mod='popu_222'] a").click();
            }
            function btnburya() {
                $(".tracking-ad[data-mod='popu_223'] a").click();
            }
        </script>

<div style="clear:both; height:10px;"></div>


    <div class="similar_article" style="">
            <h4>我的同类文章</h4>
            <div class="similar_c" style="margin:20px 0px 0px 0px">
                <div class="similar_c_t">
                            <label class="similar_cur">
                                <span style="cursor:pointer" onclick="GetCategoryArticles('6214186','eson_15','foot','51405911');">------【SSH网上商城】<em>(29)</em></span>
                            </label>
                            <label class="">
                                <span style="cursor:pointer" onclick="GetCategoryArticles('6228419','eson_15','foot','51405911');">●  项目实战<em>(29)</em></span>
                            </label>
                            <label class="">
                                <span style="cursor:pointer" onclick="GetCategoryArticles('6183973','eson_15','foot','51405911');">------【Hibernate】<em>(4)</em></span>
                            </label>
                            <label class="">
                                <span style="cursor:pointer" onclick="GetCategoryArticles('6228418','eson_15','foot','51405911');">●  框架技术<em>(45)</em></span>
                            </label>
                </div>

                <div class="similar_wrap tracking-ad" data-mod="popu_141" style="max-height:195px;">
                    <a href="http://blog.csdn.net" style="display:none" target="_blank">http://blog.csdn.net</a>
                    <ul class="similar_list fl"><li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51506334" id="foot_aritcle_51506334undefined5877770304575898" target="_blank" title="【SSH网上商城项目实战29】使用JsChart技术在后台显示商品销售报表">【SSH网上商城项目实战29】使用JsChart技术在后台显示商品销售报表</a><span>2016-05-26</span><label><i>阅读</i><b>6059</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51484247" id="foot_aritcle_51484247undefined5648361109756623" target="_blank" title="【SSH网上商城项目实战27】域名空间的申请和项目的部署及发布">【SSH网上商城项目实战27】域名空间的申请和项目的部署及发布</a><span>2016-05-23</span><label><i>阅读</i><b>13823</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51475431" id="foot_aritcle_51475431undefined7288378466604581" target="_blank" title="【SSH网上商城项目实战26】完成订单支付后的短信发送功能">【SSH网上商城项目实战26】完成订单支付后的短信发送功能</a><span>2016-05-22</span><label><i>阅读</i><b>4705</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51465067" id="foot_aritcle_51465067undefined9315895892502435" target="_blank" title="【SSH网上商城项目实战24】Struts2中如何处理多个Model请求">【SSH网上商城项目实战24】Struts2中如何处理多个Model请求</a><span>2016-05-21</span><label><i>阅读</i><b>4245</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51452243" id="foot_aritcle_51452243undefined35145250165694275" target="_blank" title="【SSH网上商城项目实战22】获取银行图标以及支付页面的显示">【SSH网上商城项目实战22】获取银行图标以及支付页面的显示</a><span>2016-05-19</span><label><i>阅读</i><b>3742</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51441431" id="foot_aritcle_51441431undefined39915922005818283" target="_blank" title="【SSH网上商城项目实战20】在线支付平台的介绍">【SSH网上商城项目实战20】在线支付平台的介绍</a><span>2016-05-18</span><label><i>阅读</i><b>4107</b></label></li> </ul>

                    <ul class="similar_list fr"><li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51487323" id="foot_aritcle_51487323undefined8729011063460528" target="_blank" title="【SSH网上商城项目实战28】使用Ajax技术局部更新商品数量和总价">【SSH网上商城项目实战28】使用Ajax技术局部更新商品数量和总价</a><span>2016-05-24</span><label><i>阅读</i><b>5338</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51479994" id="foot_aritcle_51479994undefined7583807782859109" target="_blank" title="【SSH网上商城项目实战30】项目总结(附源码下载地址)">【SSH网上商城项目实战30】项目总结(附源码下载地址)</a><span>2016-05-27</span><label><i>阅读</i><b>21892</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51475046" id="foot_aritcle_51475046undefined6149989210362272" target="_blank" title="【SSH网上商城项目实战25】使用java email给用户发送邮件">【SSH网上商城项目实战25】使用java email给用户发送邮件</a><span>2016-05-22</span><label><i>阅读</i><b>4008</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51464415" id="foot_aritcle_51464415undefined5639863893834067" target="_blank" title="【SSH网上商城项目实战23】完成在线支付功能">【SSH网上商城项目实战23】完成在线支付功能</a><span>2016-05-20</span><label><i>阅读</i><b>8822</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51447492" id="foot_aritcle_51447492undefined9736030156261124" target="_blank" title="【SSH网上商城项目实战21】从Demo中看易宝支付的流程">【SSH网上商城项目实战21】从Demo中看易宝支付的流程</a><span>2016-05-18</span><label><i>阅读</i><b>9655</b></label></li> </ul>
                <a href="http://blog.csdn.net/eson_15/article/category/6214186" class="MoreArticle">更多文章</a></div>
            </div>
        </div>    
<script type="text/javascript">
    $(function () {
        GetCategoryArticles('6214186', 'eson_15','foot','51405911');
    });
</script>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在现有省、市港口信息化系统进行有效整合基础上,借鉴新 一代的感知-传输-应用技术体系,实现对码头、船舶、货物、重 大危险源、危险货物装卸过程、航管航运等管理要素的全面感知、 有效传输和按需定制服务,为行政管理人员和相关单位及人员提 供高效的管理辅助,并为公众提供便捷、实时的水运信息服务。 建立信息整合、交换和共享机制,建立健全信息化管理支撑 体系,以及相关标准规范和安全保障体系;按照“绿色循环低碳” 交通的要求,搭建高效、弹性、高可扩展性的基于虚拟技术的信 息基础设施,支撑信息平台低成本运行,实现电子政务建设和服务模式的转变。 实现以感知港口、感知船舶、感知货物为手段,以港航智能 分析、科学决策、高效服务为目的和核心理念,构建“智慧港口”的发展体系。 结合“智慧港口”相关业务工作特点及信息化现状的实际情况,本项目具体建设目标为: 一张图(即GIS 地理信息服务平台) 在建设岸线、港口、港区、码头、泊位等港口主要基础资源图层上,建设GIS 地理信息服务平台,在此基础上依次接入和叠加规划建设、经营、安全、航管等相关业务应用专题数据,并叠 加动态数据,如 AIS/GPS/移动平台数据,逐步建成航运管理处 "一张图"。系统支持扩展框架,方便未来更多应用资源的逐步整合。 现场执法监管系统 基于港口(航管)执法基地建设规划,依托统一的执法区域 管理和数字化监控平台,通过加强对辖区内的监控,结合移动平 台,形成完整的多维路径和信息追踪,真正做到问题能发现、事态能控制、突发问题能解决。 运行监测和辅助决策系统 对区域港口与航运业务日常所需填报及监测的数据经过科 学归纳及分析,采用统一平台,消除重复的填报数据,进行企业 输入和自动录入,并进行系统智能判断,避免填入错误的数据, 输入的数据经过智能组合,自动生成各业务部门所需的数据报 表,包括字段、格式,都可以根据需要进行定制,同时满足扩展 性需要,当有新的业务监测数据表需要产生时,系统将分析新的 需求,将所需字段融合进入日常监测和决策辅助平台的统一平台中,并生成新的所需业务数据监测及决策表。 综合指挥调度系统 建设以港航应急指挥中心为枢纽,以各级管理部门和经营港 口企业为节点,快速调度、信息共享的通信网络,满足应急处置中所需要的信息采集、指挥调度和过程监控等通信保障任务。 设计思路 根据项目的建设目标和“智慧港口”信息化平台的总体框架、 设计思路、建设内容及保障措施,围绕业务协同、信息共享,充 分考虑各航运(港政)管理处内部管理的需求,平台采用“全面 整合、重点补充、突出共享、逐步完善”策略,加强重点区域或 运输通道交通基础设施、运载装备、运行环境的监测监控,完善 运行协调、应急处置通信手段,促进跨区域、跨部门信息共享和业务协同。 以“统筹协调、综合监管”为目标,以提供综合、动态、实 时、准确、实用的安全畅通和应急数据共享为核心,围绕“保畅通、抓安全、促应急"等实际需求来建设智慧港口信息化平台。 系统充分整合和利用航运管理处现有相关信息资源,以地理 信息技术、网络视频技术、互联网技术、移动通信技术、云计算 技术为支撑,结合航运管理处专网与行业数据交换平台,构建航 运管理处与各部门之间智慧、畅通、安全、高效、绿色低碳的智 慧港口信息化平台。 系统充分考虑航运管理处安全法规及安全职责今后的变化 与发展趋势,应用目前主流的、成熟的应用技术,内联外引,优势互补,使系统建设具备良好的开放性、扩展性、可维护性。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
当然,我可以为你提供一个基本的SSH项目实战教程的大纲。请注意,这只是一个概述,具体的实现细节可能会因项目的要求而有所不同。下面是一个可能的教程结构: 1. 理解SSH - 介绍SSH的定义和作用 - 解释SSH的工作原理和加密机制 2. 项目需求和准备工作 - 确定你的项目需求和目标 - 配置服务器环境(例如安装操作系统、设置网络连接等) 3. 生成SSH密钥对 - 创建公钥和私钥 - 将公钥添加到服务器上的authorized_keys文件中 4. 连接到服务器 - 使用SSH客户端连接到服务器 - 验证密钥对是否有效 5. 实现远程命令执行 - 编写一个简单的脚本或程序,使用SSH连接到服务器并执行命令 - 尝试在本地机器上执行一些基本命令,例如列出文件、创建目录等 6. 文件传输 - 学习如何使用SCP或SFTP等工具在本地机器和远程服务器之间传输文件 - 演示如何上传和下载文件 7. 高级功能 - 探索SSH的一些高级功能,例如端口转发、代理设置等 - 根据项目需求选择并实现适当的高级功能 8. 安全性和最佳实践 - 强调SSH安全性的重要性,并提供一些最佳实践建议 - 演示如何配置和保护SSH服务器 9. 测试和部署 - 确保你的SSH项目在不同环境中都能正常工作 - 准备将你的项目部署到实际生产环境中 请注意,这只是一个大致的教程结构,具体的步骤和实现细节可能因项目需求和技术栈而有所不同。你可以根据自己的需求和兴趣来深入学习和实践SSH项目。希望这个大纲能为你提供一些指导!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值