在具有嵌入式Derby数据库的桌面应用程序中,在应用程序的整个生命周期内,我应该保持哪些活动(而不是每次与数据库交谈时重新创建)?
Connection
和Statement
,在程序的整个生命周期中使用相同的语句?Connection
,重复重复声明?从数据库爱好者的角度来看,避免重新创建不需要重新创建的任何内容似乎是合理的,但是对于标准实践是选项1(或2)还是有一些明显的缺点? (重新)创建连接和语句是否昂贵?
答案 0 :(得分:1)
连接确实很昂贵(可能花费几百毫秒)。但是,连接的生命周期有限,语句和结果集取决于其生命周期。平均数据库将超时并在连接释放超过30分钟时断开连接。您可以在代码中添加一些超时检查器,以便它“自动”重新获取连接,但这是一项繁琐的工作,如果您不知道它应该如何工作,那么很容易出现错误。而是使用现有的,完全开发且健壮的连接池,如C3P0,并编写JDBC代码usual way(获取和在尽可能短的范围内关闭所有资源)。应该是它。
虽然在理论上(显然也在实践中)在嵌入式数据库中连接会更便宜并且连接可以永远存在,但我强烈反对在JDBC代码中以不同方式处理嵌入式数据库。它会使您的JDBC代码在语义上存在缺陷并且完全不可移植。每当您想要分发和/或更改为具有更多权力的真实RDBMS服务器时,您都必须重写/重新实现所有内容。
答案 1 :(得分:1)
在嵌入式 Derby应用程序中,Connection和Statement对象都非常便宜,我认为您不必担心在需要时创建它们。在Derby单元测试套件中,我们创建了数万个连接和数十万个语句,没有任何问题。
只要您愿意,保持Connection和Statement对象也可以。嵌入式Derby没有时间限制,并且不会删除连接或语句对象,除非您告诉它(通过关闭它们),或者除非您将它们泄露掉,在这种情况下垃圾收集器将清理它们(最终)。
虽然可以保持连接,但是当事务完成时你应该提交()除非你以自动提交模式运行。
并且,如果要保留结果集,请注意提交事务通常也会关闭结果集,而不是特意构造在提交时保持打开的特殊结果集。