using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using STSdb.Data;
using System.Reflection;
namespace YQMapTile.Ags.AGS
{
/// <summary>
/// STSDB提供的层块缓存器
/// </summary>
internal class STSTileCache : IAgsTileCache<MemoryStream>
{
//protected StorageEngine cacheEngine = null;
protected XTable<long, byte[]> tileTable = null;
private string sPath;
private string sLyrName;
/// <summary>
/// 采用STS缓存来存储层块数据
/// </summary>
/// <param name="path">Path为缓存数据数据存储路</param>
/// <param name="lyrname"></param>
public STSTileCache(string path, string lyrname)
{
if (string.IsNullOrEmpty(path))
{
Assembly myAssembly = Assembly.GetAssembly(this.GetType());
path = Path.GetDirectoryName(myAssembly.Location);
string sts_dll = Path.Combine(path, "STSdb.dll");
System.Reflection.Assembly.LoadFile(sts_dll);
path = Path.Combine(path, "TileCache");
//如果目录不存在则创建
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
}
string dbFileName = Path.Combine(path,(lyrname+".vstb").ToUpper());
this.initCacheEngine(dbFileName, lyrname);
}
~STSTileCache()
{
this.Close();
}
/// <summary>
/// 关闭时直接全部清空
/// </summary>
public void ShutDown()
{
this.Close();
}
/// <summary>
/// 关闭缓存引擎
/// </summary>
public void Close()
{
try
{
if (null != tileTable)
{
tileTable.Flush();
tileTable.Commit();
tileTable.Close();
tileTable = null;
}
//if (null != cacheEngine)
//{
// cacheEngine.Scheme.Commit();
// cacheEngine.Dispose();
// cacheEngine = null;
//}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
/// <summary>
/// 初始化缓存引擎
/// </summary>
/// <param name="path"></param>
/// <param name="lyrname"></param>
private void initCacheEngine(string path,string lyrname)
{
try
{
sPath = path;
sLyrName = lyrname.ToUpper();
using (StorageEngine cacheEngine = StorageEngine.FromFile(path))
{
tileTable = cacheEngine.Scheme.CreateOrOpenXTable<long, byte[]>(new Locator(sLyrName));
cacheEngine.Scheme.Commit();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
#region Members of IAgsTileCache
public void Add(RawTile tile, MemoryStream data)
{
if (null == tileTable)
this.initCacheEngine(sPath,sLyrName);
if (tileTable != null)
{
tileTable[tile.TileId] = data.ToArray();
tileTable.Flush();
}
}
/// <summary>
/// 获取层块数据
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public MemoryStream GetTileData(RawTile index)
{
if (null == tileTable)
this.initCacheEngine(sPath, sLyrName);
if (null == tileTable) return null;
if (!tileTable.Exists(index.TileId)) return null;
byte[] tdata = tileTable[index.TileId];
if (tdata == null || tdata.Length <= 0) return null;
else return new MemoryStream(tdata);
}
/// <summary>
/// 删除层块数据
/// </summary>
/// <param name="index"></param>
public void Remove(RawTile index)
{
if (null == tileTable)
this.initCacheEngine(sPath, sLyrName);
if(null == tileTable)return ;
//删除数据
tileTable.Delete(index.TileId);
}
/// <summary>
/// 缓存的能力
/// </summary>
public int CacheCapacity
{
get
{
return int.MaxValue - (int)tileTable.Count;
}
set
{
//不处理
}
}
/// <summary>
/// 获取层块数据
/// </summary>
/// <param name="tile"></param>
/// <param name="data"></param>
/// <returns></returns>
public bool TryGetValue(RawTile tile, out MemoryStream data)
{
data = null;
if (null == tileTable)
this.initCacheEngine(sPath, sLyrName);
if (tileTable == null) return false;
if (!tileTable.Exists(tile.TileId)) return false;
byte[] tdata = tileTable[tile.TileId];
if (tdata == null || tdata.Length <= 0) return false;
data = new MemoryStream(tdata);
return true;
}
/// <summary>
/// 是否包含该层块
/// </summary>
/// <param name="tile"></param>
/// <returns></returns>
public bool ContainsKey(RawTile tile) {
if (null == tileTable)
this.initCacheEngine(sPath, sLyrName);
if (tileTable == null) return false;
else return tileTable.Exists(tile.TileId);
}
#endregion
}
}
通过上述方法构建的STS缓存库在ArcMap中调用时在sts 构建元数据CreateObjects时会提示stsdb.dll动态库没有加载,实在想不通
分享到:
相关推荐
在给定的上下文中,提及了“内存数据库”和“文件数据库stsdb”,这表明我们将探讨的是一个融合了内存管理和磁盘存储的数据库解决方案。 内存数据库,顾名思义,将所有数据存储在内存中,以提供比传统磁盘数据库更...
浏览器缓存机制介绍与缓存策略剖析 浏览器缓存机制是指浏览器在请求资源时,对已经请求过的资源进行缓存,以便下次请求时可以直接从缓存中获取,从而提高页面加载速度和减少服务器的压力。本文将详细介绍浏览器缓存...
在面试中,对于缓存相关的知识点,面试官可能会考察你对缓存雪崩、缓存穿透、缓存预热、缓存更新以及缓存降级的理解和处理策略。以下是这些概念的详细解释: 1. **缓存雪崩** 缓存雪崩是指大量缓存在同一时刻过期...
"深入理解MyBatis中的一级缓存与二级缓存" MyBatis是一种流行的持久层框架,它提供了缓存机制来提高应用程序的性能。在MyBatis中,有两种类型的缓存:一级缓存和二级缓存。下面我们将深入了解MyBatis中的一级缓存和...
本地缓存与分布式缓存优缺点、使用场景 缓存是计算机系统中的一种优化技术,通过将频繁访问的数据存储在内存中,以减少对外部存储设备的访问次数,提高系统的响应速度和性能。本文将详细介绍本地缓存与分布式缓存的...
在 IT 领域,缓存是一种重要的技术,用于提高应用程序的性能和响应速度。缓存的基本原理是将常用数据存储在高速、接近计算单元的地方,以便快速访问,减少对慢速存储(如硬盘或网络)的依赖。本文将深入探讨缓存、...
在IT行业中,缓存是一种非常重要的技术,它能够提高应用程序的性能和响应速度,通过将经常访问的数据存储在快速访问的内存中,避免了频繁的数据库查询或计算。本示例将聚焦于“Spring简单的缓存”实现,帮助开发者...
Hibernate 是一个流行的对象关系映射(ORM)框架,它提供了数据缓存机制以优化数据库访问性能。缓存机制分为一级缓存和二级缓存,两者都有助于减少对物理数据库的直接访问,从而提高应用程序的运行效率。 一级缓存...
缓存是一种存储技术,它将频繁使用或近期可能需要的数据临时存储在速度较快、访问成本较低的地方,以便快速读取,减少对原始数据存储(如数据库)的直接访问压力。缓存能够提升数据检索效率,因为从缓存中读取数据...
**hibernate一级缓存、二级缓存和查询缓存** 在Java的持久化框架Hibernate中,缓存机制是提高应用程序性能的关键要素。缓存能够减少数据库的访问次数,提高数据读取速度,并且在一定程度上降低了系统的负载。本文将...
### JSP 页面缓存及其清除方法详解 #### 一、JSP页面缓存的重要性与应用场景 JSP(Java Server Pages)技术是一种结合了HTML、XML和Java编程的技术,用于创建动态网页。在JSP开发中,页面缓存是一种常用的技术手段...
本篇文章将深入探讨如何在Geoserver中配置图层缓存,以及缓存对性能的影响。 一、图层缓存的重要性 图层缓存是Geoserver优化性能的关键机制之一。当用户请求地图时,Geoserver会预先渲染图层并将其存储在硬盘上,...
2. **启用缓存**:相反,如果要模拟有缓存的情况,可以使用`web_cache_enable()`函数开启缓存,并通过`web_cache_control()`来控制缓存策略。例如,可以设置`web_cache_control("cache", "on")`来开启缓存,并通过`...
在Spring Boot应用中,缓存一致性是一个重要的议题,特别是在分布式系统中,多个节点可能同时访问并更新同一数据,导致缓存中的数据不一致。本文将深入探讨Spring Boot中如何处理和解决缓存一致性问题。 首先,我们...
WebAPI接口缓存组件是一种优化WebAPI服务性能的技术,它通过存储先前请求的响应结果,减少不必要的数据库查询或计算,从而提高系统响应速度。本文将详细介绍这个自定义的WebAPI接口缓存组件的设计原理、实现方式及其...
7. **缓存击穿与缓存雪崩**:处理大量并发请求同时导致缓存失效(击穿)或整个缓存服务崩溃(雪崩)的问题,可以通过加锁、使用分布式锁、预热缓存等方式解决。 8. **监控与统计**:为了优化缓存性能,需要收集和...
Redis作为二级缓存是数据库系统优化的一个重要策略,特别是在高并发、大数据量的场景下,可以显著提升应用性能。在Mybatis中,二级缓存是一个跨Mapper共享的区域,用于存储查询结果,避免了重复查询数据库,从而降低...
ASP.NET缓存是微软开发的Web应用程序框架中的一个重要特性,用于提高网站性能和减少服务器负载。缓存技术在.NET框架中扮演着至关重要的角色,它能够存储数据以便快速访问,从而减少对数据库或其他慢速资源的依赖。在...
本篇文章将详细介绍ThinkPHP缓存机制,以及如何使用“THINKPHP缓存清理器”来维护RUNTIME文件夹下的DATA CACHE等文件。 ThinkPHP缓存系统是为了解决应用程序中的数据读取速度问题,特别是对于那些频繁但不经常变化...
在构建高性能的Web应用时,缓存技术是不可或缺的一部分,特别是在大数据量的处理中。"springMybatis+redis三级缓存框架"是一个高效且灵活的解决方案,它将MyBatis的二级缓存与Redis相结合,形成一个三级缓存体系,以...