2014-10-06 27 views
2

我對下面的課程有幾個問題。爲什麼sql連接在新線程中創建?

public class Test { 
    public void run() throws SQLException { 
     Connection conn = getConnection(); 
     DSLContext create = DSL.using(conn, SQLDialect.MYSQL); 

     // query books for author named 'selena' 
     Result<Record2<Long, String>> result = create 
       .select(BOOK.ID, BOOK.TITLE).from(BOOK).join(BOOK_AUTHOR_REL) 
       .on(BOOK_AUTHOR_REL.BOOKID.equal(BOOK.ID)).join(AUTHOR) 
       .on(BOOK_AUTHOR_REL.AUTHORID.equal(AUTHOR.ID)) 
       .where(AUTHOR.NAME.equal("selena")) 
       .orderBy(BOOK.TITLE.asc(), BOOK.ID.asc()).fetch(); 
     result.forEach((r) -> { 
      System.out.println(String.format("%s (id: %s)", 
        r.getValue(BOOK.TITLE), r.getValue(BOOK.ID))); 
     }); 
     conn.close(); 
     System.exit(0); 
    } 

    public static void main(final String[] args) throws SQLException { 
     new Test().run(); 
    } 

    private Connection getConnection() { 
     try { 
      Class.forName(System.getProperty("jdbc.driver")).newInstance(); 
      return DriverManager.getConnection(System.getProperty("jdbc.url"), 
        System.getProperty("jdbc.user"), 
        System.getProperty("jdbc.password")); 
     } catch (InstantiationException | IllegalAccessException 
       | ClassNotFoundException | SQLException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 
  1. 爲什麼新的連接得到一個新的線程產生的?爲什麼我們把它叫做void run而不是屬於類實例的其他方法?
  2. 爲什麼字符串參數final在這裏?

    public static void main(final String[] args) throws SQLException { 
        new Test().run(); 
    } 
    
  3. 關閉連接後,爲什麼要撥打System.exit()

    conn.close(); 
        System.exit(0); 
    
+3

是什麼讓你覺得有多個線程參與? 'run'只是一種方法......對於第二個問題,這可能只是作者的首選風格。對於第三個問題......沒有真正的理由在這裏調用'System.exit(0)'......你爲什麼不問作者? – 2014-10-06 17:11:28

回答

2

它不是一個新的線程創建的。爲了在新線程中調用它,Test必須實現Runnable(或擴展Thread)。假設測試已經實現了Runnable,那麼將會有一行如new Thread(new Test()).start();

有一個約定,方法的參數不應該被修改。使用final可以防止這種情況發生,但這裏沒有必要,因爲在調用main之後,JVM不會對args做任何事情。還要注意,使數組最終不會使其內容不可修改。

這裏不需要調用System.exit。代碼完成執行,JVM將在沒有更多代碼運行時終止。 System.exit突然殺死了JVM。

這不是偉大的代碼。具有的getConnection捕獲異常並返回null是不好的風格(因爲程序不知道連接的其餘部分爲空,並會嘗試訪問它,導致一個NullPointerException),它可以被更改爲:

private Connection getConnection() throws SQLException { 
    return DriverManager.getConnection(System.getProperty("jdbc.url"), 
      System.getProperty("jdbc.user"), 
      System.getProperty("jdbc.password")); 
} 

Class.forName對於類型4的jdbc驅動程序是不必要的,調用newInstance不會執行任何有用的操作。

此外,如果拋出異常,連接不會關閉,服務器端的連接將會超時。

這是用於演示DSL類的管道代碼。我不會太擔心。

+0

謝謝Nathan,在你最後的筆記上。該方法應該返回什麼?你可以改變方法,並告訴我最好的方法.. – UnderTaker 2014-10-06 17:42:03

+0

@UnderTaker:它可以拋出SQLException。使用類型4的jdbc驅動程序,您甚至不再需要Class.forName。 – 2014-10-06 17:54:18

3

這是錯誤的代碼。不要使用它。

它們沒有正確關閉資源。

這是不可能的寫入連接池。

我會將該Connection傳遞給構造函數並初始化一個私有數據成員,以便run()方法可以訪問它。

我看不出有任何理由來調用System.exit(0)。更深思熟慮的東西。

相關問題