在带有嵌入式Derby数据库的桌面应用程序中,在整个应用程序的整个生命周期中,我应该保持什么存活(而不是每次与数据库交谈时重新创建)?
Connection和Statement,在程序的整个生命周期中使用相同的语句?Connection,重新创建语句吗?从数据库业馀者的观点来看,避免重新创建任何不需要重新创建的东西似乎是合理的,但是选项1(或2)是违反标准实践的,还是有一些明显的缺点?创建连接和语句是否昂贵?
发布于 2010-03-10 15:27:12
在嵌入式 Derby应用程序中,连接和语句对象都相当便宜,我认为您不应该担心在需要时创建它们。在Derby单元测试套件中,我们创建了数以万计的连接和几十万条语句,没有问题。
只要您愿意,也可以将连接和语句对象保持在周围。嵌入式Derby没有时间限制,并且不会删除连接或语句对象,除非您告诉它(通过关闭它们),或者除非您泄漏它们,在这种情况下,垃圾收集器将清除它们(最终)。
尽管保持连接很好,但是当事务完成时(当然,除非您在自动提交模式下运行),您应该提交()事务。
而且,如果您在周围保留一个结果集,请注意提交事务通常也会关闭结果集,而不是专门构造在commit之间保持打开的特殊结果集。
发布于 2010-03-10 12:20:16
连接确实很昂贵(可能需要几百毫秒)。但是,连接的生存期有限,语句和结果集取决于其生存期。当连接被释放超过30分钟时,平均DB就会超时并退出连接。您可以在代码中添加一些超时检查器,以便“自动”重新获取连接,但这是一项繁琐的工作,如果您不知道它应该如何在引擎盖下工作,则很容易出现错误。而是使用现有的、完全开发的和健壮的连接池(如C3P0 ),并编写JDBC代码通常方式 (获取和,在尽可能短的范围内关闭所有资源)。应该是这样的。
虽然在理论上(显然也是在实践中),嵌入式数据库连接的成本会更低,而且连接可以永远存在,但我强烈反对在JDBC代码中以不同的方式处理嵌入式数据库。这将使您的JDBC代码在语义上有缺陷,并且完全不可移植。无论何时,只要您想要将其分发和/或更改为真正的具有更多功能的RDBMS服务器,您就必须重写/重新实现它。
https://stackoverflow.com/questions/2416692
复制相似问题