在软件设计中遇到一个问题是从数据库中读取还是内存中读取

在软件设计中遇到一个问题是从数据库中读取还是内存中读取,第1张

估计是 *** 作日志记录吧,直接查询数据即可,如果数据非常非常大,建议按天分区。

如果放内存,你是想用缓存吧,我觉得这里用缓存不太合适。首先你查询的次数多吗? *** 作不多的话放缓存浪费啊。

实现读写伸缩扩展重构

不重写整个系统,圈定需要伸缩的范围。

保留数据库,在数据库之外进行读写伸缩,这样不必改变数据库表结构。

将数据网格In Memory Data Grid(IMDG)放在数据库之前。IMDG中包含所有热点表或数据表记录,在线Web应用将访问IMDG而不是数据库,IMDG可分布地将读写 *** 作分散到集群服务器上。

何为数据网格

使用write-behind策略减少过多的同步负载。将IMDG中数据持久更新到下面的数据库中是使用异步的批 *** 作。这是通过一种内部查询机制internal queuing mechanism (redo-log))实现的。

切分数据带来好可伸缩性,但是这不代表改变数据表结构,在IMDG数据网格中保存的是另外一种不同于数据库表格式的可切分数据格式应为一种领域对象模型格式。

使用O/R mapping等框架将IMDG中对象数据和关系数据库进行映射,例如Hibernate或OpenJPA。

数据网格和NoSQL区别

面向延迟性latency架构,还是面向吞吐量throughput架构? 数据网格是采取内存作为主要存储,这样就带来很低的延迟; NoSQL则是主要为web-scale工业也就是Web网站系统服务的,用户能够感受的延迟不是非常重要,比如几秒延迟,人是感觉不明显的,这时你不必相应快速,而是应该应付越来越多的请求,也就是解决吞吐量。

如果系统磁盘快满了,可能会影响系统性能。我们可以采取以下措施来解决这个问题:

1 删除不需要的文件或程序以释放磁盘空间。可以使用磁盘清理工具或手动删除文件。

2 移动一些较大的文件到外部存储设备上。例如,将照片、视频等移动到 USB 或外置硬盘。

3 优化数据库,减少其大小。可以采用数据压缩、分区等方法。

4 使用云存储技术,将数据存储在云端,减少本地磁盘占用。

5 增加磁盘空间,可以考虑更换更大容量的硬盘或扩展磁盘空间。

以上方法都可以帮助缓解系统磁盘快满的问题,同时实时读取数据库数据也不会受到太大影响

我觉得你要实现的这个可能跟SpringMvc的关系不是很大。

你要达到的目的其实就是在jvm启动的时候把数据库数据加载一份到内存,一个静态变量和一个静态初始化块就可以搞定你的问题,这两者都是在类加载的时候初始化一次,像前面回答的一样,你可以用一个HashMap搞定。

稍微具体来说,一个静态变量

public static final Map<key,value> cache=new HashMap<key,value>()

static {

cache=请求数据库 *** 作

}

key你自己加,String还是int都行,value是你数据库的结构,可以写个实体。获取的时候直接cacheget(key)就可以了。

方法/步骤

在安装有SQLServer数据库的计算机上,我们在使用数据库的过程中,有时候会在任务管理器里发现sqlservrexe这个进程的内存和CPU占用率较高。

接下来我们来看一下,如何解决上面这个问题,需要设置SQLServer数据库的内存配置。登录数据库,这里使用的是SQLServer2008,右键点击最上方的服务器名,在d出的菜单中,点击属性

打开服务器属性窗口。默认显示的是第一项常规内容,点击第二项内存进行内存配置。

点击内存后,打开服务器内存选项配置界面。这里的使用AWE分配内存可以对内存进行扩展支持,我们要做的是更改下方的最大服务器内存。这个数值根据自己服务器内存大小来做适当设置。

个人建议设置本机内存的一半或稍微高一点,如机器内存为2G,那么我们这里填写1000。需要注意的是内存设置调小以后,在数据库执行较复杂SQL语句的时候,可能会比较慢,出现这种情况,我们再适当上调最大内存配置大小。

直接使用企业管理器好像没有办法 *** 作吧,通过软件或自己做个小软件读取。

#region //读取数据库中到内存并显示

public void LoadToMemoryAndDisable(string serverAdress, string database)

{

//读取数据库中到内存并显示

SqlConnection conn = new SqlConnection("server=" + serverAdress + ";integrated security = sspi;database = " + database);

SqlCommand cmd = new SqlCommand("select from imgtable where imgname like '%bmp%'", conn);

connOpen();

SqlDataReader dr;

try

{

dr = cmdExecuteReader();

drRead();

SystemDataSqlTypesSqlBinary sb = drGetSqlBinary(2);

//或byte[] imageData = (byte[])dr[2];

MemoryStream ms = new MemoryStream(sbValue);//在内存中 *** 作数据

Bitmap bmp = new Bitmap(BitmapFromStream(ms));

thispictureBox1Image = bmp;

drClose();

}

catch (Exception ex)

{

MessageBoxShow(exMessage);

}

finally

{

connClose();

}

}

#endregion

简单来说就是用jdbc:h2:mem:h2db来建立内存模式,并建表,

然后jdbc:h2:tcp://19216820141:8082/mem:h2db来访问上面的内存数据库

package test;

import javasqlConnection;

import javasqlDriverManager;

import javasqlResultSet;

import javasqlSQLException;

import javasqlStatement;

import orgh2toolsServer;

public class H2Demo {

private Server server;

private String port = "8082";

private static String sourceURL1 = "jdbc:h2:mem:h2db";

private static String sourceURL2 = "jdbc:h2:tcp://19216820141:8082/mem:h2db";

private String user = "shorturl";

private String password = "123456";

public void startServer() {

try {

Systemoutprintln("正在启动h2");

server = ServercreateTcpServer(

new String[] { "-tcpPort", port })start();

} catch (SQLException e) {

Systemoutprintln("启动h2出错:" + etoString());

// TODO Auto-generated catch block

eprintStackTrace();

throw new RuntimeException(e);

}

}

public void stopServer() {

if (server != null) {

Systemoutprintln("正在关闭h2");

serverstop();

Systemoutprintln("关闭成功");

}

}

public void useH2() {

try {

ClassforName("orgh2Driver");

Connection conn = DriverManagergetConnection(sourceURL1,user, password);

Statement stat = conncreateStatement();

// insert data

statexecute("CREATE MEMORY Table TEST(NAME VARCHAR)");

statexecute("INSERT INTO TEST VALUES('Hello World')");

//statexecute("delete mappedURL");

// use data

ResultSet result = statexecuteQuery("select name from test ");

int i = 1;

while (resultnext()) {

Systemoutprintln(i++ + ":" + resultgetString("name"));

}

resultclose();

statclose();

connclose();

} catch (Exception e) {

// TODO Auto-generated catch block

eprintStackTrace();

}

}

public void useH2i() {

try {

ClassforName("orgh2Driver");

//Connection conn = DriverManagergetConnection("jdbc:h2:" + dbDir+";AUTO_SERVER=TRUE;MVCC=TRUE",user, password);

Connection conn = DriverManagergetConnection(sourceURL2,user, password);

Statement stat = conncreateStatement();

// use data

ResultSet result = statexecuteQuery("select name from test");

以上就是关于在软件设计中遇到一个问题是从数据库中读取还是内存中读取全部的内容,包括:在软件设计中遇到一个问题是从数据库中读取还是内存中读取、数据库中数据网格内存读取是什么意思、系统磁盘快满了又要实时读取数据库数据怎么办等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9853937.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存