2017-10-10 193 views
0

它是否實現了連接池? 我相信PostgreSQL JDBC驅動程序是線程安全的,但我不確定在MYSQL上。Mysqldatasource線程安全

我想提出一個靜態對象來處理這樣的 包com.amzi.DataAccess DB連接;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; 

public class DBUtil { 
    private static MysqlDataSource dataSource = null; 

    public static MysqlDataSource getDataSource() { 
     if (dataSource == null) { 
      dataSource = new MysqlDataSource(); 
      dataSource.setUser("root"); 
      dataSource.setPassword(""); // Put your password here 
      dataSource.setUrl("jdbc:mysql://localhost:3306/user_device_table"); 
     } 
     return dataSource; 
    } 
} 

而在另一個類我創建了一個連接,看是否有記錄存在。 一旦我完成了連接,我就關閉它。

public boolean ValidateLogin(User user) { 
    boolean status = false; 
    PreparedStatement ps = null; 
    ResultSet rs = null; 
    Connection connection = null; 

    try { 
     connection = DBUtil.getDataSource().getConnection(); 
     ps = connection.prepareStatement("select * from users where user_name=? and password=?"); 
     ps.setString(1, user.getUsername()); 
     ps.setString(2, user.getPassword()); 
     rs = ps.executeQuery(); 
     status = rs.next(); 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } finally { 
     try { 
      connection.close(); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    return status; 
} 
+0

在大多數情況下(除非你使用舊版本的Tomcat),你應該使用你的應用程序服務器的配置設置數據源。這總是伴隨着連接池配置。 –

+0

@SteveC是必需的連接池嗎?假設我在本地主機上運行3個不同的筆記本電腦,但它們都連接到同一個遠程數據庫?在這種情況下需要一個池嗎? –

+0

如果您需要擴展以便您可以擁有10個,100個或1000個用戶,那麼使用連接池將有很大幫助。 –

回答

0

com.mysql.jdbc.jdbc2.optional.MysqlDataSource是一個基本的數據源。也就是說,它創建連接,但不提供連接池。

其連接創建使用基本的MySQL java.sql.Driver實現,就像使用DriverManager.getConnection會。換句話說,它與驅動程序本身一樣是線程安全的。

一般情況下,使用連接池不過是可取的。可以使用應用程序/服務器(或Tomcat)提供的功能,也可以使用專用連接池庫(例如HikariCP,DBCP等)。

+0

我的意思是DataSource是一個接口... MysqlDataSource是DataSource的一個實現。當我創建MysqlDataSource類型的對象(稱爲ds)時,當我調用ds.getConnection()時,它是否從連接池中獲得連接?當我調用ds.close()時,它是否關閉連接並將其釋放回池中? –

+0

@YusufJama請仔細閱讀我的答案,我明確指出:_「它創建連接,但不提供連接池」_。所以不,它不使用連接池。另外一個數據源沒有'close()'方法,但假設你的意思是連接,那麼否:如果直接從'MysqlDataSource'獲得,那麼調用close將關閉物理連接。 –