2017-07-11 66 views
2

是否有一個明顯的區別,在性能方面,在這三種情況下,從ResultSet中讀取數據時:JDBC結果鑄造成本

1.

String name = resultSet.getString(1); 
user.name = name; 

2.

Object name = resultSet.getObject(1); 
user.name = (String)name; 

3 。

String name = resutlSet.getObject(1, String.class); 
user.name = name; 

這些方法是否相似並且是相同的演員?或者當類型提供的JDBC內部優化轉換?哪三個性能最好?

+0

爲什麼不去'user.name = resultSet.getString(1);'? – XtremeBaumer

+0

它更像是一個可讀性問題,然後性能問題 –

+0

#3無法編譯。只有#2是演員。沒有任何理由使用* any這些優先於'user.name = resultSet.getString(1)'。 – EJP

回答

2

ResultSet是界面,你必須看看你的jdbc驅動程序提供的確切實現。

但我想大多數實現使用相同的邏輯。

  1. resultSet.getObject(1) - 最壞的情況。爲了識別結果類型,駕駛員必須檢查所有可能的類型。

  2. resutlSet.getObject(1, String.class)在這種情況下,驅動程序將按類別切換並確定正確的類型。這將比前一個更好,但仍不是最佳。

  3. resultSet.getString(1) - 最優的一個。驅動程序已經知道該類型,它不會執行任何過濾。

2

ResultSet#getObject()的源代碼看起來是這樣的:

public Object getObject(int columnIndex) throws java.sql.SQLException { 
    // ... 
    switch (field.getSQLType()) { 
     case Types.CHAR: 
     case Types.VARCHAR: 
     case Types.LONGVARCHAR: 
      return getString(columnIndex); 
    } 
} 

換句話說,在一列是一個文本類型將只需要調用getString()引擎蓋下調用getObject()。換句話說,在JDBC方面,我希望你所有的三種場景的表現都相當類似。關於在您的Java代碼中從ObjectString的額外演員,我認爲這是一個相對較小的差異。當然,如果你可以避免演員,你可能會想要這樣做。