我们在各个商店运行java POS应用程序,后端为Mysql,现在我想保持商店中的数据库与服务器中的数据库同步,当商店发生一些变化时,它应该在服务器上更新.我如何实现这一目标?请帮助我
好的,我已经搜索了这个,并阅读了关于在[MySQL]数据库中存储二进制数据的几点观点.一般来说,我认为这是一个坏主意,并试图避免它,支持传统的文件传输,只是在数据库中存储对文件的引用.
但是,我正在开发一个项目,该项目需要与远程/云数据库进行数据库同步,不仅适用于文件,还适用于设置和其他用户内容.出于这个原因和其他原因,我觉得这可能是数据库中二进制存储的合适情况.
我已经为数据库同步编写了一个通用系统,它可以很好地使用Reflection和XML.我也(以我的直觉)将文件存储集成到这个系统中.再次,它运行良好 - 我将文件切换到64Kb BLOB并将它们存储在一个表中,带有file_id引用(链接到一个单独的表,其中包含元数据,如文件名/大小/ mime类型).
这使我能够在连接可用时发送碎片,并允许我限制每个请求大小以保持平稳运行.
到目前为止,我还没有发现任何问题,并已成功导入和传输超过1GB的数据(超过10-15个文件/ 16000行),但我担心它的可扩展性 - 一旦有了它会减慢20gb +数据在那里,或者MySQL可以处理它,只要我的查询结构良好?
我决定将数据存储在数据库中的另一个原因是,我认为如果空间不足,我可以简单地向MySQL添加另一个HDD /存储设备,以期有效扩展/复制/等.
我非常感谢任何观点或评论是关于这是一个好的还是坏的方法,并且我错过了我曾经在生产环境中使用过的任何明显的问题?
编辑:我忘了提一下,文件大小可以从1KB到1GB不等
[粗略]结论 首先:非常感谢那些提出了经过深思熟虑的答案的人.在这里选择接受的答案非常困难,因为每个人都有一些体面的东西可供选择.
最后(尽管我的希望),我已经决定纯粹的MySQL存储服务器充其量只是一个好的解决方案(我仍然不禁想知道为什么他们打扰包括BLOB类型).
作为替代方案,我在@Nick Coons文件系统方法和@ tadman使用轻量级键/值数据库引擎(如leveldb)的混合建议之间徘徊.如果在这个项目中使用leveldb的实用性不是问题,这很可能是我将努力的方法.
我已经在此基础上接受了tadman的回答; 他的回答对我的情况也是最适用和有用的.
话虽如此,对于那些感兴趣的人:到目前为止,我只使用MySQL获得了很多成功.我已经测试了一个存储超过15gb二进制数据的表,没有任何明显的负面影响,从大表中插入/检索数据(仔细查询).但是,我确信这仍然是非常低效的,所提到的任何替代方法都会明显更好.
据我了解,C#中内存泄漏的主要原因之一是在放置容器时无法取消注册事件侦听器.出于这个原因,每当我手动注册事件时 - 例如Timer.Elapsed += ...- 我确保Timer.Elapsed -= ...在完成对象(或父对象)时.
但是,我只是查看一个Windows窗体设计器生成的类,并注意到虽然它很乐意订阅事件(例如this.button1.Click += new System.EventHandler(this.button1_Click);),但似乎除了默认components.Dispose();操作之外没有其他清理过程.
这是否意味着Dispose()每个组件的方法应该取消注册/取消订阅已绑定到它的任何事件; 如果是这样,组件如何从其不知道的"外部"事件处理程序中注销,这是否意味着手动尝试从标准[IDisposable] Windows控件(计时器,按钮,表单等)中删除事件侦听器不必要?
谢谢
我正在尝试使用托管扩展框架(MEF)向我的C#应用程序添加插件可扩展性框架到目前为止它还可以; 我有我的主/主机应用程序从定义的文件夹加载插件,并可以从主应用程序调用他们的方法等.宿主应用程序和插件都引用了一个单独的dll程序集,其中包含所有项目通用的接口.
这工作正常,我可以从主应用程序调用/与插件交互.不过,我也希望能够与宿主应用程序进行交互,从插件中,但似乎无法了解如何完成此操作.
我希望能够从我的插件中获取/设置/执行主应用程序中的导出属性和方法.目前我只能从主应用程序"说出"插件,而不是相反.
我的代码到目前为止:
接口DLL
namespace MefContracts
{
[InheritedExport]
public interface IPlugin
{
String DoWork();
}
public class Class1
{
public IPlugin plugin { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
主要/主机应用程序
namespace MyMEF
{
class clsMEF
{
private CompositionContainer _container;
[Import(typeof(MefContracts.IPlugin))]
public MefContracts.IPlugin plugin;
public clsMEF()
{
Compose();
}
void Compose()
{
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new DirectoryCatalog("..\\..\\Extensions"));
_container = new CompositionContainer(catalog);
try
{
this._container.ComposeParts(this);
}
catch (CompositionException compositionException)
{
Console.WriteLine(compositionException.ToString());
}
}
} …Run Code Online (Sandbox Code Playgroud) 在下面的代码中,a Timer在函数内声明,它也订阅了Elapsed事件:
void StartTimer()
{
System.Timers.Timer timer = new System.Timers.Timer(1000);
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
timer.AutoReset = false;
timer.Start();
}
Run Code Online (Sandbox Code Playgroud)
一旦函数完成,对该函数的引用Timer就会丢失(我推测).
Elapsed事件是否在对象被销毁时自动取消注册,如果没有,事件可以在Elapsed事件本身中取消注册:
void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
var timer = (System.Timers.Timer)sender;
timer.Elapsed -= timer_Elapsed;
}
Run Code Online (Sandbox Code Playgroud)
这种方法是否仍允许正确清理对象,或者为什么定时器永远不会在函数的本地范围内声明?
首先,对不起,如果这被认为是重复 - 我知道这是一个共同的话题,但我看了,但没有找到一个满意的答案.
有很多的问问题时要使用IDisposable,但一切我读过,我只是不明白为什么你不会在你的每类实现它.有什么可失去的?它是否有很大的性能影响?
我理解的部分原因IDisposable是它所做的一件事是:
Dispose()对象拥有的其他IDisposable.原谅我的无知,但这只适用于给定对象的字段/属性,还是也扩展到在其方法中创建的对象?
例如,如果a Font是在实现的类中的方法内创建的IDisposable,但是Font没有使用using块初始化,或者.Dispose()在方法的末尾显式地创建; 当它的IDisposable父母/班级被GCd /处置时会被处置吗?否则,Font永远不会被处置?
我并不是要离题,但如果确实这样做会像这样"抓住一切"(有效地处理任何IDisposable本来不会留下的错误的儿童对象),那么单凭这个理由不足以证明这一点.总是IDisposable尽可能地实施?