首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >java中的变量重用

java中的变量重用
EN

Stack Overflow用户
提问于 2016-02-11 21:35:32
回答 4查看 4.3K关注 0票数 2

在一个用Java语言处理SQL事务的类中,我发现自己一直在使用类PreparedStatement和ResultSet。

我好奇地想知道在Java中什么是更好(更有效)的实践;将它们声明为类的成员……

代码语言:javascript
复制
class SqlThingy {
    PreparedStatement pstx;
    ResultSet rs;
    public void SqlThingyMethod() {
         pstx = database.connection.prepareStatement("...");
         ....
    }
}

..。或者作为单个方法的局部变量?

代码语言:javascript
复制
class SqlThingy {
    public void SqlThingyMethod() {
        PreparedStatement pstx;
        ResultSet rs;
        pstx = database.connection.prepareStatement("...");
    }
}

VM只是用新的prepared语句覆盖类成员的内容(引用),还是会做一些额外的初始化,这也会占用资源,并消除每次分配局部变量的差异?

EN

回答 4

Stack Overflow用户

发布于 2016-02-11 21:49:51

一定要区分变量和它们所指向的对象。一般来说,不要重用变量来指向不同的对象。这是非常容易出错的。

在您的特定示例中,由于您是在每次调用SqlThingyMethod时重新创建connection对象,因此将其存储在字段中可能没有任何好处。使用局部变量。

变量很便宜。对象即使不是非常昂贵,也不是很便宜。在这种情况下,对象的开销可能很大,但变量的开销却不大。

票数 2
EN

Stack Overflow用户

发布于 2016-02-11 21:41:08

您的实例变量pstx只是一个包含引用的插槽。您并没有真正重用同一个对象,您只是保留了一个过时的引用,直到另一个方法调用出现并覆盖它。

PreparedStatement和ResultSet是从数据库连接创建的,如果您获得一个新的数据库连接,则还必须获得一个新的PreparedStatement。您不能跨连接重用PreparedStatement或ResultSet。

为PreparedStatements和ResultSets使用本地变量,并在完成后将其关闭:获取连接,执行操作,并在退出方法的过程中关闭所有的jdbc资源。让这些对象停留的时间超过绝对必要的时间不会对您有任何好处,而且会阻止数据库服务器资源尽可能快地被释放。

唯一可用的优化是,如果您使用相同的连接执行重复的操作,那么为所有操作保留相同的PreparedStatement实例是有意义的,这样数据库服务器就可以准备和重用该sql。

您没有说明在什么上下文中编写这段代码。对于web应用程序,您需要一个连接池,如果对web应用程序中的所有查询重用相同的连接,请参阅Is there a reason for never closing a JDBC connection?

票数 1
EN

Stack Overflow用户

发布于 2016-02-11 21:42:04

将变量的作用域限制在您将使用的最小范围内被认为是一个很好的实践。在这种情况下,尽管您将重用变量,但要考虑到变量将引用对象,例如,ResultSet将引用查询的结果。如果您让变量落入作用域之外(您将其声明为本地变量),则引用的值(及其填充的内存)将准备由GC收集。如果你让它作为一个类变量,时间会过去,你的内存会一直被这个变量引用,所以它不会被释放,直到你的"SqlThingy“类实例超出作用域。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35340800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档